系统管理访问被拒绝

4

我正在使用一些代码尝试在.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上运行良好,但在我们的Beta服务器上出现了问题。有人知道如何解决吗?

3个回答

11

好的,我很讨厌回答自己的问题,但是我找到了这个:http://support.microsoft.com/kb/317012,它似乎可以解决问题。

您需要特别修改CIMV2权限,并且我必须为特定用户而不是ASPNET进行修改。启用此功能后,您可以使用System.Management代码来计算处理器等内容。

我真的不喜欢这种模糊不清的情况。微软需要更新那些异常。当System.Management类像那样失败时,它应该提供详细信息,说明哪些权限需要激活以使代码正常工作。


2

看起来是一个权限问题。

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

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


是的,这正是我在想的。有没有一种简单的方法可以查看需要哪些权限?我可以随机尝试它们所有,但是否有日志或其他东西显示我需要哪个? - LoveMeSomeCode
@LoveMeSomeCode - 抱歉,我不知道需要哪些权限,或者如何轻松找出。这是系统管理员比程序员更了解的事情... - Oded

0

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

这是我的错误信息:

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接