我正在使用一个小工具来删除域计算机中的旧用户配置文件。
基本上,我遇到的问题是寻找一个更好的删除远程目录的过程。
我知道我可以使用System.IO并从UNC路径中删除它,但我对网络删除的性能不满意。删除中等大小的配置文件可能需要数小时,如果有数十个或数百个配置文件或计算机,则这不可行作为解决方案。
So this appears to be out of the question
我能找到的最好的似乎是PSExec调用,但我想要管理一些东西。
是否有任何.NET类可以调用远程机器来完成目录的删除而不是依赖于调用机器?
答案 0 :(得分:1)
如果客户端计算机未将此检测为病毒,则可以使用它在网络计算机上执行远程命令,包括删除文件夹:
<强>简介强>
像Telnet这样的实用程序和Symantec的PC等远程控制程序 Anywhere允许您在远程系统上执行程序,但它们可以是一个 设置的痛苦,并要求您在上安装客户端软件 您希望访问的远程系统。 PsExec重量轻 telnet替换,允许您在其他系统上执行进程, 完整的控制台应用程序的完全交互性,没有 必须手动安装客户端软件。 PsExec最强大 用途包括在远程系统上启动交互式命令提示 和IpConfig等远程启用工具,否则没有 能够显示有关远程系统的信息。
我不知道它是如何运作的。在.NET代码中,想法是将RPC调用发送到您控制的远程应用程序,如果已经在目标计算机上运行了所述应用程序,这很容易。使用的机制是.NET Remoting或WCF。
答案 1 :(得分:1)
受this answer的启发,我做了一些小修改。我无法让它运行100%托管,因为当我尝试从代码本身运行The storage control block address is invalid
- 命令时,我收到错误代码9(rd
)。
在我的小型测试设置中基本功能非常快,但考虑到你否决了“你确定吗?”提示,如果你指定错误的路径也是相当危险的,所以在你继续时戴上你的安全帽:
如果你在任何命令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文件(通过代码或预生成)并复制到目标,但这应该是微不足道的。