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

Переводы статьи Переводы статьи
Код статьи: 297951
Развернуть все | Свернуть все

В этой статье

Аннотация

Данная статья является эффективным способом поиска основной группы пользователя.

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

Фон

Прежде, чем метод, описанный в этой статье был разработан, выполнить запрос объектов данных ActiveX (ADO) диалекта Lightweight Directory Access Protocol (LDAP) с Active Directory, чтобы запросить все объекты группы в домене, а затем перейдите по возвращенных записей для поиска группы с PrimaryGroupToken, соответствующей PrimaryGroupID пользователь был единственным способом определить основной группы пользователя. Этот запрос может быть очень много времени, в зависимости от количества групп для данного домена.

PrimaryGroupToken объект группы является построенного атрибута. Это означает, что атрибут не хранится в Active Directory, но создается на клиенте поставщиком интерфейса служб Active Directory (ADSI). Поскольку построенный атрибут нельзя использовать в критериях поиска в LDAP-запрос.

Имеется возможность создавать идентификатор безопасности (SID) для primaryGroup, если учесть следующее:
  • SID для группы или пользователя состоит из домена относительным идентификатором (RID) плюс RID группы или пользователя. Например, если идентификатор безопасности этого пользователя S-1-111-222-333-efg, RID для этого пользователя является «efg» и RID домена равно S-1-111-222-333.
  • PrimaryGroupID атрибут объекта пользователя или группы содержит RID основной группы.
  • Основная группа пользователя должна быть группа, существующая в его основном домене.
  • ИД безопасности основной группы может быть построен путем сцепления RID домена с помощью атрибута primaryGroupID объекта пользователя. Например RID домена может быть S-1-111-222-333 и может иметь значение primarygroupID abc. ИД безопасности основной группы будут S-1-111-222-333-abc.
Пример программы, приведенный в данной статье описывается разработка ИД безопасности основной группы пользователя путем удаления RID пользователя из его идентификатор безопасности и затем замените его primarygroupID (основной группы RID). Код использует объект IADsSID, реализованный в файле ADsSecurity.dll. Файл ADsSecurity.dll является частью интерфейсов служб Active Directory (ADSI) пакета средств разработки программного обеспечения (SDK) 2.5. Загрузить 2.5 SDK интерфейсы службы каталогов Active посетите следующий веб-узел корпорации Майкрософт:
http://TechNet.Microsoft.com/en-us/library/cc749949.aspx
Интерфейс IADsSID обеспечивает сценарных способ преобразования необработанные SID в своей форме языка определения дескрипторов безопасности (SDDL) с помощью интерфейса API ConvertSidToStringSid. Этот API доступен только в Windows 2000 и Windows Server 2003.

Чтобы этот метод, используемый в системе под управлением Windows NT 4.0 необработанные SID должны быть преобразованы в его эквивалент строки посредством использования одного типа обертки COM DLL. Пример того, как построить SDDL-форма ИД безопасности в Widows NT 4.0 приводятся в следующей статье Microsoft Knowledge Base:

286182 Использование Microsoft Visual Basic для преобразования в строковый идентификатор SID необработанные SID

Действия, чтобы создать идентификатор безопасности основной группы пользователя

  1. Привязка к объекту пользователя.
  2. Извлечь ObjectSID свойство объекта пользователя.
  3. Преобразовать SID пользователя из соответствующей двоичной формы в объект IADsSID используется форма SDDL.
  4. Отбросить RID пользователя из SDDL-форма ИД безопасности.
  5. Получить пользователя PrimaryGroupID свойства и преобразовать его в неподписанных длинной строки.
  6. Добавление строковое представление PrimaryGroupID измененного SID пользователя.
  7. Используйте IADsSID для преобразования SDDL-форма ИД безопасности в Windows NT или в путь LDAP.
  8. Связать свойство ADsPath получить любые сведения об основной группы.

Сценария Visual Basic, чтобы найти основной группы для данного свойство ADsPath

