사용자 주 그룹을 찾으려면 PrimaryGroupID 특성을 사용 하는 방법

요약

여기에서는 사용자의 주 그룹을 찾을 수 있는 효율적인 방법에 설명 합니다.

자세한 내용

배경

이 문서에서 설명 하는 기술을 개발한 전에 모든 도메인에 있는 그룹 개체를 요청 하 고 반환 된 recordset PrimaryGroupID 사용자의 일치 하는 PrimaryGroupToken 사용 하 여 그룹을 찾으려고 하는 Active Directory에 대 한 언어 ActiveX 데이터 개체 (ADO) 경량 디렉터리 액세스 프로토콜 (LDAP) 쿼리를 수행 하는 사용자의 주 그룹을 결정 하는 유일한 방법은 이었습니다. 이 쿼리 시간이 많이 주어진된 도메인에 있는 그룹의 수에 따라 수 있습니다.

그룹 개체의 PrimaryGroupToken 특성입니다. 즉, 특성 Active Directory에 저장 되지 않은 있지만 Active Directory 서비스 인터페이스 (ADSI) 공급자에 의해 클라이언트에서 만들어집니다. 특성이 생성 된 LDAP 쿼리에서 검색 조건에 사용할 수 없습니다.

다음을 고려 하 여 해당 primaryGroup에 대 한 보안 식별자 (SID)를 만들 수는 있습니다.

  • 그룹/사용자 SID를 도메인의 상대 식별자 (RID) 그룹/사용자 RID 더하기 구성 됩니다. 예를 들어가이 사용자 "efg" 및 도메인의 RID가이 사용자에 대 한 SID의 RID, S-1-111-222-333-efg는 경우 S-1-111-222-333.
  • 사용자/그룹 개체의 PrimaryGroupID 특성의 주 그룹은 RID를 보유합니다.
  • 사용자의 주 그룹은 사용자 주 도메인에 있는 그룹 이어야 합니다.
  • 기본 그룹은 SID primaryGroupID 특성은 사용자 개체의 도메인 RID 연결 하 여 작성할 수 있습니다. 예를 들어 도메인 RID S-1-111-222-333 고는 primarygroupID 값 abc 수 있습니다. 주 그룹 SID S-1-111-222-333-abc 것입니다.
이 문서에 제공 된 샘플 코드에서는 RID 사용자의 SID를 제거 하 고 다음 primarygroupID (주 그룹 RID)으로 대체 하 여 사용자의 주 그룹 SID 작성 하는 방법을 보여 줍니다. 코드는 ADsSecurity.dll 파일에 구현 된 IADsSID 개체를 활용 합니다. ADsSecurity.dll 파일에는 소프트웨어 개발 키트 (SDK) 2.5 Active Directory 서비스 인터페이스 (ADSI)의 일부입니다. Active Directory 서비스 인터페이스 SDK 2.5를 다운로드 하려면 다음 Microsoft 웹 사이트를 방문 하십시오.

IADsSID 인터페이스는 원시 SID를 ConvertSidToStringSid API를 사용 하 여 해당 보안 설명자 정의 언어 (SDDL) 형식으로 변환 하기 위한 스크립트 가능한 메서드를 제공 합니다. 이 API는 Windows 2000 및 Windows Server 2003에서 사용할 수만 있습니다.

이 메서드는 Windows NT 4.0 기반 시스템에서 사용 하도록 하기 위해, 몇 가지 유형의 COM 래퍼 DLL 사용 하 여 상응 하는 문자열에 원시 SID 변환 되어야 합니다. 위도우 NT 4.0 SID의 SDDL 형식 빌드하는 방법의 예는 다음 Microsoft 기술 자료 문서에서 제공 됩니다.

286182 원시 SID SID 문자열로 변환 하려면 Microsoft Visual Basic 사용 하는 방법

사용자의 주 그룹 SID 작성 단계

  1. 사용자 개체에 바인딩하십시오.
  2. 사용자 개체의 ObjectSID 속성을 검색 합니다.
  3. 사용자의 SID를 해당 이진 형식에서 변환 하는 IADsSID 개체를 사용 하 여 SDDL 형식입니다.
  4. 사용자의 RID는 SID의 SDDL 형식에서 제거 합니다.
  5. 검색 사용자의 PrimaryGroupID 속성 부호 없는 긴 문자열로 변환 합니다.
  6. PrimaryGroupID의 문자열 표현을 수정한 사용자 SID 추가 합니다.
  7. IADsSID를 사용 하 여 LDAP ADsPath 혹은 Windows NT SID의 SDDL 형식 변환.
  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

속성

문서 ID: 297951 - 마지막 검토: 2017. 2. 6. - 수정: 1

피드백