to zależy o tym, co masz na myśli, jeśli użytkownik jest w grupie AD. W AD grupy mogą być grupą bezpieczeństwa lub grupą dystrybucji. Nawet w przypadku grup bezpieczeństwa zależy to od tego, czy grupy, takie jak "Użytkownicy domeny" czy "Użytkownicy", muszą być uwzględnione w kontroli członkostwa.
IsUserInSecurityGroup będzie sprawdzać tylko grupy bezpieczeństwa i będzie działać dla grup typu Grupy podstawowej, takich jak "Użytkownicy domeny" i "Użytkownicy", a nie grup dystrybucyjnych. Rozwiąże to również problem z zagnieżdżonymi grupami. IsUserInAllGroup również sprawdzi grupy dystrybucyjne, ale nie jestem pewien, czy napotkasz problemy z uprawnieniami. Jeśli nie, użyj konta usługa, która jest w Waag (See MSDN)
Powód nie używam UserPrincipal.GetAuthorizedGroups() dlatego, że ma wiele problemów, takich jak wymagające konto wzywającą być w Waag i wymaganie nie ma wpisu w sIDHistory (See David Thomas' comment)
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;
}
Podobnie jak w przypadku odpowiedzi BC powyższy kod nie będzie testował dla członkostwa zagnieżdżonego –
Ten kod nie kompiluje się nawet w wersji 3.5 C#, jaka jest oferta? – Justin