ユーザーのプライマリ グループを検索するのには、PrimaryGroupID 属性の使用方法

文書翻訳 文書翻訳
文書番号: 297951
すべて展開する | すべて折りたたむ

目次

概要

ユーザーのプライマリ グループを検索する効率的な方法を説明します。

詳細

バック グラウンド

この資料に記載されている方法が開発されるまでは、グループ オブジェクト、ドメイン内のすべての要求し、PrimaryGroupID ユーザーの一致、PrimaryGroupToken とグループを検索するのには、返されるレコード セットを参照するには、Active Directory に対してライトウェイト ディレクトリ アクセス プロトコル (LDAP) 方言 ActiveX データ オブジェクト (ADO) クエリを実行するために、ユーザーのプライマリ グループを取得する唯一の方法でした。このクエリは非常に時間がかかり、数に応じて、1 つのドメイン内のグループの場合があります。

グループ オブジェクトの PrimaryGroupToken は、構築された属性です。これは、属性は、Active Directory に格納されませんが、クライアントで Active Directory サービス インターフェイス (ADSI) プロバイダーが構築を意味します。属性を構築するため、LDAP クエリの検索条件に使用できません。

これは、次の条件で、primaryGroup のセキュリティ識別子 (SID) を作成することも可能です。
  • グループ/ユーザーの SID は、ドメインの相対識別子 (RID) にさらにグループやユーザーの RID で構成されます。このユーザーが"efg"とは、ドメインの RID はこのユーザーの SID は、S-1-111-222-333-efg、RID S-1-111-222-333 26.10.10.5 の。
  • プライマリ グループの RID、ユーザ/グループ オブジェクトの PrimaryGroupID 属性を保持します。
  • ユーザーのプライマリ グループは、ユーザーのプライマリ ドメインに存在するグループでなければなりません。
  • プライマリ グループの SID は、ドメイン RID とユーザー オブジェクトの primaryGroupID 属性を連結して構築できます。たとえば、ドメインの RID S-1-111-222-333 であり、primarygroupID の値が abc で可能性があります。プライマリ グループの SID は、S-1-111-222-333-abc になります。
この資料のサンプル コードはその SID がユーザーの RID を削除して、primarygroupID (プライマリ グループ RID) を置き換える、ユーザーのプライマリ グループの SID を作成する方法を示しています。コードは、ADsSecurity.dll ファイルで実装された IADsSID オブジェクトを利用します。ADsSecurity.dll ファイルは、Active Directory サービス インターフェイス (ADSI) ソフトウェア開発キット (SDK) 2.5 の一部です。アクティブなディレクトリ サービス インターフェイスの SDK 2.5 をダウンロードするのには、次のマイクロソフト Web サイトを参照してください。
http://technet.microsoft.com/en-us/library/cc749949.aspx
IADsSID インターフェイスは、ConvertSidToStringSid API を使用して、raw SID をセキュリティ記述子定義言語 (SDDL) 形式に変換するスクリプト可能な方法を提供します。この API は Windows 2000 および Windows Server 2003 で利用可能です。

ために、Windows NT 4.0 ベースのシステムで使用する場合は、このメソッドは、いくつかの種類の COM ラッパー DLL を使用して文字列の対応に raw SID を変換しなければなりません。ウィドー NT 4.0 では、SID の SDDL 形式を構築する方法の例については、以下の Knowledge Base の資料に提供されます。

286182 方法を使用して Raw SID が SID の文字列に変換する Vba

ユーザーのプライマリ グループの SID を作成する手順

  1. ユーザー オブジェクトにバインドします。
  2. 取得、 ObjectSID ユーザー オブジェクトのプロパティです。
  3. ユーザーの SID をバイナリ形式に変換するのには、IADsSID オブジェクトを使用して SDDL 形式です。
  4. オフ、ユーザーの RID は、SID の SDDL 形式を次のように構成します。
  5. ユーザーを取得します。 PrimaryGroupID プロパティとは、符号なしの長い文字列に変換します。
  6. 変更されたユーザーの SID を文字列で表した、PrimaryGroupID を追加します。
  7. IADsSID は、Windows NT または LDAP ADsPath に SID の SDDL 形式を変換するのに使用します。
  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 - 最終更新日: 2011年7月25日 - リビジョン: 8.0
キーワード:?
kbhowto kb32bitonly kbdswadsi2003swept kbmt KB297951 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:297951
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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