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");
Merci de prendre le temps d'expliquer. Cela a du sens et fonctionne un régal. – user474541