2010-11-11 78 views
2

我使用一些代码,试图指望在.NET 2.0的处理器数量:System.Management访问被拒绝

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 

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

回答

8

好吧,我讨厌回答我自己的问题,但我发现这个:http://support.microsoft.com/kb/317012 它似乎工作。

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

我真的不喜欢这是多么模糊。微软需要更新这些例外。当System.Management类失败时,它应该提供详细信息,说明需要激活哪些权限才能使代码生效。

2

看起来像一个权限问题。

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

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

+0

是的,那是我在想什么。有没有一种简单的方法来查看哪些权限是必需的?我可以随机地尝试它们,但是有没有日志或者显示哪一个我需要的东西? – LoveMeSomeCode 2010-11-12 20:33:16

+0

@LoveMeSomeCode - 对不起,我不知道哪些权限是必需的,或者如何轻松找出。这是系统管理员比程序员更多地了解的东西...... – Oded 2010-11-12 21:05:19

0

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

这是我的错误信息:

System.Management.ManagementException:访问在System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus的errorCode) 否认 在System.Management.ManagementScope.InitializeGuts(对象o) 在System.Management.ManagementScope.Initialize() 在System.Management.ManagementObjectSearcher.Initialize() 在System.Management.ManagementObjectSearcher.Get() 在。() 在。() 在(〜应变克) 在Aspose.Email.Verify.EmailValidator。(字符串,Int32)将 在Aspose.Email.Verify.EmailValidator。(字符串,MailAddress,将字符串[] &)

而我为我的ASP溶液。 NET应用程序包装代码

using (HostingEnvironment.Impersonate()) 
{ 
    ... 
}