WMI 的“访问被拒绝”异常

Posted

技术标签:

【中文标题】WMI 的“访问被拒绝”异常【英文标题】:"Access is denied" Exception with WMI 【发布时间】:2009-12-12 21:18:17 【问题描述】:

我正在研究 WMI。我想访问远程系统信息。以下代码适用于环回或本地主机,但是当我尝试访问远程机器时,它显示以下异常错误:

访问被拒绝。 (来自 HRESULT 的异常:0X8005(E_ACCESSDENIED))

在两个系统之间使用切换时。

RPC 服务器不可用。 (HRESULT 异常:0x800706BA)

当两个系统直接连接时。


两个系统上的操作系统:Windows Service Pack 2。 防火墙 = 被阻止。 远程过程服务 = 运行。

工具:.NET Visual Studio 2008 C#

代码:

try

    ConnectionOptions _Options = new ConnectionOptions();
    ManagementPath _Path = new ManagementPath(s);

    ManagementScope _Scope = new ManagementScope(_Path, _Options);
    _Scope.Connect();
    ManagementObjectSearcher srcd = new ManagementObjectSearcher("select * from Win32_DisplayConfiguration");
    foreach (ManagementObject obj in srcd.Get())
    
        //listBox5.Items.Add(obj.Properties.ToString());
        foreach (PropertyData aProperty in obj.Properties)
        
            listBox1.Items.Add(aProperty.Name.ToString() + " : " + aProperty.Value);
        
    

catch (Exception ex)

    MessageBox.Show(ex.Message);

【问题讨论】:

@dtb:感谢您的编辑。我清除了 cmets 并关闭了投票,因为编辑使它们不再相关。 【参考方案1】:

注意:如果您不指定凭据,将使用运行用户的凭据,因此这些凭据必须是有效的才能访问远程计算机,通常,此帐户必须是远程机器上的管理员(不适用于所有对象,但只是为了确定)。

如果您使用在两台计算机上都有效的域帐户登录,它可以开箱即用。

如果您不在域环境中,只需指定凭据即可。

试试这个:

ConnectionOptions co = new ConnectionOptions(); co.Impersonation = ImpersonationLevel.Impersonate; co.Authentication = AuthenticationLevel.Packet; co.Timeout = new TimeSpan(0, 0, 30); co.EnablePrivileges = true; co.Username = "\\"; co.Password = ""; 管理路径 mp = 新的管理路径(); mp.NamespacePath = @"\root\cimv2"; mp.Server = ""; ///注意这个!!!! ManagementScope ms = new ManagementScope(mp, co); ms.Connect(); ManagementObjectSearcher srcd; srcd = 新的 ManagementObjectSearcher ( ms, new ObjectQuery("select * from Win32_DisplayConfiguration") );

这对我来说一直有效。

在我看来,出现问题是因为您没有在 ManagementPath 中指定远程计算机。使用默认值创建的 ManagementPath 始终指向本地计算机。而且,如果您只是指定本地计算机的凭据,则这是不允许的,并且总是会失败。

br--马布拉

【讨论】:

我可以通过执行 srcd.get() 来查询这个,但是读取任何内容(甚至是计数属性)都会失败并出现 ManagementException,只告诉我“无效类”没有内部异常......【参考方案2】:

这可能与 SO 问题 asp classic - Access Denied errors accessing IIS WMI provider from ASP 中描述的问题相同。

正如我在对上述问题的回答中所解释的那样,我检查了我试图通过 WMI 远程访问 IIS 的服务器上的事件日志(“Windows 日志”),结果我发现了一个带有以下文本的事件:

对 root\WebAdministration 命名空间的访问被拒绝,因为命名空间被标记为 RequiresEncryption,但脚本或应用程序尝试使用低于 Pkt_Privacy 的身份验证级别连接到此命名空间。将身份验证级别更改为 Pkt_Privacy 并再次运行脚本或应用程序。

@mabra 为这个问题提供的The answer 包含了相关的灵感。这是我添加的示例 C# 代码,它似乎为我解决了这个问题:

ConnectionOptions options = new ConnectionOptions();
options.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope managementScope = new ManagementScope(@"\\remote-server\root\WebAdministration", options);
// ...

【讨论】:

【参考方案3】:

可能有很多事情,但首先你需要:

在防火墙中打开 RPC 流量 启用远程 rpc 调用

请参阅:http://support.microsoft.com/kb/895085(尽管这涉及稍微不同的问题,但解决方案是相关的)

【讨论】:

tnkz 亲爱的,防火墙被阻止,rpc WMI 和远程访问服务正在运行【参考方案4】:

如果您希望您的查询使用您创建的 ManagementScope,您应该使用它的构造函数的另一个重载。我怀疑,你之间有省略代码吗? 如果您在 ConnectionOptions 中使用过凭据,则 ManagementObjectServer 将不会使用它们。

试试:

ManagementObjectSearcher srcd;
srcd = new ManagementObjectSearcher  
(
    _Scope, new ObjectQuery("select * from Win32_DisplayConfiguration")
);

在 MSDN 参考中查找它。

【讨论】:

感谢兄弟的回复...我也尝试使用用户凭据,但我面临同样的问题..

以上是关于WMI 的“访问被拒绝”异常的主要内容,如果未能解决你的问题,请参考以下文章

WMI 访问被拒绝

WMI 访问被拒绝问题

为啥使用 WMI 连接时出现访问被拒绝错误?

SCOM 监视器的 WMI 访问被拒绝错误

尝试使用 SWbemLocator 从远程计算机检索 WMI 时访问被拒绝 (80070005)

WCF 访问被拒绝异常