Лучший способ быстро определить, является ли учетная запись пользователя членом AD группы?

Скорее всего, ваш фреймворк ожидает от вас вывода bytes, таким образом:

await wbsocket.send(json.dumps(...).encode(...))

Пара нитов:

  • b64encode могут быть декодированы с помощью «ascii» так же как и «utf-8» из-за ограниченного набора символов base64
  • json.dumps по умолчанию экранирует юникод, поэтому .encode("utf-8") и .encode("ascii") должны давать одинаковый результат
  • [116 ] в документах не указывается, ожидает ли ввод, а вывод производит str или bytes ...
9
задан GEOCHET 10 March 2009 в 02:26
поделиться

4 ответа

Если Вы находитесь на.NET 3,5 стека, блок System.DirectoryServices.AccountManagement.dll имеет хороший API сверху AD. Следующий метод может быть реализован для решения проблемы:

static bool IsUserMemberOf(string userName, string groupName)
{
    using (var ctx = new PrincipalContext(ContextType.Domain))
    using (var groupPrincipal = GroupPrincipal.FindByIdentity(ctx, groupName))
    using (var userPrincipal = UserPrincipal.FindByIdentity(ctx, userName))
    {
        return userPrincipal.IsMemberOf(groupPrincipal);
    }
}

// Usage:
bool result = IsUserMemberOf("CONTOSO\\john.doe", "CONTOSO\\Administrators");

Я не знаю, как этот метод работает, но это - чистое решение.

19
ответ дан 4 December 2019 в 09:14
поделиться

Вот другой способ использовать искателя каталога и memberOf. Это использует текущих пользователей objectSID, но Вы могли изменить это на некоторый другой идентификатор.

dSearch.Filter = String.Format("(&(memberOf={0})(objectSid={1}))", groupDN, WindowsIdentity.GetCurrent.User)

Return dSearch.FindOne() IsNot Nothing

если Ваша попытка использовать ввод данных пользователем, который мог бы содержать недопустимые символы, необходимо всегда выходить из них...

searchName = searchName.Replace("\", "\5c"). _
                                Replace("/", "\2f"). _
                                Replace("*", "\2a"). _
                                Replace("(", "\28"). _
                                Replace(")", "\29")
1
ответ дан 4 December 2019 в 09:14
поделиться

Вот то, что я использовал в прошлом в VBS Script, который работал очень хорошо:

Set wshNet = CreateObject("WScript.Network")                'Setup connection to the Network
Set fso = CreateObject("Scripting.FileSystemObject")        'Create File System Object for any file manipulations

Set ADSysInfo = CreateObject("ADSystemInfo")                'Setup connection to Active Directory
Set CurrentUser = GetObject("LDAP://" & ADSysInfo.UserName) 'Setup current user to look for in Active Directory
strGroups = LCase(Join(CurrentUser.MemberOf))               'Grabs all the groups the current user is a member of

Я затем использую InStr, чтобы видеть, является ли пользователь частью той группы:

If InStr(strGroups, "MyGroup") Then MyGroupSub

Вы смогли адаптировать вышеупомянутое в своем проекте.

Между прочим, я заметил, что в Вашем коде у Вас есть groupdoman как Ваш последний параметр для 'группы', Не уверенной, если Вы хотели, чтобы это было groupdomain или нет:

Тусклая группа Как DirectoryEntry = GetNetworkObject (GroupDomanName, NetworkObjectType. NetworkGroup, GroupName, groupdoman)

по сравнению с

Тусклая группа Как DirectoryEntry = GetNetworkObject (GroupDomanName, NetworkObjectType. NetworkGroup, GroupName, groupdomain)

Сообщите мне, помогает ли это! JFV

2
ответ дан 4 December 2019 в 09:14
поделиться

Я нашел ответ, который, кажется, работает в СЕТЕВЫХ 2.0, относительно быстр и преодолевает возможную проблему групп, содержащих больше чем 100 объектов (которые требуют поиска диапазона),

Вот код, с которым я волновал:

Dim DSearcher As New DirectorySearcher(group, "(&(objectClass=user)(cn=" + Login + "))", New String() {"member;Range=0-5000"}, SearchScope.OneLevel)                  
group = GetNetworkObject(GroupDomanName, NetworkObjectType.NetworkGroup, GroupName)
user = GetNetworkObject(UserDomainName, NetworkObjectType.NetworkUser, Login)
DSearcher.AttributeScopeQuery = "member"
Return (DSearcher.FindOne() IsNot Nothing)
1
ответ дан 4 December 2019 в 09:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: