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 的“访问被拒绝”异常的主要内容,如果未能解决你的问题,请参考以下文章