Запустите процесс с WMI на удаленном компьютере из общего ресурса на другом удаленном компьютере. - PullRequest
4 голосов
/ 27 января 2012

У меня есть следующий код для запуска процесса на удаленном компьютере из общего ресурса на втором удаленном компьютере, как описано на рисунке:

Соединение http://i.msdn.microsoft.com/dynimg/IC116011.png

public class Runner
{
    public static string RunExecutable(string machine, string executable, string username, string password, string domain)
    {
        try
        {
            ConnectionOptions connectionOptions = new ConnectionOptions();
            connectionOptions.Authority = "kerberos:" + domain + @"\" + machine;
            connectionOptions.Username = username;
            connectionOptions.Password = password;
            connectionOptions.Impersonation = ImpersonationLevel.Delegate;
            connectionOptions.Authentication = AuthenticationLevel.PacketPrivacy;

            //define the WMI root name space
            ManagementScope scope = new ManagementScope(@"\\" + machine + "." + domain + @"\root\CIMV2", connectionOptions);

            //define path for the WMI class
            ManagementPath p = new ManagementPath("Win32_Process");

            //define new instance
            ManagementClass classInstance = new ManagementClass(scope, p, null);

            ManagementClass startupSettings = new ManagementClass("Win32_ProcessStartup");
            startupSettings.Scope = scope;
            startupSettings["CreateFlags"] = 16777216;

            // Obtain in-parameters for the method
            ManagementBaseObject inParams = classInstance.GetMethodParameters("Create");

            // Add the input parameters.
            inParams["CommandLine"] = executable;
            inParams["ProcessStartupInformation"] = startupSettings;

            // Execute the method and obtain the return values.
            ManagementBaseObject outParams = classInstance.InvokeMethod("Create", inParams, null);

            // List outParams
            string retVal = outParams["ReturnValue"].ToString();
            return "ReturnValue: " + retVal;
        }

        catch (ManagementException me)
        {
            return me.Message;
        }

        catch (COMException ioe)
        {
            return ioe.Message;
        }
    }
}

Iв моей среде 5 машин, все в одном домене.3 работают под управлением Windows Server 2008R2, одна Windows 7 и одна Windows XP:

  • WinXP
  • Win7
  • Master2008
  • Slave2008-1
  • Slave2008-2

Я запускаю код с Master2008, контроллера домена, и пытаюсь запустить процесс на других машинах, но сталкиваюсь с некоторыми проблемами при запуске процесса на XPи 7 машин.

При запуске процесса на машинах WinXP и Win7 я получаю возвращаемое значение 8, которое равно «Неизвестная ошибка», но при запуске процесса на машинах с сервером 2008R2 это работает без проблем.

Все машины были помечены как доверенные для делегирования в AD.

Процесс, который я пытаюсь запустить, это \\ "машина \" \ c $ \ Windows \ System32 \ Calc.exe

Я попытался запустить процесс с разных машин, и результат был следующий (программа выполняется на Master2008):

On WinXP
 - From Win7: Failed (8)
 - From Slave2008-1: Failed (8)
 - From Slave2008-2: Failed (8)
 - From Master2008: Failed (8)

On Win7
 - From WinXP: Success (0)
 - From Slave2008-1: Failed (8)
 - From Slave2008-2: Failed (8)
 - From Master2008: Failed (8)

On Slave2008-1
 - From WinXP: Success (0)
 - From Win7: Success (0)
 - From Slave2008-2: Success (0)
 - From Master2008: Success (0)

On Slave2008-2
 - From WinXP: Success (0)
 - From Win7: Success (0)
 - From Slave2008-1: Success (0)
 - From Master2008: Success (0)

По какой-то причине все они терпят неудачу дляМашина WinXP, но машина Win7 может взависание с машины WinXP.

Кто-нибудь знает, что может быть не так?

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Кажется, с кодом проблем не было.Я попытался сделать простое приложение для запуска вместо «calc.exe», и оно заработало как надо.

Проблема заключалась в том, что я пытался запустить «calc.exe» с 64-битных серверов на 32-битных клиентах.,Кроме того, «calc.exe» в Windows7 не будет работать в WindowsXP.

0 голосов
/ 14 декабря 2013

Не работает.http://technet.microsoft.com/en-us/library/ee156574.aspx

Нельзя использовать уровень олицетворения делегирования, если все учетные записи пользователей и учетные записи компьютеров, участвующие в транзакции, не помечены как доверенные для делегирования в Active Directory.Это помогает минимизировать риски безопасности.Хотя удаленный компьютер может использовать ваши учетные данные, он может делать это только в том случае, если ему и другим компьютерам, участвующим в транзакции, доверяют делегирование.

...