远程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的exception:0x80070005(E_ACCESSDENIED))

更新:
设置密码后,我收到新的错误:

RPC服务器不可用。 (来自HRESULT的exception:0x800706BA)

也许这是缺少的’EnablePrivileges’:

 scope.Options.EnablePrivileges = true; 

从MSDN( ConnectionOptions.EnablePrivileges属性 ):

获取或设置一个值,该值指示是否需要为连接操作启用用户权限。 仅当执行的操作需要启用某个用户权限(例如,计算机重新启动)时,才应使用此属性。

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

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

ImpersonationLevel Impersonate:模拟级别的COM模拟级别,允许对象使用调用方的凭据。 这是WMI调用的推荐模拟级别。

  • 根据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上的“ 连接到WMI远程启动Windows Vista”文章中找到远程WMI访问所需的DCOM,UAC,Windows防火墙和其他设置。

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

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

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

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

netsh firewall set service type = remoteadmin mode = enable

较新的Windows版本:

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

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

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

这样的帐户有很多东西不能做(例如共享文件,远程桌面)。 尝试设置密码,看看是否有所作为。

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

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

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

解决方案使用“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 

我也有这个问题。我正在尝试编写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- eaccessdeniedfunction于vbnet?论坛= netfxbcl

  2. System.Management:拒绝访问:“使用System.Management和WMI”部分 : https : //support.microsoft.com/en-us/help/317012/process-and-request-identity-in-asp.net