2010-11-15 4 views
0

Я пытаюсь сделать очень простой запрос AD, чтобы узнать, находится ли компьютер в группе. Следующий код кажется достаточно интуитивным, но не работает. LDAPString - это полностью отличное имя для группы, которую компьютер, на который ссылается NetBIOSName, является членомOf.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

Ваше основное предположение неверно - это компьютер (или пользователь) не может быть в группе подразумевая «сдерживание» внутри группы; пользователь или компьютер находятся только внутри подразделения.

пользователь или компьютер может быть членом любого количества групп, - но вы должны проверить это против члена собственности группы (или memberOf атрибута элемента, который является членом этого группа).

Так самый простой способ, на самом деле, это

  • связываются с объектом в вопросе
  • обновить свой кэш свойств, чтобы получить последние записи в memberOf
  • Перечислять его memberOf записей и посмотреть, если группа, которую вы ищете, присутствует

Что-то вроде:

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"); 

и вы должны быть хорошо.

Update: если вы на .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

0

, когда вы говорите, что это не работает, вы имеете в виду, что вы не можете найти компьютер? Если это так, сначала проверьте, находится ли компьютер в группе, есть хороший инструмент, который называется Active Active Directory expaster, который может вам помочь: http://technet.microsoft.com/en-us/sysinternals/bb963907.aspx Если в группе вы можете попытаться устранить фильтр для имени компьютера на фильтре и перебрать результирующем для того, чтобы выяснить, если ваш элемент есть:

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

Вот некоторые Infos о том, как запросить AD: http://www.codeproject.com/KB/system/everythingInAD.aspx

Смежные вопросы