我正在使用 .NET,疯狂地试图找到任何有用的 API,让我通过 LAN 网络传输文件(当然是通过管理员凭据),然后在该机器上执行它。
我读过一些使用 WMI 的东西,但是谷歌搜索“.net WMI 复制文件”或“.net WMI 执行文件”对我一点帮助都没有。
如有任何引用,我们将不胜感激。
编辑
我不能使用 PsExec 等第三方工具(尽管它可以完美满足我的需要)。这是因为涉及 PsExec 的许可证,我无法将其与我的应用程序一起分发。
最佳答案
我知道已经有好几年了,但遇到了这个挑战并看到了这篇文章(以及其他文章),所以要分享解决方案以防它帮助任何人前进。它可用于通过 WMI 移动您想要的任何文件。
解决方案:
1:EXE转Base64
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);
现在,有一些陷阱需要强调
- 传递的整个命令的长度不能超过8191个字符,这是一个命令的最大长度
- 您可以分解 base64 文件并将其分成多个 block 发送 - 请记住 > 通过管道传输到新文件或覆盖现有文件并 >> 追加或添加到现有文件。
- 您还需要发出一个 del 命令来清理 base64 文件 - 根据可用的房间,您可能必须进行第二次 WMI 调用才能调用它。
在我的例子中,我不想一次发送 7000 个字符的完整 2MB 文件,所以我创建了一个简单的 .net 下载器,它编译到小于 6KB 并将它全部放在一个语句中(如上所述.) 它下载我的可执行文件,完成后(当我看到我想要的文件时,通过 WMI 查询)我只是通过 WMI 删除它。
关于c# - .NET - 通过 LAN 将可执行文件复制到另一台计算机并执行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3718546/