2010-11-11 79 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()) 
{ 
    ... 
}