System.Management访问被拒绝

时间:2010-11-11 20:20:45

标签: .net asp.net permissions

我正在使用一些代码来尝试计算.NET 2.0中的处理器数量:

internal static int GetNumberOfProcessors()
{
    List<string> list = new List<string>();
    ManagementClass mgmt = new ManagementClass("Win32_Processor");
    foreach (ManagementObject obj in mgmt.GetInstances())
    {
        string item = obj.Properties["SocketDesignation"].Value.ToString();
        if (!list.Contains(item))
        {
            list.Add(item);
        }
    }
    return list.Count;
}

它像这样爆炸:

[ManagementException: Access denied ]
   System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) +377984
   System.Management.ManagementScope.InitializeGuts(Object o) +654
   System.Management.ManagementScope.Initialize() +162
   System.Management.ManagementObject.Initialize(Boolean getObject) +492
   System.Management.ManagementClass.GetInstances(EnumerationOptions options) +122
   System.Management.ManagementClass.GetInstances() +6

此代码在cassini上本地运行正常,但在我们的测试版服务器上爆炸。任何人都知道该怎么办?

3 个答案:

答案 0 :(得分:10)

好的,我讨厌回答我自己的问题,但我发现了这个问题:http://support.microsoft.com/kb/317012 它似乎确实有用。

您必须专门修改您的CIMV2权限,我必须为特定用户而不是ASPNET执行此操作。启用此选项后,您可以使用System.Management代码计算处理器等。

我真的不喜欢这有多么模糊。 Microsoft需要更新这些异常。当System.Management类失败时,它应该提供有关哪些权限需要激活才能使代码生效的详细信息。

答案 1 :(得分:2)

看起来像权限问题。

如果它在本地运行正常(在cassini下),它将在您的凭据下运行,该凭据可能具有本地管理员权限,因此具有访问此数据的正确权限。

确保代码以具有足够权限来获取此数据的用户身份运行(如果运行IIS 7及更高版本,请查看应用程序池标识 - 即运行代码的帐户)。

答案 2 :(得分:0)

天哪,使用Aspose.Email(域名电子邮件地址验证)仍然遇到同样的问题。

这是我的错误消息:

  

System.Management.ManagementException:访问被拒绝     在System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)      在System.Management.ManagementScope.InitializeGuts(Object o)      在System.Management.ManagementScope.Initialize()      在System.Management.ManagementObjectSearcher.Initialize()      在System.Management.ManagementObjectSearcher.Get()      在 。()      在 。()      at。(String)      在Aspose.Email.Verify.EmailValidator。(String,Int32)      at Aspose.Email.Verify.EmailValidator。(String,MailAddress,String []&amp;)

我的ASP.NET应用程序的解决方案是使用

包装代码
using (HostingEnvironment.Impersonate()) 
{
    ...
}