远程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进行更改。 见下文:
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
System.Management:拒绝访问:“使用System.Management和WMI”部分 : https : //support.microsoft.com/en-us/help/317012/process-and-request-identity-in-asp.net