正在寻找一个更好的过程来删除远程计算机上的文件夹
本文关键字:删除 过程 文件夹 计算机 更好 寻找 一个 | 更新日期: 2023-09-27 18:26:42
我正在开发一个小实用程序,它可以从域机器中删除旧的用户配置文件。
基本上,我一直在寻找一个更好的过程来删除远程目录。
我知道我可以使用System.IO并从UNC路径中删除它,但我对网络删除的性能不满意。删除中等大小的配置文件可能需要数小时,如果有几十或数百个配置文件或机器,这是不可行的解决方案。
所以这似乎是不可能的
我能找到的最好的方法似乎是PSExec调用,但我想要一些有管理的东西。
是否有任何.NET类可以调用远程机器来完成目录的删除,而不是依赖于调用机器?
如果您的客户端计算机没有检测到这是一种病毒,您可以使用它在网络计算机上执行远程命令,包括删除文件夹:
PsExec v1.98
简介
Telnet等实用程序和Symantec的PC等远程控制程序Anywhere允许您在远程系统上执行程序,但它们可以是设置和要求在要访问的远程系统。PsExec是一个轻量级telnet替换,允许您在其他系统上执行进程,具有控制台应用程序的完全交互性必须手动安装客户端软件。PsExec最强大的用途包括在远程系统上启动交互式命令提示和远程启用工具,如IpConfig,否则没有显示远程系统信息的能力。
我不知道它是怎么工作的。在.NET代码中,其想法是将RPC调用发送到您控制的远程应用程序,只要您已经在目标计算机上运行了所述应用程序,这就足够容易了。所使用的机制将是.NET远程处理或WCF。
受这个答案的启发,我做了一些小修改。我无法让它运行100%托管,因为当我尝试从代码本身中运行rd
-命令时,会得到错误代码9(The storage control block address is invalid
)。
在我的小型测试设置中,基本功能速度快得惊人,但考虑到你否决了"你确定吗?"提示,如果你指定了错误的路径,这也是相当危险的,所以在进行时要戴上安全帽:
如果您在任何命令shell中执行echo Y | rd /S c:'Temp'test
,您将很快删除C:''Temp''Test及其以下的任何内容,并且不会发出任何警告。
但是直接在代码中执行这个解决方案是行不通的。因此,我的快速解决方案是在机器上放置一个bat文件(称为DeleteTest.bat
),只包含这一行,然后通过WMI执行bat文件。
在我的小测试中,它在大约一秒钟内删除了大约900个文件,总共大约200 mb
此外,除了引用的答案外,我还得到了返回代码,所以我的完整代码变成了:
var processToRun = new[] { "c:''Temp''DeleteTest.bat" };
var connection = new ConnectionOptions();
connection.Username = "me";
connection.Password = "password";
var wmiScope = new ManagementScope(String.Format("''''{0}''root''cimv2", "MyRemoteMachine"), connection);
var wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
var result = wmiProcess.InvokeMethod("Create", processToRun);
Console.WriteLine(
"Creation of process returned: " + result);
很明显,您还需要生成bat文件(通过代码或预生成)并将其复制到目的地,但这应该很简单。