.NET – 将可执行文件跨LAN复制到另一台计算机并执行它

我正在使用.NET,并且疯狂地试图找到任何有用的API,它允许我通过LAN网络传输文件(当然通过管理员凭据),然后在该机器上执行它。

我已经阅读了一些使用WMI的东西,但谷歌搜索“.net WMI复制文件”或“.net WMI执行文件”并没有帮助我。

任何参考将不胜感激。

编辑

我不能使用像PsExec这样的第三方工具(虽然它完全符合我的要求)。 这是因为PsExec涉及的许可证我不能用我的应用程序分发它。

我不认为这很容易实现。 但是,您可以使用.net复制exe。 然后(也来自.net,使用Process.Start )调用psExec并使其远程执行程序。

我知道这已经有好几年了,但遇到了这个挑战并且在这篇文章(以及其他内容)中出现了,所以要分享解决方案以防止任何人前进。 它可用于通过WMI移动您想要的任何文件。

解:

1:将EXE转换为Base64

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

2:通过WMI Echo 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); 

现在,有一些需要突出的问题

  • 传递的整个命令的长度不能超过8191个字符,即命令的最大长度
  • 您可以分解base64文件并以多个块发送它 – 只需记住>管道到新文件或覆盖现有文件,>>追加或添加到现有文件。
  • 您还需要发出del命令来清理base64文件 – 根据可用空间,您可能需要进行第二次WMI调用来调用它。

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

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

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