Как выполнить команду на удаленном компьютере?
У меня есть общая папка на сервере, и мне нужно удаленно выполнить команду для некоторых файлов. Как мне это сделать?
Какие службы должны выполняться на сервере, чтобы сделать эту работу?
Некоторые детали: Можно использовать только С#. На сервере ничего не может быть установлено.
Ответы
Ответ 1
Другое решение - использовать WMI.NET или инструментарий управления Windows.
Используя пространство имен .NET Framework System.Management, вы можете автоматизировать административные задачи с помощью инструментария управления Windows (WMI).
Пример кода
using System.Management;
...
var processToRun = new[] { "notepad.exe" };
var connection = new ConnectionOptions();
connection.Username = "username";
connection.Password = "password";
var wmiScope = new ManagementScope(String.Format("\\\\{0}\\root\\cimv2", REMOTE_COMPUTER_NAME), connection);
var wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
wmiProcess.InvokeMethod("Create", processToRun);
Если у вас проблемы с аутентификацией, проверьте конфигурацию DCOM.
- На целевом компьютере запустите
dcomcnfg
из командной строки.
- Разверните
Component Services\Computers\My Computer\DCOM Config
- Найдите инструкцию по управлению Windows, идентифицированную с помощью GUID
8BC3F05E-D86B-11D0-A075-00C04FB68820
(вы можете увидеть это в подробном представлении).
- Отредактируйте свойства и затем добавьте имя пользователя, с которым вы пытаетесь войти, на вкладке разрешений.
- Вам может потребоваться перезагрузить службу или весь компьютер.
ПРИМЕЧАНИЕ. Все пути, используемые для удаленного процесса, должны быть локальными по отношению к целевому компьютеру.
Ответ 2
Вы можете использовать SysInternal PsExec.
Ответ 3
ИМО, в вашем случае вы можете попробовать следующее:
- Сопоставьте общую папку с диском или папкой на вашем компьютере. (здесь как)
- Доступ к сопоставленному диску/папке, как обычно, локальным файлам.
Ничего не нужно устанавливать. Не нужно запускать службы, кроме тех, которые разрешают совместное использование папок.
Если вы можете получить доступ к общей папке и отобразить ее на своем компьютере, большинство вещей должно работать так же, как и локальные файлы, включая командные строки и все инструменты для улучшения проводника.
Это отличается от использования PsExec (или RDP-in) в том, что вам не нужно иметь права администратора и/или права на подключение к удаленному рабочему столу/терминалу на удаленном сервере, вам просто нужно иметь доступ к этим общие папки.
Также убедитесь, что у вас есть все необходимые разрешения безопасности для запуска любых команд/инструментов, которые вы хотите запустить в этих общих папках.
Если, однако, вы хотите, чтобы обработка выполнялась на целевой машине, вы можете попробовать PsExec как @divo и @recursive point, что-то вместе:
PsExec \\yourServerName -u yourUserName cmd.exe
Что принесет, вы получите командную строку на удаленном компьютере. И оттуда вы можете выполнять все, что хотите.
Я не уверен, но я думаю, вам нужен либо сервер (lanmanserver
), либо служба служб терминалов (TermService
), которая должна быть запущена (что должно быть уже запущено).
Ответ 4
try
{
string AppPath = "\\\\spri11U1118\\SampleBatch\\Bin\\";
string strFilePath = AppPath + "ABCED120D_XXX.bat";
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = strFilePath;
string pwd = "s44erver";
proc.StartInfo.Domain = "abcd";
proc.StartInfo.UserName = "sysfaomyulm";
System.Security.SecureString secret = new System.Security.SecureString();
foreach (char c in pwd)
secret.AppendChar(c);
proc.StartInfo.Password = secret;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.WorkingDirectory = "psexec \\\\spri11U1118\\SampleBatch\\Bin ";
proc.Start();
while (!proc.HasExited)
{
proc.Refresh();
// Thread.Sleep(1000);
}
proc.Close();
}
catch (Exception ex)
{
throw ex;
}
Ответ 5
Я использую небольшую утилиту, которая поставляется с PureMPI.net под названием execcmd.exe
. Его синтаксис выглядит следующим образом:
execcmd \\yourremoteserver <your command here>
Не получается проще:)