3

我正在开发一个小型实用程序,可以从域机器中删除旧的用户配置文件。

基本上,我被困的地方是寻找一个更好的过程来删除远程目录。

我知道我可以使用 System.IO 并将其从 UNC 路径中删除,但我对网络删除的性能不满意。删除中型配置文件可能需要数小时,如果有数十或数百个配置文件或机器,这作为解决方案不可行。

所以这似乎是不可能的

我能找到的最好的似乎是 PSExec 调用,但我想要一些管理的东西。

有没有.NET类可以调用远程机器完成目录的删除,而不是依赖调用机器?

4

2 回答 2

1

这个答案的启发,我做了一些小的修改。我无法让它运行 100% 托管,因为The storage control block address is invalid当我尝试rd从代码本身运行 -command 时收到错误代码 9 ( )。

在我的小型测试设置中,基本功能非常快,但鉴于您否决了“您确定吗?” 提示,如果你指定了错误的路径也是相当危险的,所以在你继续的时候戴上你的安全帽:

如果您echo Y | rd /S c:\Temp\test在任何命令 shell 中执行,您将很快删除 C:\Temp\Test 及其下方的任何内容,并且不会发出警告。

但是直接在代码中执行这个解决方案是行不通的。所以我的快速解决方法是在DeleteTest.bat机器上放置一个 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 文件(通过代码或预生成)并将其复制到目的地,但这应该是微不足道的。

于 2013-08-08T09:16:43.877 回答
1

如果您的客户端计算机没有将其检测为病毒,您可以使用它在网络计算机上执行远程命令,包括删除文件夹:

PsExec v1.98

介绍

Telnet 等实用程序和赛门铁克 PC Anywhere 等远程控制程序可让您在远程系统上执行程序,但设置起来可能很麻烦,并且需要您在希望访问的远程系统上安装客户端软件。PsExec 是一个轻量级的 telnet 替代品,可让您在其他系统上执行进程,并与控制台应用程序完全交互,而无需手动安装客户端软件。PsExec 最强大的用途包括在远程系统上启动交互式命令提示和远程启用工具(如 IpConfig),否则它们无法显示有关远程系统的信息。

我不知道它是如何工作的。在 .NET 代码中,想法是将 RPC 调用发送到您控制的远程应用程序,这很容易,前提是您已经说过在目标计算机上运行的应用程序。使用的机制是 .NET Remoting 或 WCF。

于 2013-08-08T03:59:01.517 回答