.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 )。