2010-11-15 14 views
0

J'essaie de faire une requête AD très simple pour voir si un ordinateur est dans un groupe. Le code suivant semble assez intuitif mais ne fonctionne pas. LDAPString est un nom entièrement distingué pour le groupe que l'ordinateur référencé par NetBIOSName est un memberOf. Est-ce que quelqu'un peut expliquer pourquoi c'est incorrect et quel est le moyen correct/le plus rapide d'effectuer cette recherche.Active Directory - Trouver un ordinateur dans un groupe

Merci P

Répondre

2

Votre hypothèse de base est mauvaise - un ordinateur (ou utilisateur) ne peut pas être dans un groupe impliquant « confinement » à l'intérieur d'un groupe; un utilisateur ou un ordinateur est uniquement à l'intérieur d'une unité d'organisation.

Un utilisateur ou un ordinateur peut être membre d'un certain nombre de groupes - mais vous devez vérifier contre le membre propriété du groupe (ou la memberOf attribut de l'élément qui est membre de cette groupe).

Ainsi, la manière la plus facile, vraiment, est de

  • se lient à l'objet en question
  • rafraîchir son cache de propriété pour obtenir les dernières entrées dans memberOf
  • Énumérer de ses memberOf entrées et voir si le groupe que vous cherchez est présent

Quelque chose comme:

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; 
} 

Appelez ce comme ceci:

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

et vous devriez être bien.

Mise à jour: si vous êtes sur .NET 3.5, vous pouvez également utiliser le nouvel espace de noms System.DirectoryServices.AccountManagement et LINQ pour rendre les choses encore plus facile:

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; 
} 

et appeler ceci:

// 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

Merci de prendre le temps d'expliquer. Cela a du sens et fonctionne un régal. – user474541

0

quand vous dites que cela ne fonctionne pas, vous voulez dire que vous ne trouvez pas l'ordinateur? Si c'est le cas, vérifiez d'abord si l'ordinateur est dans le groupe, il y a un bon outil nommé Active Directory Exporer qui peut vous aider: http://technet.microsoft.com/en-us/sysinternals/bb963907.aspx Si c'est dans le groupe ce que vous pouvez essayer est d'éliminer le filtre pour le nom de l'ordinateur sur le filtre et itérer sur l'ensemble de résultats afin de savoir si votre élément est là:

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

Voici quelques infos sur la façon d'interroger AD: http://www.codeproject.com/KB/system/everythingInAD.aspx