Это зависит от того, что вы имеете в виду, если пользователь находится в группе AD.В AD группы могут быть группой безопасности или группой рассылки.Даже для групп безопасности это зависит от того, нужно ли включать в проверку членства такие группы, как «Пользователи домена» или «Пользователи».
IsUserInSecurityGroup будет проверять только группы безопасности и будет работать для групп основных типов.как «Пользователи домена» и «Пользователи», а не группы рассылки.Это также решит проблему с вложенными группами.IsUserInAllGroup также проверит наличие групп рассылки, но я не уверен, что у вас возникнут проблемы с разрешениями.Если вы это сделаете, используйте учетную запись службы, которая находится в WAAG ( См. MSDN )
Причина, по которой я не использую UserPrincipal.GetAuthorizedGroups (), заключается в том, что у нее много проблем, таких кактребование, чтобы вызывающая учетная запись была в WAAG, и отсутствие записи в SidHistory ( См. комментарий Дэвида Томаса )
public bool IsUserInSecurityGroup(string user, string group)
{
return IsUserInGroup(user, group, "tokenGroups");
}
public bool IsUserInAllGroup(string user, string group)
{
return IsUserInGroup(user, group, "tokenGroupsGlobalAndUniversal");
}
private bool IsUserInGroup(string user, string group, string groupType)
{
var userGroups = GetUserGroupIds(user, groupType);
var groupTokens = ParseDomainQualifiedName(group, "group");
using (var groupContext = new PrincipalContext(ContextType.Domain, groupTokens[0]))
{
using (var identity = GroupPrincipal.FindByIdentity(groupContext, IdentityType.SamAccountName, groupTokens[1]))
{
if (identity == null)
return false;
return userGroups.Contains(identity.Sid);
}
}
}
private List<SecurityIdentifier> GetUserGroupIds(string user, string groupType)
{
var userTokens = ParseDomainQualifiedName(user, "user");
using (var userContext = new PrincipalContext(ContextType.Domain, userTokens[0]))
{
using (var identity = UserPrincipal.FindByIdentity(userContext, IdentityType.SamAccountName, userTokens[1]))
{
if (identity == null)
return new List<SecurityIdentifier>();
var userEntry = identity.GetUnderlyingObject() as DirectoryEntry;
userEntry.RefreshCache(new[] { groupType });
return (from byte[] sid in userEntry.Properties[groupType]
select new SecurityIdentifier(sid, 0)).ToList();
}
}
}
private static string[] ParseDomainQualifiedName(string name, string parameterName)
{
var groupTokens = name.Split(new[] {"\\"}, StringSplitOptions.RemoveEmptyEntries);
if (groupTokens.Length < 2)
throw new ArgumentException(Resources.Exception_NameNotDomainQualified + name, parameterName);
return groupTokens;
}