Active Directory - найти компьютер в группе - PullRequest
0 голосов
/ 15 ноября 2010

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

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 ]

2 голосов
/ 15 ноября 2010

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

Пользователь или компьютер может быть member любого количества групп - но вы должны проверить это для свойства member группы (или 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");

и с тобой все будет в порядке.

Обновление: Если вы работаете в .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 голосов
/ 15 ноября 2010

когда вы говорите, что это не работает, вы имеете в виду, что не можете найти компьютер? Если это так, сначала проверьте, входит ли компьютер в группу, есть хороший инструмент с именем Exporer Active Directory, который может вам помочь: 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

...