.NET - запуск процессов на компьютере в другом домене. - PullRequest
2 голосов
/ 10 октября 2011

Я ищу способ из кода .NET получить список запущенных процессов на удаленной машине, которая находится в другом домене.

У меня есть имя пользователя и пароль для машины.Однако функция System.Diagnostics.Process.GetProcesses () имеет только два переопределения.Один из них принимает имя удаленной машины, но не может отправить имя пользователя и пароль на эту машину.Чтобы punciton работал, это должен быть компьютер в вашем домене, к которому у вас уже есть доступ.

Я не уверен на 100%, можно ли это сделать, но я подозреваю, что это может бытьвыполняется через Interop и WMI.

Если это имеет значение, приложение .NET работает на компьютере мониторинга Windows 7, которому необходимо подключиться к компьютеру под управлением Windows XP в одном из наших розничных магазинов.

Я пытался искать предыдущие вопросы и пробовал Google, прежде чем опубликовать этот вопрос.Если есть дублирующий вопрос, пожалуйста, дайте мне знать, и я удалю этот вопрос.

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

Я ненавижу отвечать на свои вопросы, но для следующего человека, который столкнется с этой проблемой, я нашел более простой способ сделать это с помощью объектов System.Management

На codeproject.com есть полностью работающее приложение с исходным кодом.

http://www.codeproject.com/KB/cs/Remote_process_controller.aspx

Я немного изменил его для своих конкретных целей и получил для этого наименьшую возможную функцию. Я делюсь этим для следующего человека.

Обратите внимание, что вам необходимо добавить ссылку на System.Management в ваш проект.

    private bool CheckForExpectedProcess(string userName, string password, string machineName, string logonDomain, string PartialProcessname)
    {
        bool ReturnValue = false;
        System.Management.ManagementScope managementScope;
        try
        {
            System.Management.ConnectionOptions connOptions = new System.Management.ConnectionOptions();

            connOptions.Impersonation = System.Management.ImpersonationLevel.Impersonate;
            connOptions.EnablePrivileges = true;
            connOptions.Username = logonDomain + "\\" + userName;
            connOptions.Password = password;
            managementScope = new System.Management.ManagementScope(@"\\" + machineName + @"\ROOT\CIMV2", connOptions);

            managementScope.Connect();
            System.Management.ManagementObjectSearcher objSearcher = new System.Management.ManagementObjectSearcher("SELECT Name FROM Win32_Process WHERE NAME LIKE'%" + PartialProcessname + "%'");
            System.Management.ManagementOperationObserver opsObserver = new System.Management.ManagementOperationObserver();
            objSearcher.Scope = managementScope;
            string[] sep = { "\n", "\t" };

            System.Management.ManagementObjectCollection  objects = objSearcher.Get();
            ReturnValue = objects.Count > 0;

        }
        catch (Exception ex)
        {
           // handle error - we log it to our own system, but it's up to you.
        }

        return ReturnValue;
    }
2 голосов
/ 10 октября 2011

То, что вы ищете, - это реализация, эквивалентная runas /networkonly, где идентификатор процесса на локальном компьютере не изменяется, а любой исходящий доступ к сети осуществляется с использованием указанных учетных данных.

Согласно сообщению SO Как встроить функциональность RUNAS / NETONLY в (C # /. NET / WinForms) программу? вам нужно использовать CreateProcessWithLogonW с LOGON_NETCREDENTIALS_ONLY.

1 голос
/ 25 апреля 2013

Вы можете попробовать этот инструмент , который точно соответствует вашим требованиям. Вы можете контролировать удаленные компьютеры из любого домена. Этот инструмент позволяет отслеживать удаленные процессы машины, установленное программное обеспечение, устройства, службы, сеансы и т. Д. *

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