代码之家  ›  专栏  ›  技术社区  ›  Luca Matteis

.NET-将一个可执行文件跨局域网复制到另一台计算机,然后执行它

  •  5
  • Luca Matteis  · 技术社区  · 15 年前

    4 回复  |  直到 8 年前
        1
  •  1
  •   Klaus Byskov Pedersen    15 年前

    Process.Start psExec

        2
  •  3
  •   Robert MacMillan    8 年前

    byte[] bytes = File.ReadAllBytes(pathToExe);
    String file = Convert.ToBase64String(bytes);
    

    2:通过wmi将base64回送到文件,并使用certutil进行解码

    ConnectionOptions co = new ConnectionOptions();
    
    // isLocal is a variable indicating whether machine name/IP is local    
    if (!isLocal) {  
        co.Username = "domainOrMachine\accountName";
        co.Password = "password for account";
        co.EnablePrivileges = true; 
        co.Impersonation = ImpersonationLevel.Impersonate;
    }
    
    //ip is a vaiable holding the target endpoint
    ManagementScope s = new ManagementScope(@"\\" + ip + @"\root\cimv2", co);
    s.open();
    
    ObjectGetOptions ogo = new ObjectGetOptions();
    ManagementClass prog = new ManagementClass(s, new 
    ManagementPath("Win32_Process"), ogo);
    ManagementBaseObject mbo = prog.GetMethodParameters("Create");
    
    mbo["CommandLine"] = @"cmd /c ""echo " + base64String + @" > c:\windows\temp\b64_exec.txt && certutil -decode c:\windows\temp\b64_exec.txt c:\windows\temp\b64_exec.exe && c:\windows\temp\b64_exec.exe""";
    
    prog.InvokeMethod("Create", mbo, null);
    

    现在,有一些gotcha需要突出显示

    • 传递的整个命令的长度不能超过8191个字符,这是命令的最大长度
    • 您可以拆分base64文件并将其发送到多个块中-只需记住,>管道连接到新文件或覆盖现有文件,然后>>追加或添加到现有文件。
    • 您还需要发出del命令来清理base64文件-根据可用的空间,您可能需要再次调用wmi来调用它。

    在我的例子中,我不想一次发送一个完整的2MB文件7000个字符,所以我创建了一个简单的.NET下载程序,它编译到小于6KB,并将其全部转换成一个语句(如上所述)。它下载了我的可执行文件,当完成时(当我看到我想要的文件,通过WMI查询),我只是通过WMI删除它。

        3
  •  0
  •   kbrimington    15 年前

    在没有的机器上 PowerShell 2.0 remoting 启用后,我发现 PsExec 命令行工具非常有用。它需要远程计算机上的管理权限。

        4
  •  0
  •   Oleg    15 年前

    你可以考虑使用 Scheduler 启动应用程序的服务(按命令)(请参见 http://msdn.microsoft.com/en-us/library/aa384006.aspx )将应用程序代码复制到远程计算机之后。