2010-11-15 121 views
0

我正在嘗試做一個非常簡單的AD查詢,以查看計算機是否在組中。下面的代碼看起來很直觀,但不起作用。對於NetBIOSName引用的計算機是memberOf的組,該LDAPString是完全可識別的名稱。Active Directory - 在組中查找計算機

public bool IsComputerInADGroup(String LDAPString, String NetBIOSName) 
{ 
    using (DirectoryEntry entry = new DirectoryEntry(String.Format(@"LDAP://{0}", LDAPString))) 
    using (DirectorySearcher computerSearch = new DirectorySearcher(entry)) 
    { 
     ComputerSearch.Filter = String.Format("(&(objectCategory=computer)(CN={0}))", NetBIOSName); 
     SearchResult match = ComputerSearch.FindOne(); 

     if (match != null) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

有人能解釋爲什麼這是不正確的,什麼是正確/最快的方式來執行此搜索。

感謝 P

回答

2

你的基本假設是錯誤的 - 一臺計算機(或用戶)不能是一組在暗示「遏制」一組中;用戶或計算機只在OU內部。

用戶或計算機可以是構件任意數量的組的 - 但你需要檢查這對基團(或元素的的memberOf屬性的構件屬性,就是一個構件組)。

所以,最簡單的方法,真的,是

  • 綁定到的問題
  • 對象刷新其屬性緩存,以獲取最新的條目在它memberOfmemberOf
  • 枚舉,看看您正在尋找的組是

類似於:

public static bool IsAccountMemberOfGroup(string account, string group) 
{ 
    bool found = false; 

    using (DirectoryEntry entry = new DirectoryEntry(account)) 
    { 
     entry.RefreshCache(new string[] { "memberOf" }); 

     foreach (string memberOf in entry.Properties["memberOf"]) 
     { 
      if (string.Compare(memberOf, group, true) == 0) 
      { 
       found = true; 
       break; 
      } 
     } 
    } 

    return found; 
} 

調用此像這樣:

bool isMemberOf = 
    IsAccountMemberOfGroup("LDAP://cn=YourComputer,dc=Corp,dc=com", 
          "CN=yourGroupInQuestion,OU=SomeOU,dc=corp,dc=com"); 

,你應該罰款。

更新:如果你在.NET 3.5中,你還可以使用新的命名空間System.DirectoryServices.AccountManagement和LINQ使事情變得更簡單:

public static bool IsAccountMemberOfGroup2(PrincipalContext ctx, string account, string groupName) 
{ 
    bool found = false; 
    GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, groupName); 

    if (group != null) 
    { 
     found = group.GetMembers() 
       .Any(m => string.Compare(m.DistinguishedName, account, true) == 0); 
    } 

    return found; 
} 

並稱之爲:

// establish default domain context  
PrincipalContext domain = new PrincipalContext(ContextType.Domain); 

// call your function 
bool isMemberOf = 
    IsAccountMemberOfGroup2(domain, 
          "cn=YourComputer,dc=Corp,dc=com", 
          "CN=yourGroupInQuestion,OU=SomeOU,dc=corp,dc=com"); 
+0

感謝您抽出時間來解釋。這是有道理的,是一種享受。 – user474541 2010-11-15 11:23:12

0

當你說它不起作用時,你的意思是你找不到電腦?如果是,請首先檢查計算機是否在組中,那裏有一個很好的工具,名爲Active Directory exporer,可以幫助您:http://technet.microsoft.com/en-us/sysinternals/bb963907.aspx 如果它在組中,您可以嘗試的是消除計算機名稱的篩選器在過濾器和遍歷結果集,以找出是否你的元素有:

ComputerSearch.Filter = ("(&(objectCategory=computer))"; 
    SearchResult match = ComputerSearch.FindAll(); 

下面是關於如何查詢AD一些相關信息:http://www.codeproject.com/KB/system/everythingInAD.aspx

相關問題