如何使用 PrimaryGroupID 屬性來尋找使用者的主要群組

文章翻譯 文章翻譯
文章編號: 297951 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您,有效率的方法來尋找使用者主要群組。

其他相關資訊

背景

本文所述的技巧開發之前唯一的方法來判斷使用者的主要群組就是執行對 Active Directory 以要求所有群組物件,該網域中,並瀏覽要搜尋的符合使用者 PrimaryGroupID 的 PrimaryGroupToken 具有群組傳回資料錄集的輕量型目錄存取通訊協定 (LDAP) 方言 ActiveX 資料物件 (ADO) 查詢。 這項查詢可能非常耗時,指定網域中的群組數目而定。

群組物件 PrimaryGroupToken 是建構的屬性。這表示該屬性並不會儲存在 Active Directory,但由 Active Directory 服務介面 (ADSI) 提供者建構用戶端上。因為建構屬性,所以它不能用於 LDAP 查詢中的搜尋準則。

很可能為 primaryGroup 建置安全性識別元 (SID),藉由在考慮下列:
  • 群組/使用者的 SID 會再加上群組/使用者 RID 組成網域的相關識別元 (RID)。 為範例,如果這個使用者的 SID 是 S-1-111-222-333-efg 此使用者的 RID efg 」,而且該網域的 RID 是 S-1-111-222-333。
  • 使用者/群組物件上的 PrimaryGroupID 屬性保留 RID 的主要群組。
  • 使用者的主要群組必須存在於使用者的主要網域中的群組。
  • 可以藉由串連網域 RID 與使用者物件的 primaryGroupID 屬性建置主要群組的 SID。 比方說網域 RID 可能是 S-1-111-222-333,而且此數值的 primarygroupID 可能是 abc。然後會 S-1-111-222-333-abc 主要群組的 SID。
本文提供的程式碼範例說明如何藉由移除其 SID 的使用者的 RID,然後再將它取代 primarygroupID (主要群組 RID) 來建立一位使用者的主要群組的 SID。 程式碼會善用 IADsSID 物件 ADsSecurity.dll 檔案中實作。ADsSecurity.dll 檔案是 Active Directory 服務介面 (ADSI) 軟體開發套件 (SDK) 2.5 的一部分。如果要下載 Active Directory 服務介面 SDK 2.5,請造訪下列 Microsoft 網站:
http://technet.microsoft.com/en-us/library/cc749949.aspx
IADsSID 介面提供可編寫指令碼的方法,藉由使用 ConvertSidToStringSid API 將原始的 SID 轉換成它的安全性描述元定義語言 (SDDL) 表單。 這個 API 才可以在 Windows 2000 和 Windows Server 2003。

這個方法,以在 Windows NT 4.0 為基礎的系統使用以便原始的 SID 必須轉換成它的字串相對透過某些類型的 COM 包裝函式 DLL 的使用。 如何建置一個 SID SDDL 形式上 Widows NT 4.0 的範例提供下列 「 Microsoft 知識庫 」 文件中:

286182如何使用 Microsoft Visual Basic,將未經處理的 SID 轉換成字串 SID

建置主要群組的使用者 SID 的步驟

  1. 繫結至使用者物件。
  2. 擷取 ObjectSID 屬性的使用者物件。
  3. 使用 IADsSID 物件轉換成其二進位形式使用者的 SID 是 SDDL 形式。
  4. 去除關閉使用者的 RID 從 SDDL 表單的 SID。
  5. 擷取使用者的 PrimaryGroupID 屬性,並將它轉換成不帶正負號的長字串。
  6. 將 [PrimaryGroupID 字串表示附加至修改過的使用者 SID。
  7. 用以將 SID SDDL 形式轉換成它的 Windows NT 或 LDAP ADsPath IADsSID。
  8. 繫結至 [ADsPath,以取得有關您想要的主要群組的任何資訊。

找不到主要群組為給定的 ADsPath Visual Basic 指令碼

'
' 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 - 上次校閱: 2007年1月15日 - 版次: 6.2
這篇文章中的資訊適用於:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 3
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 4
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 5
  • Microsoft Active Directory Client Extension?應用於:
    • Microsoft Windows NT 4.0
關鍵字:?
kbmt kbdswadsi2003swept kb32bitonly kbhowto KB297951 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:297951
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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