您目前已離線,請等候您的網際網路重新連線

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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

269159
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。
結論
本文章顯示如何使用 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 網站:您可以使用 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 ADsSecurityDim sd As IADsSecurityDescriptorDim dacl As IADsAccessControlListDim ace As IADsAccessControlEntryDim newAce As New AccessControlEntry'' Declare temporary ACLs for sorting the original' ACL'Dim newdacl As New AccessControlListDim ImpDenyDacl As New AccessControlListDim ImpDenyObjectDacl As New AccessControlListDim InheritedDacl As New AccessControlListDim ImpAllowDacl As New AccessControlListDim impAllowObjectDacl As New AccessControlListPrivate 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.DiscretionaryAclDebug.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)NextDebug.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_PRESENTnewAce.ObjectType = "{BF967A68-0DE6-11D0-A285-00AA003049E2}"newAce.AccessMask = ADS_RIGHT_DS_READ_PROP Or ADS_RIGHT_DS_WRITE_PROPnewAce.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECTnewAce.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 IfNext'' 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 aceNext'' Implicit Deny Object'For Each ace In ImpDenyObjectDacl  newdacl.AddAce aceNext'' Implicit Allow'For Each ace In ImpAllowDacl  newdacl.AddAce aceNext'' Implicit Allow Object'For Each ace In impAllowObjectDacl  newdacl.AddAce aceNext'' Inherited Aces'For Each ace In InheritedDacl  newdacl.AddAce aceNextsd.DiscretionaryAcl = newdaclDebug.Print DateFor 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.ObjectTypeNext'' 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 - 最後檢閱時間:01/15/2007 09:08:14 - 修訂: 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
意見反應