如何使用 Visual Basic 和 ADsSecurity.dll 正确 ace 在 ACL 中

文章翻译 文章翻译
文章编号: 269159 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文说明如何使用 ADsSecurity.dll 获取安全描述符 (SD) 的文件、 Active Directory 对象或注册表项。本文演示了如何后一个 SD 已获得,从该 SD 检索自由访问控制列表 (ACL),然后添加适当的位置中的访问控制项 (ACE)。本文提供了一种简单的算法,与 Microsoft Visual Basic 代码示例演示了正确的 ACL 进行排序然后 ACL 写回该 SD.一起

更多信息

IADsAccessControlList::AddAce 方法 ACL 的顶部添加 ACE。在某些种情况下在顶部添加的 ACE 将创建不需要的安全访问权限。Active Directory 服务接口 (ADSI) 属性缓存中的,在 Microsoft Windows Server 2003 和 Microsoft Windows XP 上正确地将订购之前将其写回对象的 DACL。在 Microsoft Windows 2000 上,才要求重新排序。ace 在 ACL 中的正确的顺序如下所示:
将应用于该对象本身的访问被拒绝 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 中 ACE 基于 IADsAccessControlListEntry::AceType 值。
  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。

使用本文中提供的 vba 代码的步骤

  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 + + 可正确的 ace 顺序 ACL
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
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 269159
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 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