Как я узнаю, является ли произвольный DOMAIN\username определенной ролью в C#?
Я действительно новичок в C#, так что прости мое невежество. Мне нужно проверить, находится ли пользователь (DOMAIN\username) в определенной группе, и да, это включает в себя вложенные группы.
Я обнаружил, что WindowsPrincipal.IsInRole()
работает фантастически, когда имеешь дело с текущим вошедшим в систему пользователем. Это не так для меня, хотя. Мне нужно иметь возможность передать произвольный DOMAIN \ username или UPN (я сделаю все, что проще всего реализовать) и получить обратно true/false, если они являются членами группы X, даже если они являются только косвенными членами группа X (например, пользователь является членом группы Y, а группа Y является членом группы X).
Я смотрел на WindowsIdentity
и, возможно, это плохо знакомо с C#, но я просто не видел способа сделать что-то вроде WindowsIdentity("MYDOMAIN\User1")
, Ну, я сделал, но никогда не подходил близко к тому, чтобы заставить его работать.
Используя C# с заданным DOMAIN\username, который не будет текущим вошедшим в систему пользователем, как я могу определить, являются ли они членом DOMAIN\group?
4 ответа
Ответьте на собственный вопрос: я попробовал представленные решения, и не должен был заставить их работать. Обратите внимание, я на 100% уверен, что это связано с моей неопытностью в C#, а не с тем, что опубликовали комментаторы. Люблю и спасибо всем комментаторам, которые выручили.
Что сработало для меня, это: http://ddkonline.blogspot.com/2010/05/how-to-recursively-get-group-membership.html
Мне пришлось сделать некоторые базовые настройки, чтобы приведенное выше решение соответствовало моей ситуации (например, измените параметры LDAP), но в основном это сработало. Возвращает true, если член группы, иначе false. Я надеюсь, что это спасет будущих искателей волос, так как я уже потерял руку. Еще раз спасибо всем, кто отправил помощь.
Вот функция, которую я использую, которая работает, и вы должны иметь возможность использовать ее как есть. Вам, вероятно, придется создать ParseUserDomain
но это довольно просто:
/// <summary>
/// Checks if a user in is a active directory group.
/// <summary>
/// <param name="username">Can contain the domain and username or just username
/// (eg. domain\username or username). If no domain is specified, the default
/// domain is used.</param>
/// <param name="group">Active directory group to check. Group name only. No
/// leading domain as the domain from the user is used.</param>
/// <returns></returns>
public bool UserIsInActiveDirectoryGroup(string username, string group)
{
bool isInGroup = false;
string user = "";
string domain = "";
// Parses off domain and user to seperate values
ParseUserDomain(username, out domain, out user);
if (string.IsNullOrEmpty(user) ||
string.IsNullOrEmpty(domain) ||
string.IsNullOrEmpty(group))
{
return false;
}
using (PrincipalContext ADContext = new PrincipalContext(ContextType.Domain,
domain))
{
using (GroupPrincipal principalGroup =
GroupPrincipal.FindByIdentity(ADContext, group))
{
if (principalGroup != null)
{
using (UserPrincipal ADPrincipalUser =
UserPrincipal.FindByIdentity(ADContext, user))
{
// True means deep search
var users = principalGroup.GetMembers(true);
isInGroup = users.Contains(ADPrincipalUser);
}
}
}
}
return isInGroup;
}
Я ответил рекурсивным запросом в похожей записи в переполнении стека, которая называется " Поиск рекурсивного членства в группах (Active Directory) с использованием C#". Изменение кода, который я дал там, может позволить вам делать то, что вы хотите.
Вы можете использовать LDAP-запрос для этого. Вот хорошая статья