Использование собственных компонентов ADSI найдите основной группы

Переводы статьи Переводы статьи
Код статьи: 321360 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В этой статье объясняется, как использовать собственные компоненты интерфейса служб Active Directory (ADSI) для определения членства основной группы пользователя.

Дополнительная информация

Как основной группы хранится в объекте пользователя в Active Directory

Каждый контекст безопасности объекта (например, пользователей и групп безопасности) в Active Directory имеет атрибут идентификатор безопасности, связанные с ним. SID имеет несколько компонентов, как описано в справочнике «Компоненты SID», содержатся в разделе «Ссылки» данной статьи. Два из этих компонентов на SID, домен относительных идентификаторов (RID) и RID определенного объекта в пределах домена.

Основная группа пользователя хранится на (как группы RID в домене пользователя) PrimaryGroupID атрибут объекта пользователя. Основная группа может быть только группу, которая существует в том же домене, что и пользователь, и эта группа должна быть группа, членом которых является пользователь. Кроме того это Группа объект в Active Directory имеет атрибут, именуемый PrimaryGroupToken, хранящий RID для этой группы в пределах домена.

Поставщики Windows NT и протокола LDAP (Lightweight Directory Access Protocol) позволяет программистам Изменение основной группы пользователя, установив PrimaryGroupID значение атрибута RID группы, членом которых является пользователь. Если пользователь не является членом группы, пользователь PrimaryGroupID не может быть присвоено значение RID группы.

Когда используется поставщик Windows NT в ADSI, основная группа включается как вход пользователя IADsUser::Groups Коллекция.

С помощью поставщика LDAP — это основная группа не включены как запись в IADsUser::Groups коллекции, и не является частью различающееся имя (DN) группы Член групп атрибут объекта пользователя в каталоге. Группа RID в PrimaryGroupID Это единственное место, в котором основной группы пользователя ссылается на объект пользователя LDAP.

Ни один поставщик определяет механизм, позволяющий определить имя основной группы пользователя непосредственно из своих соответствующих пользовательских объектов. Проблема становится еще более сложные фактом каждого объекта группы для каждого поставщика поддерживает другой набор атрибутов, как показано ниже:
  • Объект группы, предоставляемые Windows NT не поддерживает PrimaryGroupToken атрибут, а также поддержка поставщиков Windows NT выполняет ли другие способы извлечения группы по ИЗБАВИТЬСЯ с помощью собственного кода ADSI.
  • В PrimaryGroupToken атрибут объекта группы поставщика LDAP — это вычисляемый атрибут. Этот атрибут не существует в каталоге объекта группы. Атрибут по сути, создается при запросе клиентом с IADs::GetInfoEx вызов метода. Не выполнять поиск LDAP на основе атрибутов, построенного в Active Directory. Таким образом, нельзя провести поиск с помощью поставщика LDAP для группы на основе PrimaryGroupToken атрибут, который соответствует PrimaryGroupID атрибут объекта пользователя, основную группу которого нужно определить. Это также правила чисто ADSI решение, которое не зависит от внешних COM-объект для определения основной группы.

Способы определения основной группы пользователя

