Visual Basic と ADsSecurity.dll を使用して正しく、ACL の Ace を注文する方法

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

目次

概要

この資料は、ADsSecurity.dll を使用して、ファイル、Active Directory オブジェクト、レジストリ キーのセキュリティ記述子 (SD) を取得する方法を示します。この資料で説明する方法についてはの SD、その SD から、随意アクセス制御リスト (ACL) を取得し、適切な場所でのアクセス制御エントリ (ACE) を追加するには、取得されると。単純なアルゴリズムが正しく ACL を注文し、ACL が、SD. に書き戻す方法を示す Microsoft Visual Basic コード例と共に説明します

詳細

IADsAccessControlList::AddAce メソッド、ACL の上部に ACE を追加します。場合によっては、先頭に ACE を追加望ましくないセキュリティ アクセスを作成します。Microsoft Windows Server 2003、および Microsoft Windows XP Active Directory サービス インターフェイス (ADSI) のプロパティ キャッシュ バック オブジェクトに書き込み前に DACL が正しく並べられます。並べ替えは、Microsoft Windows 2000 上でのみ必要です。ACL に Ace の適切な順序は次のとおりです。
オブジェクトに適用されるアクセス拒否 Ace
プロパティ セットやプロパティなど、オブジェクトの子に適用されるアクセス拒否 Ace
オブジェクトに適用されるアクセス許可 Ace
プロパティ セットやプロパティなど、オブジェクトの子に適用されるアクセス許可 Ace
この資料に記載した製品の IADsAccessControlList インタ フェースは正しく ACL を注文する方法をサポートしていません。これら 5 つのグループには、Ace を並べ替える必要があります。
オブジェクトにはアクセスが拒否されました
子またはプロパティにはアクセスが拒否されました
オブジェクトのアクセス許可
子またはプロパティのアクセス許可
すべての継承された Ace
継承された Ace の順序変更しないようにします。すべての継承された Ace は、オペレーティング システムによって追加され、適切に並べられます。プログラマは、ACE を継承する必要があります、Windows 2000、または Windows NT は、ACE を子オブジェクトに伝達するの注意が指定できます。

反映規則に例外があります。Ace がオブジェクトの ACL に追加自動的にツリー内の既存のオブジェクトに適用されますされません。それは、ツリーを走査し、既存のオブジェクトに ACE を追加することによって、ACE を反映するのには、プログラマの責任です。エース、サブツリー内の新しいオブジェクトに反映されます。

ACL に Ace の並べ替えアルゴリズム

  1. 随意 ACL (DACL) のセキュリティ記述子を取得します。
  2. (チェックのビット ADS_ACEFLAG_INHERITED_ACE) エースをされたかどうかを IADsAccessControlEntry::AceFlags を継承を確認してください。
  3. エースを与えますアクセスとは、オブジェクト自体またはオブジェクトのプロパティに、アクセスが許可されるの種類を表示するのには、IADsAccessControlEntry::AceType を確認してください。ACE の型の値とその意味を以下に示します。
    ADS_ACETYPE_ACCESS_ALLOWED - 全体のオブジェクトに許可されたアクセスを付与します。
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT - を指定するプロパティまたはプロパティ セットにアクセスが許可されます。
    ADS_ACETYPE_ACCESS_DENIED - 全体のオブジェクトへのアクセスを拒否します。
    ADS_ACETYPE_ACCESS_DENIED_OBJECT では、プロパティまたはプロパティ セットへのアクセスを拒否します。
  4. IADsAccessControlListEntry::AceType 値に基づいて適切な一時的な DACL の ACE を配置します。
  5. 次の順序で別々 の Acl から ACL を再構築します。
    ADS_ACETYPE_ACCESS_DENIED ACE の種類
    ADS_ACETYPE_ACCESS_DENIED_OBJECT ACE の種類
    ADS_ACETYPE_ACCESS_ALLOWED ACE の種類
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT ACE の種類
    IADsAccessControlListEntry::AceFlags の Ace に ADS_ACEFLAG_INHERITED_ACE フラグを設定します。
  6. 古い ACL と同じリビジョン レベルには、新規の ACL を設定します。
  7. セキュリティ記述子の ACL を置き換えます。

この資料に記載された、Visual Basic のコードを使用するための手順

  1. ADsSecurity.dll を登録します。

    ADsSecurity.dll は、Active Directory サービス インターフェイス (ADSI) 2.5 リソース キットの一部です。ADSI 2.5 リソース キットをダウンロードするのには、次のマイクロソフト Web サイトを参照してください。
    http://www.microsoft.com/technet/archive/winntas/downloads/adsi25.mspx?mfr=true
    ADsSecurity.dll を登録するのには、Regsvr32 を使用します。この DLL が正しく登録されない場合は、この現象は ADSI がインストールされていないことを示します。Microsoft Windows NT ベースのコンピューターまたは Microsoft Windows 98 ベースのコンピューター上でコードを実行する場合は、適切な Active Directory クライアント エクス テンションをインストールします。これらのクライアントを入手する方法の詳細については、「関連情報」セクションを参照してください。
  2. Visual Basic を起動します。次に、標準 EXE プロジェクトを作成します。
  3. ビュー、 参照 プロジェクトです。選択されているかどうかを確認します。
    • アクティブな DS タイプ ライブラリ
    • ADsSecurity 2.5 タイプ ライブラリ
  4. フォームにコマンド ボタンを確認します。
  5. コマンド ボタンをダブルクリックします。次のコードを貼り付け、 Command1_Click コマンド ハンドラー。

サンプル コードの Visual Basic ソート アルゴリズムを実装する方法を示しています。

Dim sec As New ADsSecurity
Dim sd As IADsSecurityDescriptor
Dim dacl As IADsAccessControlList
Dim ace As IADsAccessControlEntry
Dim newAce As New AccessControlEntry
'
' Declare temporary ACLs for sorting the original
' ACL
'
Dim newdacl As New AccessControlList
Dim ImpDenyDacl As New AccessControlList
Dim ImpDenyObjectDacl As New AccessControlList
Dim InheritedDacl As New AccessControlList
Dim ImpAllowDacl As New AccessControlList
Dim impAllowObjectDacl As New AccessControlList

Private Sub Command1_Click()
'
' Be sure to register ADsSecurity.Dll using RegSvr32 and
' adding the ADsSecurity2.5 Type Library to you references for
' the project.
'
' Using the ADsSecurity object, retrieve a SD for an object.  Just
' Replace the LDAP:// path with the path of an object that contains a
' SD.  For additional details on valid path strings, review
' the information stored in the Platform SDK ADSI samples starting with
' "<Platform SDK Root>\Samples\NetDs\ADSI\rtk.htm"
'
Set sec = CreateObject("ADsSecurity")<BR/>
' TODO :  replace the servername and DN of the object you want to modify.
Set sd = sec.GetSecurityDescriptor("LDAP://MyDCname/cn=MyUser,cn=Users,dc=MyDom,dc=com")

'Displaying the ACE in the DACL --- it's the same way you display ACEs for File, File Share, Registry, Exchange, and Active Directory's ACL.

Set dacl = sd.DiscretionaryAcl
Debug.Print Date & Time & "Initial Values of DACL"
For Each ace In dacl
   Debug.Print ace.Trustee
   Debug.Print Hex(ace.AccessMask)
   Debug.Print Hex(ace.AceType)
   Debug.Print Hex(ace.AceFlags)
   Debug.Print Hex(ace.Flags)
Next

Debug.Print dacl.AceCount

'
' Initialize all of the new ACLs
'
' If you are doing this in VBSscript you will need to use
' The following methods of creating the ACL bins instead of
' using the Dim As New statements above. 
'
'Set newAce = CreateObject("AccessControlEntry")
'Set newdacl = CreateObject("AccessControlList")
'Set InheritedDacl = CreateObject("AccessControlList")
'Set ImpAllowDacl = CreateObject("AccessControlList")
'Set InhAllowDacl = CreateObject("AccessControlList")
'Set ImpDenyObjectDacl = CreateObject("AccessControlList")
'Set ImpAllowObjectDacl = CreateObject("AccessControlList")
'
'
' Create a new ace, this one
' sets an extended right on the user object that allows the
' trustee to read and write the userAccountControl property of an
' user object.
'
' TODO : Replace the trustee with an appropriate trustee on the domain
' in question.
'
newAce.Trustee = "MyDomain\Myuser"
newAce.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT
newAce.ObjectType = "{BF967A68-0DE6-11D0-A285-00AA003049E2}"
newAce.AccessMask = ADS_RIGHT_DS_READ_PROP Or ADS_RIGHT_DS_WRITE_PROP
newAce.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
newAce.AceFlags = ADS_ACEFLAG_INHERIT_ACE
'
' Place the new ace in the DACL
'
dacl.AddAce newAce
'
' Sift the DACL into 5 bins:
' Inherited Aces
' Implicit Deny Aces
' Implicit Deny Object Aces
' Implicit Allow Aces
' Implicit Allow object aces
'
For Each ace In dacl
  '
  ' Sort the original ACEs into their appropriate
  ' ACLs
  '
  Debug.Print ace.Trustee
  If ((ace.AceFlags And ADS_ACEFLAG_INHERITED_ACE) = ADS_ACEFLAG_INHERITED_ACE) Then
     '
     ' Do not really care about the order of inherited aces. Since we are
     ' adding them to the top of a new list, when they are added back
     ' to the Dacl for the object, they will be in the same order as
     ' they were originally. Just a positive side effect of adding items
     ' of a LIFO (Last In First Out) type list.
     '
     InheritedDacl.AddAce ace
  Else
     '
     ' We have an Implicit ACE, let's put it the proper pool
     '
     Select Case ace.AceType
     Case ADS_ACETYPE_ACCESS_ALLOWED
        '
        ' We have an implicit allow ace
        '
        ImpAllowDacl.AddAce ace
     Case ADS_ACETYPE_ACCESS_DENIED
        '
        ' We have an implicit Deny ACE
        '
        ImpDenyDacl.AddAce ace
     Case ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
        '
        ' We have an object allowed ace
        ' Does it apply to a property? or an Object?
        '
        impAllowObjectDacl.AddAce ace
     Case ADS_ACETYPE_ACCESS_DENIED_OBJECT
        '
        ' We have an object Deny ace
        '
        ImpDenyObjectDacl.AddAce ace
     Case Else
        '
        ' Missed a bin?
        '
        Debug.Print "Bad ace...." & Hex(ace.AceType)
     End Select
  End If
Next
'
' Combine the ACEs in the proper order
' Implicit Deny
' Implicit Deny Object
' Implicit Allow
' Implicit Allow Object
' Inherited aces
'
' Implicit Deny
'
For Each ace In ImpDenyDacl
  newdacl.AddAce ace
Next
'
' Implicit Deny Object
'
For Each ace In ImpDenyObjectDacl
  newdacl.AddAce ace
Next
'
' Implicit Allow
'
For Each ace In ImpAllowDacl
  newdacl.AddAce ace
Next
'
' Implicit Allow Object
'
For Each ace In impAllowObjectDacl
  newdacl.AddAce ace
Next
'
' Inherited Aces
'
For Each ace In InheritedDacl
  newdacl.AddAce ace
Next

sd.DiscretionaryAcl = newdacl
Debug.Print Date
For Each ace In newdacl
   Debug.Print ace.Trustee
   Debug.Print "Ace Mask: " & Hex(ace.AccessMask)
   Debug.Print "Ace Type: " & Hex(ace.AceType)
   Debug.Print "Ace Flags: " & Hex(ace.AceFlags)
   Debug.Print "Object Type value: " & Hex(ace.Flags)
   Debug.Print "Object Guid : " & ace.ObjectType
Next
'
' Set the appropriate revision level
' for the DACL
'
newdacl.AclRevision = dacl.AclRevision
'
' Replace the Security Descriptor
'
sec.SetSecurityDescriptor sd
' If this generates the error -214023559 or 80070539 check your TODO
' strings.  This error is most likely a problem with DNS name resolution.
				

関連情報

詳細については、マイクロソフト サポート技術記事を表示するのには、次の資料番号をクリックしてください。
269175Visual C を使用して正しく、ACL の Ace を注文する方法
279682 ADsSecurity.dll を使用して、NTFS フォルダーにアクセス制御エントリを追加する方法
Active Directory クライアント エクス テンションをインストールする方法の詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
288358Active Directory クライアント エクス テンションをインストールする方法

プロパティ

文書番号: 269159 - 最終更新日: 2011年7月24日 - リビジョン: 9.0
キーワード:?
kbhowto kbdswadsi2003swept kbmt KB269159 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:269159
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