【问题标题】:Looking for a better process to delete folders on remote computers寻找更好的过程来删除远程计算机上的文件夹
【发布时间】:2013-08-09 01:00:21
【问题描述】:

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

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

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

So this appears to be out of the question

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

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

【问题讨论】:

  • @RobertHarvey 谢谢,这正是我想避免使用常见 Directory.Delete() 方法和任何其他远程删除的原因。我想远程调用远程机器来执行操作。希望这是有道理的。一次 200 多台机器和超过 1GB 的多个配置文件真的加起来了!
  • 您是否考虑过在 cmd-shell 中生成一个进程来执行 rd /s
  • 为什么你想要管理一些东西?为什么这需要是一个 .NET 类?
  • @AndersUP 如果我可以在远程 PC 上完成,是的,这很棒

标签: c# windows file-io remote-server


【解决方案1】:

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

PsExec v1.98

简介

Telnet 等实用程序和赛门铁克 PC 等远程控制程序 Anywhere 允许您在远程系统上执行程序,但它们可以是 设置很痛苦,并且要求您在服务器上安装客户端软件 您希望访问的远程系统。 PsExec 是一个轻量级的 telnet-replacement,可让您在其他系统上执行进程, 完成与控制台应用程序的完全交互,无需 必须手动安装客户端软件。 PsExec 最强大的 用途包括在远程系统上启动交互式命令提示符 和远程启用工具,如 IpConfig,否则没有 能够显示有关远程系统的信息。

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

【讨论】:

  • 是的,我可以,但仍有一些问题。 (在我的 PSExec OP 中也提到过)一个是 PsExec 需要 PC 上的一个实例,为每次删除调用它......虽然第 2 点让我很感兴趣。我假设我可以将可执行文件推送到机器上,使用远程处理/WCF,也许还有一个套接字来实时报告给“服务器”或调用机器......可能比我希望的更多,但优势可能值得。
  • PsExec 页面显示它不需要在目标计算机上运行客户端程序。
  • 不,它没有,但我正在考虑将 PsExec 之类的东西写入 .NET 实用程序。 PsExec 也有一个非常有趣的 EULA,我们广泛使用它,但我不想担心它以后会被误读和违反 EULA
【解决方案2】:

this answer 的启发,我做了一些小的修改。我无法让它运行 100% 托管,因为当我尝试从代码本身运行 rd-command 时收到错误代码 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 文件(通过代码或预生成)并将其复制到目的地,但这应该是微不足道的。

【讨论】:

  • 是的,批处理文件肯定是微不足道的,看起来它也有潜力。
猜你喜欢
  • 1970-01-01
  • 2012-08-25
  • 2010-09-18
  • 2012-07-09
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多