Проверьте членство в Active Directory. - PullRequest
1 голос
/ 01 февраля 2010

Как мне выполнить итерацию группы, чтобы узнать, является ли данный пользователь членом группы?

Я знаю, что могу использовать IsInRole для объекта WindowsPrincipal, но по какой-то причине он не всегда работает для меня, он не выдает ошибку или не выдает исключение, а просто возвращает false.

Я собрал следующий код из Интернета, может помочь мне улучшить его с точки зрения надежности, он не дал неправильного результата за 3 недели тестирования.

Примечания: 1: У меня нет доступа к имени пользователя и паролю AD, поэтому я использую GC. 2: Группы могут быть созданы в любом домене, но в одном лесу. 3: Группа может иметь пользователей из разных доменов, а также групп.

спасибо

KA

</p> <pre> [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] static extern int CheckTokenMembership(int TokenHandle, byte[] PSID, out bool IsMember); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] static extern bool IsValidSid(byte[] PSID); private bool Authenticate(XmlNodeList XmlNodeGroups) { bool result = false; try { Dictionary<string, List<string>> Groups = GetGroups(XmlNodeGroups); //search global catalog and get SID of the group Byte[] sid = null; foreach (string groupName in Groups.Keys) { using (DirectoryEntry entry = new DirectoryEntry("GC:")) { IEnumerator ie = entry.Children.GetEnumerator(); ie.MoveNext(); using (DirectorySearcher ds = new DirectorySearcher((DirectoryEntry)ie.Current)) { ds.Filter = string.Format("(&(|(sAMAccountName={0}))(objectClass=group))", groupName); using (SearchResultCollection resColl = ds.FindAll()) { if (resColl.Count > 0) { ResultPropertyCollection resultPropColl = resColl[0].Properties; sid = (byte[])resultPropColl["objectsid"][0]; if (sid == null || !IsValidSid(sid)) { // log message and continue to next group continue; } } else { // log message and continue to next group continue; } } bool bIsMember = false; if (CheckTokenMembership(0, sid, out bIsMember) == 0) { // log message and initiate fall back....... use Legacy result = CheckMemberOf(XmlNodeGroups, _CurrentIdentity); break; } else { result = bIsMember ? true : false; if (result) { // debug message break; } else { // debug message } } } } } } catch (Exception ex) { // log exception message and initiate fall back....... use Legacy result = CheckMemberOf(XmlNodeGroups, _CurrentIdentity); } return result; }

Ответы [ 2 ]

2 голосов
/ 01 февраля 2010

Вы на .NET 3.5? Если это так, ознакомьтесь со статьей журнала MSDN Управление принципами безопасности каталогов в .NET Framework 3.5 . Он показывает, насколько проще стало для пользователей и групп в AD.

Что касается вашего требования - вы могли бы

  • найти нужную группу
  • перечислить всех его членов
  • найти, является ли данный пользователь членом этой группы

и все это можно сделать довольно легко с помощью пространства имен System.DirectoryServices.AccountManagement:

// establish a context - define a domain (NetBIOS style name),  
// or use the current one, when not specifying a specific domain
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find the group in question
GroupPrincipal theGroup = GroupPrincipal.FindByIdentity(ctx, "nameOfGroup");

// recursively enumerate the members of the group; making the search
// recursive will also enumerate the members of any nested groups
PrincipalSearchResult<Principal> result = theGroup.GetMembers(true);

// find the user in the list of group members
UserPrincipal user = (result.FirstOrDefault(p => p.DisplayName == "Some Name") as UserPrincipal);

// if found --> user is member of this group, either directly or recursively
if(user != null)
{
     // do something with the user
}
0 голосов
/ 03 февраля 2010

Я попытался использовать ваш фрагмент кода выше для платформы 3.5, и в этой строке мой компилятор говорит, что это неверно:

    // find the user in the list of group members
    UserPrincipal user = (result.FirstOrDefault(p => p.DisplayName == adUser) as UserPrincipal);

Конкретно результат. FirstOfDefault говорит, что это недопустимый параметр.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...