WMI Удаленное соединение - PullRequest
1 голос
/ 28 января 2009

У меня проблема с подключением WMI через asp.net с компьютера A (сервер Windows 2003) к компьютеру B (Windows XP)

Ошибка выглядит следующим образом:

RPC сервер недоступен ..

Ответы [ 4 ]

3 голосов
/ 30 января 2009

Есть несколько шагов, которые вы должны предпринять, чтобы успешно использовать подключение WMI. Основы в том, что вы должны разрешить удаленное управление на целевом поле, конечно. Если вы не можете использовать RDP, скорее всего, вы не сможете удаленно управлять чем-либо еще. Это также может включать проблемы с брандмауэром Windows. Убедитесь, что ваш запрос может вообще войти.

Далее начните с простого. Можете ли вы даже опросить запущенные процессы на этой коробке? Попробуйте вывести все запущенные процессы в поле назначения с помощью System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetProcesses ("имя-машины"). Если вы можете хотя бы получить некоторую информацию о коробке, то полученное вами сообщение RPC связано с передачей неверных аргументов, возможно?

В любом случае, я недавно написал веб-приложение, которое позволяло пользователям находить сервер в локальной сети и завершать там целевой процесс или запускать новый. Я сделал это в C #, поэтому фрагмент кода ниже - именно то, что я использовал. Это не самое лучшее, но сейчас оно работает на производстве:

public static class RemoteProcessAccess
{

    public static void KillProcessByProcessID(string NameOfServer, string DomainName, string LogIn, string Password, int processID)
    {
        //#1 The vars for this static method
        #region /// <variables> ...
            string userName;
            string password;
            string machineName;
            string myDomain;
            Hashtable hs = new Hashtable();
            ManagementScope mScope;
            ConnectionOptions cnOptions;
            ManagementObjectSearcher objSearcher;
            ManagementOperationObserver opsObserver;
            ManagementClass manageClass;
            DirectoryEntry entry;
            DirectorySearcher searcher;
            DirectorySearcher userSearcher;
        #endregion

        //#2 Set the basics sent into the method
            machineName = NameOfServer;
            myDomain = DomainName;
            userName = LogIn;
            password = Password;

            cnOptions = new ConnectionOptions();
            cnOptions.Impersonation = ImpersonationLevel.Impersonate;
            cnOptions.EnablePrivileges = true;
            cnOptions.Username = myDomain + "\\" + userName;
            cnOptions.Password = password;

            mScope = new ManagementScope(@"\\" + machineName + @"\ROOT\CIMV2", cnOptions);

        //#3 Begin Connection to Remote Box
            mScope.Connect();
            objSearcher = new ManagementObjectSearcher(String.Format("Select * from Win32_Process Where ProcessID = {0}", processID)); 
            opsObserver = new ManagementOperationObserver();
            objSearcher.Scope = mScope;
            string[] sep = { "\n", "\t" };

        //#4 Loop through 
        foreach (ManagementObject obj in objSearcher.Get())
        {
            string caption = obj.GetText(TextFormat.Mof);
            string[] split = caption.Split(sep, StringSplitOptions.RemoveEmptyEntries);

            // Iterate through the splitter
            for (int i = 0; i < split.Length; i++)
            {
                if (split[i].Split('=').Length > 1)
                {
                    string[] procDetails = split[i].Split('=');
                    procDetails[1] = procDetails[1].Replace(@"""", "");
                    procDetails[1] = procDetails[1].Replace(';', ' ');
                    switch (procDetails[0].Trim().ToLower())
                    {
                        //You could look for any of the properties here and do something else,
                        case "processid":
                            int tmpProc = Convert.ToInt32(procDetails[1].ToString());
                            //if the process id equals the one passed in....
                            //(this is redundant since we should have limited the return 
                            //by the query where above, but we're paranoid here

                            if (tmpProc.Equals(processID))
                            {
                                obj.InvokeMethod(opsObserver, "Terminate", null);                                    
                            }
                            break;

                    }//end process ID switch...

                }//end our if statement...

            }//end our for loop...

        }//end our for each loop...



    }//end static method 
}
1 голос
/ 23 февраля 2011

Вы можете включить RPC-сервер на любой целевой машине, запустив это в командной строке цели:

[/ код] netsh firewall set service RemoteAdmin [/ Код]

Работал на меня, по крайней мере. :)

1 голос
/ 28 января 2009

Посмотрите на KB875605 ("Как устранить неполадки, связанные с WMI в Windows XP SP2")

0 голосов
/ 18 октября 2014

Попробуйте использовать wmic командную строку для получения информации с удаленного компьютера, также вы можете установить код Services + и попытаться подключиться и отладить ваше соединение с сервером, скорее всего, это проблема брандмауэра или Службы RPC отключены или отключены.

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