我想在本地网络上使用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)
答案 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进行更改。见下文:
- 醇>
System.Management:拒绝访问:部分&#34;使用System.Management和WMI&#34; : https://support.microsoft.com/en-us/help/317012/process-and-request-identity-in-asp.net