'
' The following VBS code illustrates how to determine the primary group
' given an ADsPath as a single argument. The script determines if the
' string passed is a WinNT or LDAP path and then uses the appropriate
' method for retrieving the Primary Group path.
'
' ADsSecurity Constants
'
const ADS_SID_RAW         = 0
const ADS_SID_HEXSTRING	  = 1
const ADS_SID_SAM         = 2
const ADS_SID_UPN         = 3
const ADS_SID_SDDL        = 4
const ADS_SID_WINNT_PATH  = 5
const ADS_SID_ACTIVE_DIRECTORY_PATH = 6
const ADS_SID_SID_BINDING = 7
'-------------------------------------------------
' Function StrRID returns and unsigned long of
' the given RID value
' 
' If the most significant bit is set in a VB Long
' then VB will interpret the value as a negative number
' and CStr will convert the unsigned long into a string with a leading
' "-" sign.
'
' This function checks to see if the most significant bit
' is set, then tricks the CStr function into outputting
' and unsigned long value by using a double float value
' to store the RID value, then uses the CStr function to get the
' string version.
'
function StrRID( inVal )
  dim dLocal
  if( (inVal and &H80000000) <> 0 ) then
    dLocal = CDbl((inval and &H7FFFFFFF))
    dLocal = dLocal + 2^31
    StrRID = cstr(dLocal)
  else
    StrRID = Cstr(inVal)
  end if
end function
'=================================================
' Main Script
'
' Assumes that the first argument is a WinNT or
' LDAP user path
'
set args = WScript.Arguments
WScript.Echo "Start: "& Now
set ADsSid = CreateObject("ADsSID")
'
' Determine if we are using the LDAP or WinNT providers
'
userAdsPath = args(0)
if( InStr(userAdsPath,"LDAP") <> 0 ) then
  '
  ' LDAP ADS Path, need to work with the an Active Directory Path
  '
  ADS_SID_Constant = ADS_SID_ACTIVE_DIRECTORY_PATH
else
  '
  ' WinNT Path, working with the WinNT provider
  '
  ADS_SID_Constant = ADS_SID_WINNT_PATH
end if
'  
' Initialize the IADsSID object and retrieve
' the SDDL form of the SID
'
ADsSID.SetAs ADS_SID_Constant, CStr(userADsPath)
DomainSID = ADsSID.GetAs(ADS_SID_SDDL)
'
' We have the SDDL form of the user's SID.
' Remove the user's RID ( the last sub authority)
' up to the "-"
'
DomainSID = mid(DomainSID,1,(InStrREV(DomainSID,"-")))
'
' Bind to the user object to retrieve the PrimaryGroupID.
' Build the SID of the Primary group
' from the domainSID and the Primary Group RID in
' the PrimaryGroupID.
'
set obj = GetObject(userADsPath)
lngGroupID = obj.Get("primaryGroupID")
strGroupRID = StrRID( lngGroupID )
DomainSID = DomainSID & strGroupRID
'
' Use ADsSID to retrieve a WinNT path or 
' a SID Bind string to locate the LDAP path
'
ADsSID.SetAs ADS_SID_SDDL, CStr(DomainSID)
if( ADS_SID_Constant = ADS_SID_ACTIVE_DIRECTORY_PATH ) then
   '
   ' With the LDAP provider, build a SID bind string and
   ' retrieve the Group object via this bind string
   '
   SIDBindStr = ADsSID.GetAs(ADS_SID_HEXSTRING)
   SIDBindStr = "LDAP://<SID=" & SIDBindStr & ">"
   set oGrp = GetObject(SIDBindStr)
   strPrimaryGroupADsPath = oGrp.Get("DistinguishedName")
   set oGrp = Nothing
else
   '
   ' Its a WinNT path, retrieve the ADsPath for the WinNT object
   '
   strPrimaryGroupADsPath = ADsSID.GetAs( ADS_SID_Constant )
end if
WScript.Echo "Primary group ADS Path for user : " & userADsPath
WScript.Echo "Is: " & strPrimaryGroupADsPath
WScript.Echo "Finished: " & Now
				

Свойства

Код статьи: 297951 - Последний отзыв: 5 июня 2011 г. - Revision: 5.0
Ключевые слова: 
kbdswadsi2003swept kb32bitonly kbhowto kbmt KB297951 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:297951

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

 

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