Visual Basic 및 ADsSecurity.dll 제대로 ACL에 ACE 주문 방법을

기술 자료 번역 기술 자료 번역
기술 자료: 269159 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 파일, Active Directory 개체 또는 레지스트리 키에 대한 보안 설명자 (SD) 얻으려면 ADsSecurity.dll 사용하는 방법을 보여 줍니다. 이 문서에서는 설명합니다 어떻게, 있는 SD, 임의 액세스 제어 목록 (ACL) 해당 SD 검색하고 다음 적절한 위치에 ACE (액세스 제어 항목) 추가 가져온 후에는. 이 문서에서는 간단한 알고리즘을 제대로 ACL을 주문 다음 ACL 위해 SD. 다시 작성하는 방법을 보여 주는 Microsoft VBA 코드 예제에서는 함께 제공합니다.

추가 정보

IADsAccessControlList::AddAce 메서드는 ACE가 ACL에 맨 위에 추가합니다. 경우에 따라서는 원치 않는 보안 액세스를 맨 ACE를 추가하는 만듭니다. ADSI) Active Directory 서비스 인터페이스 (속성 캐시를 Microsoft Windows Server 2003 및 Windows XP 이를 다시 개체에 쓰기 전에 DACL을 순서를 올바르게 합니다. 순서 변경을 Microsoft Windows 2000에서 경우에만 필요합니다. ACL의 ACE 적절한 순서는 다음과 같습니다.
개체 자체에 적용할 액세스-거부 ACE
자식 개체의 속성 집합이나 속성 같은 적용할 액세스-거부 ACE
개체 자체에 적용할 액세스를 허용하는 ACE
속성 집합이나 속성 같은 개체의 자식으로 적용되는 액세스를 허용하는 ACE
이 문서에 나열된 제품에서 제대로 ACL을 주문 메서드를 IADsAccessControlList 인터페이스를 지원하지 않습니다. 이러한 다섯 개의 그룹으로 ACE는 정렬되어야 합니다.
개체에 대한 액세스 거부
자식 또는 속성 액세스 거부
개체에 대한 액세스 허용
자식 또는 속성 액세스 허용
모든 상속된 ACE를
상속된 ACE의 순서를 변경할 수 없습니다. 모든 상속된 ACE를 운영 체제에서 추가하고 적절히 정렬됩니다. 프로그래머가 ACE를 상속할 수 합니다 및 Windows 2000 또는 Windows NT ACE가 자식 개체로 전파하는 중 주의하여 됩니다 지정할 수 있습니다.

전파 규칙을 예외가 있습니다. ACE는 개체에 대한 ACL에 추가한 자동으로 트리에 있는 기존 개체에 적용할 얻을 것입니다 없습니다. 트리 살펴보고 ACE는 기존 개체를 추가하여 ACE는 전파하는 것은 프로그래머의 책임입니다. ACE가 하위 트리 새 개체에 전파됩니다.

ACL의 ACE 정렬 알고리즘

  1. DACL (임의 ACL (DACL) 에서 보안 설명자를 가져옵니다.
  2. (비트 ADS_ACEFLAG_INHERITED_ACE 확인) 상속된 ACE는 경우 참조 IADsAccessControlEntry::AceFlags 확인하십시오.
  3. 어떤 유형의 액세스 권한을 부여하는 ACE가 및 내용 액세스 (해당 개체 자체를 또는 개체의 속성을) 부여됩니다 보려면 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 형식
    ACE는 ADS_ACEFLAG_INHERITED_ACE 플래그가 있는 IADsAccessControlListEntry::AceFlags 설정
  6. 새 ACL 수정 수준이 같은 이전 ACL 설정하십시오.
  7. 보안 설명자의 ACL에 대체하십시오.

이 문서에서 제공하는 Visual Basic 코드에서 사용하는 단계

  1. ADsSecurity.dll을 등록하십시오.

    ADsSecurity.dll Active Directory 서비스 인터페이스 (ADSI) 2.5 Resource Kit 일부입니다. 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 형식 라이브러리
    • 2.5 ADsSecurity 형식 라이브러리
  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 기술 자료의 다음 문서를 참조하십시오.
269175Visual C++ 제대로 ACL에 ACE 주문 방법을
279682ADsSecurity.dll 사용하여 NTFS 폴더에 액세스 제어 엔트리를 추가 방법
Active Directory 클라이언트 확장을 설치하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
288358Active 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 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. 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