2010-09-21 37 views
1

我正在使用WMI來枚舉計算機的用戶,但對於某些客戶,我收到了神祕的異常和/或代碼無法正常工作。對於一個客戶沒有用戶帳戶信息從這個簡單的代碼返回:WMI飄忽/枚舉用戶帳戶

SelectQuery query = new SelectQuery("Win32_UserAccount", string.Format("Domain='{0}'", Environment.MachineName)); 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
    foreach (ManagementObject mObject in searcher.Get()) { 
    Console.WriteLine((string)mObject["Name"]); 
    } 

但對於同一客戶,我能列舉使用此代碼產生的輸出,如「Administradores」,「Convidados」的羣體,「分佈式COM - USUARIOS」等

SelectQuery query = new SelectQuery("Win32_Group", string.Format("Domain='{0}'", Environment.MachineName)); 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
    foreach (ManagementObject mObject in searcher.Get()) { 
    Console.WriteLine((string)mObject["Name"]); 
    } 

試圖用下面的代碼生成異常來枚舉用戶在一個特定的基團。我傳入Environment.MachineName作爲域名和有效的組名稱。

public static void GetUsersInGroup(string domainName, string groupName) { 
    string findUsersQueryText = string.Format("GroupComponent=\"Win32_Group.Domain='{0}',Name='{1}'\"", domainName, groupName); 
    SelectQuery query = new SelectQuery("Win32_GroupUser", findUsersQueryText); 
    using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) { 
    foreach (ManagementObject foundObject in searcher.Get()) { 
     foreach (var property in foundObject.Properties) { 
     if (property.Name == "PartComponent") { 
      ManagementPath managementPath = new ManagementPath(foundObject["PartComponent"].ToString()); 
      if (managementPath.ClassName == "Win32_UserAccount") { 
      using (ManagementObject userAccount = new ManagementObject(managementPath)) { 
       foreach (var x in userAccount.Properties) { 
       //Exception raised here while trying to enumerate properties 
       //System.Management.ManagementException: Not found 
       // em System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) 
       // em System.Management.ManagementObject.Initialize(Boolean getObject) 
       // em System.Management.ManagementBaseObject.get_Properties() 
       // em WmiTest.AccountManager.GetUsersInGroup(String domainName, String groupName) 
       Console.WriteLine(String.Format(" Name: '{0}' Value: '{1}'\r\n", x.Name ?? "null", x.Value ?? "null")); 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

我們嘗試刪除WMI存儲庫,但問題仍然存在。

什麼可能導致WMI代碼的這些問題? 我怎樣才能獲得更多有關錯誤的信息?

+0

你真的需要提取一個方法或2.有時候,這是所有需要揭示一個錯誤。 – ChaosPandion 2010-09-21 19:55:35

回答

1

幾乎所有的WMI問題我遇到過,當它在一個客戶端上工作,但不是另一個煮沸到操作系統和服務包級別。

多年來,MS對WMI對象進行了大量修復/更改/添加。我們有一臺擁有17,000臺機器的客戶,我們安裝了一項監控WMI信息的服務。機器運行從XP RTM到Windows 7的色域。

這是一場噩夢。可用WMI信息級別的差異令人驚歎。例如,取決於修補程序級別,僅獲取CPU類型就已命中或未命中。

我會說,第1步是讓客戶機修補到該操作系統可用的最新Service Pack。然後再試一次。