2010-07-22 49 views
1

我有一些代碼正在從機器上的本地組查找組成員資格。對於每個成員,它都會嘗試加載一些關於用戶的信息(例如,找到一個組並獲取其每個成員的名稱)。查找用戶信息時引發意外的異常

代碼:

using (DirectoryEntry machine = new DirectoryEntry("WinNT://" + Environment.MachineName + ", Computer")) 
{ 
    using (DirectoryEntry group = machine.Children.Find(groupName, "group")) 
    { 
     object members = group.Invoke("members", null); 

     foreach (object groupMember in (IEnumerable) members) 
     { 
      using (DirectoryEntry member = new DirectoryEntry(groupMember)) 
      { 
       member.RefreshCache(); 
       string name = member.Name; 
       // <code snipped> 
      } 
     } 
    } 
} 

的代碼工作正常的大部分時間,但對於一些小組成員,它拋出一個FileNotFoundExceptionRefreshCache()方法時拋出:

System.IO.FileNotFoundException: 
    The filename, directory name, or volume label syntax is incorrect. 
    (Exception from HRESULT: 0x8007007B) 
at System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo() 
at System.DirectoryServices.DirectoryEntry.RefreshCache() 
at GroupLookup.GetLocalGroupMembership(String groupName) 

是什麼原因造成FileNotFoundException(以及它正在查找的文件)?

+0

一個非常短的稻草來抓住,但有問題的組成員有一個「&」在他們的名字? 如果不是,您可以發佈一些導致問題的示例組成員名稱嗎? – 2010-07-22 10:55:28

+0

@尼爾:不,他們沒有。錯誤發生在客戶現場,我已經問過這個問題。他們向我保證,會員名稱只包含字母。 – adrianbanks 2010-07-22 12:03:33

+0

是否有這個系統正在工作? – 2010-07-22 12:41:25

回答

0

雖然我懷疑這是與組設置有關,但我沒有深入瞭解導致FileNotFoundException的原因 - 組中有本地和域用戶。

因爲我只需要用戶的名字和SID,並且這些已經出現在DirectoryEntry上,所以我通過不調用RefreshCache方法解決了這個問題。這讓代碼執行時沒有例外。

2

在Win32 API中,文件未找到的錯誤通常用作「資源未找到」錯誤。所以,它返回了諸如缺少註冊表項的東西,或者 - 在這種情況下 - ADSI節點。

我絕對不是ADSI專家,但您對DirectoryEntry構造函數的第一個調用似乎使用無效路徑樣式according to MSDN。我相信你在機器名稱之前需要域名。

更新:

another MSDN page注意到了這一點:「的GetInfo不能用於包含成員都在WINNT範圍內衆所周知的安全主體團體」

鑑於堆棧跟蹤,似乎這可能導致問題。

+0

該計算機是域的一部分,但我正在查詢本地組信息(儘管本地組可能包含域項)。我認爲在這種情況下我不需要域名。 – adrianbanks 2010-07-22 12:06:01

+0

在這種情況下,我會嘗試'WinNT:// '路徑,而不指定'computer'類型。 – 2010-07-22 12:43:18

+0

我用新鮮的眼睛看着它。看看答案更新(這實際上是一個完全不同的答案),並看看是否有幫助。 – 2010-07-22 12:49:50

相關問題