.NET - Копирование исполняемого файла через локальную сеть на другой компьютер и его выполнение - PullRequest
5 голосов
/ 15 сентября 2010

Я использую .NET и схожу с ума, пытаясь найти какой-нибудь полезный API, который позволяет мне передавать файл по сети LAN (конечно, через учетные данные администратора) и затем запускать его на этом компьютере.

Я кое-что прочитал с помощью WMI, но поиск в Google для «.net WMI copy files» или «.net WMI execute files» мне совсем не помогает.

Любые ссылки будут очень благодарны.

EDIT

Я не могу использовать сторонний инструмент, такой как PsExec (хотя он отлично выполняет то, что мне нужно).Это из-за лицензии, связанной с PsExec, я не могу распространять ее с моим приложением.

Ответы [ 4 ]

3 голосов
/ 24 октября 2017

Я знаю, что это были годы, но столкнулся с этой проблемой и наткнулся на этот пост (среди прочего), поэтому собираюсь поделиться решением в случае, если оно поможет любому двигаться вперед.Его можно использовать для перемещения любого файла по 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.

1 голос
/ 15 сентября 2010

Я не думаю, что это легко достигается.Однако вы можете скопировать exe с помощью .net.А затем (также из .net с Process.Start) вызовите psExec и заставьте его выполнить программу удаленно.

0 голосов
/ 21 сентября 2010

Можно рассмотреть возможность использования службы Scheduler (AT-команда) для запуска приложения (см. http://msdn.microsoft.com/en-us/library/aa384006.aspx) после копирования кода приложения на удаленный компьютер.

0 голосов
/ 15 сентября 2010

На компьютерах, на которых не PowerShell 2.0 удаленное взаимодействие включено, инструмент командной строки PsExec очень полезен. Требуются разрешения администратора на удаленной машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...