Ваше основное предположение неверно - компьютер (или пользователь) не может быть в группе , что подразумевает «сдерживание» внутри группы; пользователь или компьютер находятся только в подразделении.
Пользователь или компьютер может быть 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");