Я знаю, что это были годы, но столкнулся с этой проблемой и наткнулся на этот пост (среди прочего), поэтому собираюсь поделиться решением в случае, если оно поможет любому двигаться вперед.Его можно использовать для перемещения любого файла по WMI.
Решение:
1: конвертировать EXE в Base64
byte[] bytes = File.ReadAllBytes(pathToExe);
String file = Convert.ToBase64String(bytes);
2: эхо Base64 в файл через WMI и декодировать с помощью 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, чтобы вызвать его.
В моем случае я не хотел отправлять полный 2-мегабайтный файл по 7000 символов за раз, поэтому я создал простой загрузчик .net, скомпилированный до размера менее 6 КБ, и поместил все это водиночное утверждение (как указано выше). Оно загружает мой исполняемый файл, и когда оно завершается (когда я вижу нужный файл, запрашиваемый через WMI), я просто удаляю его через WMI.