如何使用 Visual Basic 和 ADsSecurity.dll 正確排序 ACL 中的 [ACE

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

在此頁中

結論

本文章顯示如何使用 ADsSecurity.dll 來取得安全性描述元 (SD) 檔案、 Active Directory 物件或登錄機碼。本文將告訴您,如何,一旦一個 SD 已被取得,從該 SD 擷取判別存取控制清單 (ACL),並接著在適當的位置中新增 [存取控制項目 (ACE)。本文提供簡單的演算法與 Microsoft Visual Basic 程式碼範例說明如何適當地訂購 ACL,然後寫回至 [SD.ACL 一起

其他相關資訊

IADsAccessControlList::AddAce 方法會加入 ACE,頂端的 ACL。在某些情況下在頂端加入 ACE 會建立不良的安全性存取權。Active Directory 服務介面 (ADSI) 屬性快取在 Microsoft Windows Server 2003 和 Microsoft Windows XP 上正確地將訂購 DACL 之前寫入回物件。只需在 Microsoft Windows 2000 上重新調整順序。以下是在 ACL 中的 ACE 適當的順序:
套用至物件本身的存取遭到拒絕 ACE
套用至該物件例如屬性集或屬性的子系的拒絕存取的 ACE
套用至物件本身的允許存取的 ACE
允許存取的 ACE 套用至該物件例如屬性集或屬性的子系
本文所列產品,IADsAccessControlList 介面並不支援正確的訂單 ACL 的方法。 ACE 必須排序成這些五個群組:
在物件上拒絕存取
子系或屬性上拒絕存取
在物件上允許存取
子系或屬性上允許存取
所有繼承 ACE
應該不變更繼承的 ACE 的排序作業。 所有的繼承的 ACE 加入由作業系統,並適當地排序。 程式設計人員可以指定應該繼承 ACE,以及 Windows 2000 或 Windows NT 會負責處理的傳播至子物件 ACE。

沒有例外狀況傳用規則。 加入至物件的 ACL 的 ACE 將不會自動取得套用至樹狀結構中的現有物件。 是查核樹狀結構,並將 ACE 傳播者 ACE 加入現有的物件程式設計人員的責任。 ACE 會傳播子樹狀目錄中的新物件上。

排序在 ACL 中的 ACE 的演算法

  1. 從安全性描述元中取得任意 ACL (DACL)。
  2. 請檢查,看看是否 ACE 已 IADsAccessControlEntry::AceFlags 繼承 (位元 ADS_ACEFLAG_INHERITED_ACE 檢查)。
  3. 請檢查以查看何種類型的 ACE 會授與的存取和什麼,授予存取權 (物件本身或物件的屬性) IADsAccessControlEntry::AceType。 下列清單列出 ACE 型別值,其代表的意思:
    ADS_ACETYPE_ACCESS_ALLOWED-授與整個物件的允許的存取
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT-表示允許該存取屬性或屬性集
    ADS_ACETYPE_ACCESS_DENIED-拒絕存取整個物件
    ADS_ACETYPE_ACCESS_DENIED_OBJECT-拒絕存取屬性或屬性集。
  4. 在適當的暫存 DACL,根據 IADsAccessControlListEntry::AceType 值中放置 [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 ADS_ACEFLAG_INHERITED_ACE 旗標的 ACE 設定
  6. 將新的 ACL 設定為舊的 ACL 相同的修訂層級。
  7. 取代安全性描述元上的 ACL。

若要使用本文所提供的 Visual Basic 程式碼的步驟

  1. 註冊 ADsSecurity.dll。

    ADsSecurity.dll 是 Active Directory 服務介面 (ADSI) 2.5 資源工具箱 」 的一部份。如果要下載 ADSI 2.5 資源套件,請造訪下列 Microsoft 網站:
    http://www.microsoft.com/technet/archive/winntas/downloads/adsi25.mspx?mfr=true
    您可以使用 Regsvr32 註冊 ADsSecurity.dll。如果這個 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.
				

?考

如需詳細資訊按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中發行項]:
269175如何使用 Visual C++ 來正確排序 ACL 中的 [ACE
279682如何使用 ADsSecurity.dll NTFS 資料夾?加入存取控制項項目
如需有關如何安裝 Active Directory 用戶端擴充功能的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
288358如何安裝 Active Directory 用戶端延伸模組

屬性

文章編號: 269159 - 上次校閱: 2007年1月15日 - 版次: 7.1
這篇文章中的資訊適用於:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Windows Scripting Host 2.5
關鍵字:?
kbmt kbdswadsi2003swept kbhowto KB269159 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:269159
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。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