Удаленное соединение WMI - PullRequest
9 голосов
/ 20 июля 2010

Я хочу подключиться к удаленному ПК под управлением Windows 7, с другого ПК, используя ManagementScope в локальной сети.На удаленном ПК я создал новую учетную запись пользователя «Самуэль» без пароля и назначил ее администратором.

ConnectionOptions options = new ConnectionOptions();
options.Username = "Samuel";
options.Password = "";

ManagementScope scope = new ManagementScope("\\\\192.168.0.2\\root\\cimv2", options);          
scope.Connect();

Полученная ошибка:

Доступ запрещен.(Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))

Обновление:
После установки пароля для использования я получаю новую ошибку:

Сервер RPC недоступен.(Исключение из HRESULT: 0x800706BA)

Ответы [ 9 ]

9 голосов
/ 20 июля 2010

Может быть, это отсутствующие «EnablePrivileges»:

scope.Options.EnablePrivileges = true;

Из MSDN ( ConnectionOptions.EnablePrivileges Свойство ):

Получает или задает значение, указывающее должны ли быть права пользователя включен для операции подключения. Это свойство следует использовать только когда выполненная операция требует определенная пользовательская привилегия должна быть включена (например, перезагрузка машины).

Edit: Если это не работает, попробуйте установить для ImpersonationLevel значение «Impersonate»:

scope.Options.Impersonation = System.Management.ImpersonationLevel.Impersonate;

ImpersonationLevel Олицетворение: Олицетворение COM на уровне олицетворения уровень, который позволяет объектам использовать учетные данные звонящего. Это Рекомендуемый уровень олицетворения для WMI звонки.

7 голосов
/ 20 июля 2010
  • В соответствии с WMI FAQ на TechNet ошибка 0x80070005 указывает на проблему DCOM:

    0x80070005 (DCOM ACCESS_DENIED)
    Эта ошибка возникает, когда подключенный пользователь не распознается или каким-либо образом ограничен удаленным сервером (например, пользователь может быть заблокирован). Это происходит чаще всего, когда учетные записи находятся в разных доменах. Недавние изменения в безопасности WMI также могут вызвать эту ошибку:

    • Пустые пароли, ранее разрешенные, недопустимы в Windows XP и Windows Server 2003.

    • WMI не разрешает асинхронные обратные вызовы клиенту Windows 98. Вызов типа SWbemServices.ExecNotificationQueryAsync с компьютера под управлением Windows 98 на компьютер под управлением Windows XP приведет к ошибке «Отказано в доступе», возвращенной на компьютер под управлением Windows 98.

    • Возможно, настройки доступа к конфигурации DCOM были изменены.

    • Если на целевом компьютере установлена ​​Windows XP, значение Forceguest в разделе реестра HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa может быть настроено для принудительного отключения учетной записи гостя (значение равно нулю).

    (Хотя упоминается Windows XP, это может быть применимо и к Windows 7.)

  • Ошибка 0x800706BA, в свою очередь, указывает на проблему брандмауэра:

    0x800706xx (ошибка RPC DCOM)
    Это часто происходит, когда на удаленном компьютере настроен брандмауэр. Вам нужно будет открыть соответствующие порты на брандмауэре, чтобы разрешить удаленное администрирование с использованием DCOM.

    Попробуйте включить исключение Удаленное администрирование в брандмауэре Windows на удаленном компьютере и посмотрите, поможет ли это. Чтобы сделать это из командной строки, введите в командной строке с повышенными правами следующую команду:

    netsh advfirewall firewall set rule group="remote admin" new enable=yes
    


    Вы также можете найти DCOM, UAC, брандмауэр Windows и другие параметры, необходимые для удаленного доступа к WMI, в статье Удаленное подключение к WMI Начиная с Windows Vista в MSDN.

  • Кроме того, поскольку Samuel является не доменной учетной записью, вам необходимо предоставить эту учетную запись DCOM Удаленный доступ , Удаленный запуск и Удаленный Активация разрешений на удаленном компьютере, как описано здесь .

5 голосов
/ 05 декабря 2011

Вы получили «Доступ запрещен».потому что вы не можете запросить соединение области только с именем пользователя.У вас есть 2 варианта: пустое имя пользователя и пароль или введите имя пользователя и пароль.

Вы получили сообщение «Сервер RPC недоступен».потому что брандмауэр не позволяет вам запросить эту машину.У вас есть 2 варианта: отключить брандмауэр или добавить к нему исключение удаленного администрирования.

Вы можете добавить исключение брандмауэра, например, в cmd: Старые версии Windows:

netsh firewall set type type =режим remoteadmin = включить

Новые версии Windows:

netsh advfirewall set set group group = "Удаленное управление Windows" новое разрешение = да

Если вы попытаетесь войти в систему с пользователем домена, измените имя пользователя на domainName\username или задайте свойство соединения connection.Authority = "ntlmdomain:domainName".

1 голос
/ 07 декабря 2011

Не уверен, отказано ли это, потому что механизм WMI не слушает на удаленном компьютере, или если у вас есть другие проблемы входа / подключения.

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

ConnectionOptions oConn = new ConnectionOptions();
ManagementScope oScope = null;

oConn.Username = txtLogin;
oConn.Password = txtPassword;
oConn.Authority = "ntlmdomain:" + txtDomain;

oScope = new ManagementScope("\\\\" + txtHostName + "\\root\\CIMV2", oConn);

oScope.Connect();

Если трио моего домена / логина / пароля будет принято, то Connect () будет работать.В противном случае Connect () выдает исключение.Пока указанные учетные данные имеют разрешение на этом компьютере, вы должны быть выключены и работать.

1 голос
/ 20 июля 2010

Возможно, вы захотите проверить настройки безопасности WMI на удаленном ПК с Windows 7.Щелкните правой кнопкой мыши Компьютер> Управление> Службы и приложения> Управление WMI> Вкладка «Безопасность» и убедитесь, что используемая учетная запись пользователя имеет разрешения necc.

1 голос
/ 20 июля 2010

Вы уверены, что можете устанавливать удаленные подключения WMI к учетным записям без паролей?

Есть несколько вещей, которые такие учетные записи не могут делать (например, обмениваться файлами, удаленный рабочий стол).Попробуйте установить пароль и посмотрите, имеет ли это значение.

0 голосов
/ 15 марта 2017

У меня тоже была эта проблема. Я пытался написать код C # для получения информации WMI и файлов с удаленного ПК.И столкнулся с двумя Access Denied ошибками:

Короче говоря, мне пришлось внести изменения в удаленный ПК.См. Ниже:

  1. 0x80070005: доступ запрещен: https://social.msdn.microsoft.com/Forums/vstudio/en-US/6229334e-d5ef-4016-9e7e-1c8718be8d43/access-is-denied-exception-from-hresult-0x80070005-eaccessdenied-in-vbnet?forum=netfxbcl

  2. System.Management: ДоступЗапрещено: раздел «Использование System.Management и WMI» : https://support.microsoft.com/en-us/help/317012/process-and-request-identity-in-asp.net

0 голосов
/ 03 ноября 2014

Решение с использованием "net view \\ servername "

Я знаю, что не очень желательно использовать консольную команду и выполнять некоторые строковые гимнастические операции на выходе, но с другойэто работает, и не очень желательно, по крайней мере для меня, возиться с настройками DCOM по умолчанию, чтобы заставить работать WMI (по крайней мере, на Win7s).

Был протестирован наКлиенты Win7 и XP, а также серверы MS и Linux.

Function GetShares(ServerName As String) As List(Of String)
    Try
        Dim P As New Process
        Dim Read As Boolean = False
        Dim Str As String
        Dim Shares As New List(Of String)

        With P.StartInfo
            .FileName = "net"
            .Arguments = "view " & ServerName
            .RedirectStandardOutput = True
            .RedirectStandardError = True
            .CreateNoWindow = True
            .UseShellExecute = False
        End With
        P.Start()
        P.WaitForExit()

        If P.ExitCode <> 0 Then
            MsgBox(P.StandardError.ReadToEnd, MsgBoxStyle.OkOnly, "Error")
        Else
            Do Until P.StandardOutput.EndOfStream = True
                If Read = True Then
                    Str = P.StandardOutput.ReadLine
                    If Str = "The command completed successfully." Then Exit Do
                    Str = Strings.RTrim(Str) 'Removes any trailing spaces
                    Str = Strings.Mid(Str, 1, Strings.InStrRev(Str, " ")) 'remove Type
                    Str = Strings.RTrim(Str) ''Removes any trailing spaces
                    Shares.Add(Str)
                Else
                    If Strings.Left(P.StandardOutput.ReadLine, 10) = "----------" Then Read = True
                End If
            Loop
        End If
        Return Shares
    Catch ex As Exception
        MsgBox("Error in """ & System.Reflection.MethodInfo.GetCurrentMethod.Name & """: " & vbCr & ex.Message, MsgBoxStyle.OkOnly, "Runtime error")
        Debug.Print("--------------------------" & vbCr & "Error: " & ex.Message & vbCr & ex.StackTrace)
        Return Nothing
    End Try
End Function
0 голосов
/ 20 июля 2010

Попробуйте добавить имя домена или компьютера перед именем пользователя (например, @ "mshome \ Samuel").

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