c# - .NET - 通过 LAN 将可执行文件复制到另一台计算机并执行它

标签 c# .net wmi

我正在使用 .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/

相关文章:

python - 使用 Pylons 和 WMI 时出现 "Win32 exception occurred releasing IUnknown at..."错误

c++ - 来自 C++ 的 WMI 调用导致 HRESULT=0x80041003

c# - 为什么我必须指定所有泛型类型参数?

c# - 如何使用 MathNet.Symbolics 简化公式?

.net - 将数据从 sqlite 复制到 SQL Server

c# - ASP MVC 5 路由映射

c# - 如何将 SqlBulkCopy 与 DataTable 中的二进制数据 (byte[]) 一起使用?

c# - .net 中是否有 128 或 256 位双类?

c# - 从 Java 应用程序调用 C# dll

c# - 从 WMI 运行 exe 时的网络身份验证