Ниже приведены три известные методы, чтобы определить имя основной группы пользователя.
  • Построить ИД безопасности строка для элемента RID группы объектов в Active Directory из компонента RID домена SID пользователя и группы на PrimaryGroupID атрибут объекта пользователя.

    Это метод, описанный в статье базы Знаний Майкрософт Q297951 (содержатся в разделе «Ссылки» данной статьи). Основная проблема этого метода — что построить строку привязки SID, программист должен полагаться на ADsSID объект для преобразования в SDDL-форма двоичный дескриптор безопасности объекта домена. В ADsSID объект размещается файл ADsSecurity.dll, который необходимо скопировать и зарегистрированных со стороны клиента до успешного запуска кода.
  • Используйте запрос LDAP для поиска всех групп в домене и возврат их PrimaryGroupToken атрибут.

    Этот метод является чистым решением LDAP. Тем не менее сценарию решения не очень эффективен, поскольку этот поиск возвращает все группы в домене, даже те, которые пользователь не является членом коллекции; а поскольку PrimaryGroupToken атрибут создается на стороне клиента, как обход набора записей, поиск довольно долгое время. Этот метод может быть особенно много времени при наличии большого числа групп в домене. Существует множество примеров создания диалектом LDAP запросов ADO и поэтому они не включаются в этой статье.
  • Воспользоваться преимуществами функций каждого поставщика для создания комбинированного решения.

    Это решение позволяет пользоваться преимуществами возможностей различных поставщиков для определения основной группы пользователя. Чтобы сделать это, выполните следующие действия.
    1. Выполнить привязку к объекту пользователя с поставщиком Windows NT.

      Объект пользователя Windows NT содержит группы, гарантированно содержит основной группы пользователя. Кроме того PrimaryGroupID пользователя хранится объект сразу во временном местоположении во время этого алгоритма.
    2. Перечислить IADsUser::Groups Коллекция.
    3. Извлечь SamAccountName Свойство ADsPath для каждой группы в этой коллекции, а затем построить строку запроса диалекта LDAP для поиска всех групп с SamAccountName свойства, перечисленные в этой коллекции, возвращая их PrimaryGroupToken и DistinguishedName значения атрибутов.
    4. Запуск поиска ADO ADSI и затем в цикле набор записей, сравнение каждой группы PrimaryGroupToken В консоли восстановления команда PrimaryGroupID значение атрибута, ранее в кэше.
    5. Если соответствие найдено, остановить и отобразить различающееся имя для этой группы в качестве основной группы пользователя.
    6. Если совпадения не найдены, продолжайте циклическое считывание результатов поиска.
    Достоинство этого метода немедленно очевидны. Все объекты, используемые в собственном ADSI и не требуют дополнительных компонентов. Кроме того перечисление содержит только те группы, которые могут быть основной группы.

    Тем не менее, следует иметь в виду следующие недостаток: при IADsUser::Groups Перечисление коллекции, возвращается IADs интерфейс для членов группы. Если по некоторым причинам, пользователь, выполняющий перечисление не имеет необходимых разрешений для открытия определенного объекта, перечисление останавливается не Обнаружив ошибку. В следующем коде демонстрируется, как реализовать алгоритм выше:
    dim oUsr 
    dim oGrp 
    
    '
    ' ToDo: Change the following variables to specific values for your domain.
    ' 
    DomainName = "myDomain"
    UserLoginName = "myUserLoginName"
    
    '
    ' Bind to the user object with the Windows NT provider.
    ' 
    set oUsr = GetObject("WinNT://" & DomainName & "/" & UserLoginName & ",user") 
    set grp = oUsr.Groups 
    GrpID = oUsr.PrimaryGroupID 
    GrpName = "" 
    
    '
    ' Building Query Filter for the search for all the groups that the user is a member of.
    '
    QueryFilter = "(|"
    for each Item in Grp 
       NT4Name = replace(Item.ADsPath,"WinNT://","") 
       tempArray = split(nt4Name,"/") 
       NT4Name = tempArray(1)
       QueryFilter = QueryFilter & "(samAccountName=" & NT4Name & ")"
    next
    QueryFilter = QueryFilter & ")"
    
    '
    ' Building LDAP dialect Query String.
    '
    QueryString = "<LDAP://" & DomainName & ">;" & QueryFilter & ";PrimaryGroupToken,distinguishedName;subtree"
    
    '
    ' Performing Query against the Active Directory for all the groups that 
    ' the user belongs to and retrieving the RID of the group object off
    ' the PrimaryGroupToken attribute on the user.
    '
    Dim oConnection, oCommand, oRecordset
    Set oConnection = CreateObject("ADODB.Connection")
    Set oCommand = CreateObject("ADODB.Command")
    
    oConnection.Provider = "ADsDSOObject"
    oConnection.Open "Active Directory Provider"
    
    Set oCommand.ActiveConnection = oConnection
    oCommand.CommandText = QueryString
    oCommand.Properties("Page Size") = 900
    
    Set oRecordset = oCommand.Execute
    
    '
    ' Looping through all the records in the search result to determine whether
    ' any of these group's PrimaryGroupToken attribute value match the 
    ' PrimaryGroupID attribute value stored on the user object.
    '
    While ((NOT oRecordset.EOF) and (Not bGroupFound))
      if (GrpID = oRecordset.Fields("PrimaryGroupToken").value) then
        GrpName = oRecordset.Fields("DistinguishedName").Value
        bGroupFound = True 
      End If
      oRecordset.moveNext
    Wend
    
    Set oRecordset = Nothing
    Set oCommand = Nothing
    Set oConnection = Nothing
    
    '
    ' Displaying Results of the search.
    ' 
    if( bGroupFound ) then 
       WScript.Echo "Primary Group for " & oUsr.AdsPath 
       WScript.Echo "Is: " & GrpName 
    else 
       WScript.Echo "Primary Group Not Found" 
    end if
    					

Ссылки

Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
297951Использование атрибута PrimaryGroupID найти основной группы пользователя

Свойства

Код статьи: 321360 - Последний отзыв: 8 июня 2011 г. - Revision: 3.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • операционная система Microsoft Windows 2000 Server
Ключевые слова: 
kbdswadsi2003swept kbinfo kbmt KB321360 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:321360

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com