远程WMI连接

时间:2010-07-20 11:36:05

标签: c# wmi

我想在本地网络上使用ManagementScope从另一台PC连接到运行Windows 7的远程PC。 在远程PC上,我创建了一个没有密码的新用户帐户“Samuel”并设置为管理员。

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 个答案:

答案 0 :(得分:9)

也许缺少'EnablePrivileges':

scope.Options.EnablePrivileges = true;

来自MSDN(ConnectionOptions.EnablePrivileges Property):

  

获取或设置一个指示的值   是否需要用户权限   已启用连接操作。   只有在使用时才应使用此属性   执行的操作需要一个   某些用户权限被启用   (例如,机器重启)。

编辑: 如果它不起作用,请尝试将ImpersonationLevel设置为“Impersonate”:

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

ImpersonationLevel Impersonate:   模仿级别的COM模拟   允许对象使用的级别   来电者的凭证。这是   推荐的假冒等级   WMI致电。

答案 1 :(得分:7)

  • 根据TechNet上的WMI FAQ,0x80070005错误表示DCOM问题:

      

    0x80070005(DCOM ACCESS_DENIED)
      当无法识别连接用户或远程服务器以某种方式限制连接用户时(例如,用户可能被锁定),会发生此错误。当帐户位于不同的域中时,这种情况最常发生。最近对WMI安全性的更改也可能导致发生此错误:

         
        
    • Windows XP和Windows Server 2003中不允许使用以前允许的空白密码。

    •   
    • WMI不允许对Windows 98客户端进行异步回调。从Windows 98计算机到Windows XP计算机的 SWbemServices.ExecNotificationQueryAsync 等调用将导致返回到Windows 98计算机的“拒绝访问”错误。

    •   
    • DCOM配置访问设置可能已更改。

    •   
    • 如果目标计算机运行的是Windows XP,则可能会将注册表项HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa下的Forceguest值设置为强制关闭Guest帐户(值为零)。

    •   

    (虽然提到了Windows XP,但它也可能适用于Windows 7.)

  • 错误中的0x800706BA错误表示存在防火墙问题:

      

    0x800706xx(DCOM RPC错误)
      在远程计算机上配置防火墙时,通常会发生这种情况。您需要在防火墙上打开相应的端口以允许使用DCOM进行远程管理。

    尝试在远程计算机上的Windows防火墙中启用远程管理例外,看看它是否有帮助。要从命令行执行此操作,请在提升的命令提示符中运行以下命令:

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


    您还可以在MSDN上的Connecting to WMI Remotely Starting with Windows Vista文章中找到远程WMI访问所需的DCOM,UAC,Windows防火墙和其他设置。

  • 此外,由于 Samuel 是非域帐户,因此您需要授予此帐户DCOM 远程访问远程启动和<远程计算机上的em>远程激活权限,如here所述。

答案 2 :(得分:5)

你得到了“拒绝访问权限”。因为您无法仅使用用户名查询范围连接。您有2个选项:用户名和密码为null,或输入用户名和密码。

你有“RPC服务器不可用”。因为防火墙不允许您查询该计算机。您有2个选项:禁用防火墙或向其添加远程管理例外。

您可以在cmd中添加这样的防火墙例外: 较旧的Windows版本:

  

netsh firewall set service type = remoteadmin mode = enable

较新的Windows版本:

  

netsh advfirewall防火墙设置规则组=“Windows远程管理”新的启用=是

如果您尝试使用域用户登录,请将用户名更改为domainName\username或设置连接属性connection.Authority = "ntlmdomain:domainName"

答案 3 :(得分:1)

您确定可以在没有密码的情况下与帐户建立远程WMI连接吗?

此类帐户无法做很多事情(例如,共享文件,远程桌面)。尝试设置密码,看看是否有所作为。

答案 4 :(得分:1)

您可能需要检查远程Windows 7 PC上的WMI安全设置。 右键单击计算机&gt;管理&gt;服务和应用&gt; WMI控制&gt;安全选项卡 并确保您使用的用户帐户具有necc权限。

答案 5 :(得分:1)

不确定是否因为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()会抛出异常。只要指定的凭据具有该计算机的权限,您就应该关闭并运行。

答案 6 :(得分:0)

尝试在用户名之前添加域名或计算机名称(例如@“mshome \ Samuel”)。

答案 7 :(得分:0)

使用“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

答案 8 :(得分:0)

我也有这个问题。我正在尝试编写C#代码以从远程PC获取WMI信息和文件。并遇到两个 Access Denied 错误:

长话短说,我不得不对远程PC进行更改。见下文:

  
      
  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.   
  3. System.Management:拒绝访问:部分&#34;使用System.Management和WMI&#34; :   https://support.microsoft.com/en-us/help/317012/process-and-request-identity-in-asp.net

  4.