我正在使用 .NET,并疯狂地尝试找到任何有用的 API,让我可以通过 LAN 网络传输文件(当然是通过管理员凭据),然后在该计算机上执行它。
我读过一些使用 WMI 的内容,但谷歌搜索“.net WMI 复制文件”或“.net WMI 执行文件”对我根本没有帮助。
任何参考将不胜感激。
EDIT
我无法使用 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 文件并将其分成多个块发送 - 只需记住 > 管道到新文件或覆盖现有文件并 >> 附加或添加到现有文件。
- 您还需要发出 del 命令来清理 base64 文件 - 根据可用空间,您可能需要进行第二次 WMI 调用来调用它。
就我而言,我不想一次发送 7000 个字符的完整 2MB 文件,因此我创建了一个简单的 .net 下载器,该下载器编译为小于 6KB 并将其全部放入单个语句中(如上所述)。下载我的可执行文件,完成后(当我看到我想要的文件时,通过 WMI 查询)我只需通过 WMI 删除它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)