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