.NET - Копирование исполняемого файла через локальную сеть на другой компьютер и его выполнение
Я использую.NET и схожу с ума, пытаясь найти какой-нибудь полезный API, который позволяет мне передавать файл по сети LAN (конечно, через учетные данные администратора), а затем запускать его на этом компьютере.
Я кое-что прочитал с помощью WMI, но поиск в Google для ".net WMI copy files" или ".net WMI execute files" мне совсем не помогает.
Любые ссылки будут с благодарностью.
РЕДАКТИРОВАТЬ
Я не могу использовать сторонний инструмент, такой как PsExec (хотя он отлично делает то, что мне нужно). Это из-за лицензии, связанной с PsExec, я не могу распространять ее с моим приложением.
4 ответа
Я не думаю, что это легко достигается. Однако вы можете скопировать exe с помощью.net. А потом (тоже из.net, с Process.Start
) вызвать psExec и заставить его выполнять программу удаленно.
Я знаю, что это были годы, но столкнулся с этой проблемой и наткнулся на этот пост (среди прочего), поэтому собираюсь поделиться решением в случае, если оно поможет любому двигаться вперед. Его можно использовать для перемещения любого файла по 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.
Можно рассмотреть возможность использования службы планировщика (команда AT) для запуска приложения (см. http://msdn.microsoft.com/en-us/library/aa384006.aspx) после того, как код приложения будет скопирован на удаленный компьютер.
На компьютерах, на которых не включено удаленное взаимодействие PowerShell 2.0, инструмент командной строки PsExec очень полезен. Требуются разрешения администратора на удаленной машине.