我正在使用一些代码来尝试计算.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上本地运行正常,但在我们的测试版服务器上爆炸。任何人都知道该怎么办?
答案 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())
{
...
}