Wie Sie Visual Basic und ADsSecurity.dll, um ordnungsgemäß ACEs in einer ACL bestellen

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 269159 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel veranschaulicht die ADsSecurity.dll verwenden, um eine Sicherheitsbeschreibung (SD) für eine Datei, die Active Directory-Objekt oder die Registrierungsschlüssel zu erhalten. Dieser Artikel beschreibt, wie eine SD, wurde abgerufen die wahlfreien Zugriffssteuerungsliste (ACL) aus, dass SD abgerufen und fügen Sie einen ACE (Access Control Entry, ZUGRIFFSSTEUERUNGSEINTRAG) an der richtigen Stelle. Der Artikel bietet einen einfachen Algorithmus zusammen mit der ein Microsoft Visual Basic-Codebeispiel zur Veranschaulichung wie ordnungsgemäß bestellen einer ACL und Schreiben der ACL in der SD. zurück

Weitere Informationen

Die IADsAccessControlList::AddAce-Methode fügt den ACE am oberen Rand der ACL. In einigen Fällen wird das einen ACE am oberen Rand hinzufügen unerwünschten Sicherheitszugriff erstellen. Der Eigenschaftencache Active Directory Service Interfaces (ADSI) unter Microsoft Windows Server 2003 und Microsoft Windows XP wird die DACL korrekt bevor wieder auf das Objekt schreiben bestellen. Neuanordnung ist nur unter Microsoft Windows 2000 erforderlich. Die richtige Reihenfolge der ACEs in einer ACL lautet wie folgt:
Zugriff verweigert ACEs, die auf das Objekt selbst anwenden
Zugriff verweigert ACEs, die auf ein untergeordnetes Objekt, z. B. eine Eigenschaft festgelegt oder -Eigenschaft des anwenden
Zugriff ACEs, die auf das Objekt selbst anwenden
Zugriff gestattet ACEs, die auf ein untergeordnetes Objekt, z. B. eine Eigenschaft festgelegt oder -Eigenschaft des anwenden
In der in diesem Artikel aufgelisteten Produkten unterstützt die IADsAccessControlList-Schnittstelle keine Methode, die ordnungsgemäß eine ACL. Die ACEs müssen in diese fünf Gruppen sortiert werden:
Zugriff verweigert auf das Objekt
Zugriff verweigert auf einer untergeordneten oder -Eigenschaft
Zugriff auf das Objekt
Zugriff auf einer untergeordneten oder -Eigenschaft
Alle geerbten ACEs
Die Reihenfolge der geerbten ACEs sollte nicht geändert werden. Alle geerbten ACEs werden vom Betriebssystem hinzugefügt und werden entsprechend angeordnet. Programmierer kann festlegen, dass ein ACE geerbt werden soll und Windows 2000 oder Windows NT übernimmt der den ACE an untergeordnete Objekte weitergegeben.

Es ist eine Ausnahme den Weitergabe-Regeln. ACEs zur ACL des Objekts hinzugefügt werden nicht automatisch zu vorhandenen Objekten in der Struktur angewendet zu erhalten. Es liegt in der Verantwortung des Programmierers zum Durchlaufen der Struktur und den ACE weitergeben, indem die vorhandenen Objekte den ACE hinzugefügt. Der ACE wird auf neue Objekte in der Unterstruktur weitergegeben werden.

Algorithmus für die Sortierung von ACEs in einer ACL

  1. Erhalten Sie die freigegebene ZUGRIFFSSTEUERUNGSLISTE (DACL) von der Sicherheitsbeschreibung.
  2. Überprüfen Sie die IADsAccessControlEntry::AceFlags, ob der ACE wurde (Überprüfen Sie die ADS_ACEFLAG_INHERITED_ACE-bit) geerbt.
  3. Überprüfen Sie die IADsAccessControlEntry::AceType dahingehend, welche Art von Zugriff der ACE gewährt und was (das Objekt selbst oder die Eigenschaften des Objekts) der Zugriff gewährt wird. Die folgende Liste nennt die ACE-Typ-Werte und deren Bedeutung:
    ADS_ACETYPE_ACCESS_ALLOWED - zulässigen Zugriff auf das gesamte Objekt gewährt
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT - gibt an, der Zugriff einer Eigenschaft oder Eigenschaft zulässig ist
    ADS_ACETYPE_ACCESS_DENIED - verweigert den Zugriff auf das gesamte Objekt
    ADS_ACETYPE_ACCESS_DENIED_OBJECT - verweigert Zugriff auf eine Eigenschaft oder-Eigenschaft festgelegt.
  4. Platzieren Sie den ACE in der entsprechenden temporäre DACL basierend auf dem IADsAccessControlListEntry::AceType-Wert.
  5. Neuerstellung der ACL aus separaten ACLs in der folgenden Reihenfolge:
    ADS_ACETYPE_ACCESS_DENIED ACE-Typen
    ADS_ACETYPE_ACCESS_DENIED_OBJECT ACE-Typen
    ADS_ACETYPE_ACCESS_ALLOWED ACE-Typen
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT ACE-Typen
    ACEs mit ADS_ACEFLAG_INHERITED_ACE-Flag in den IADsAccessControlListEntry::AceFlags festlegen
  6. Legen Sie neue ACL auf die gleichen Revisionsebene als die alte ACL.
  7. Ersetzen Sie die ACL der Sicherheitsbeschreibung.

Schritte, die den Visual Basic-Code zu verwenden, der in diesem Artikel bereitgestellt wird

  1. Registrieren Sie ADsSecurity.dll.

    ADsSecurity.dll ist Teil des Active Directory Service Interfaces (ADSI) 2.5 Resource Kit. ADSI 2.5 Resource Kit downloaden, die folgende Microsoft-Website:
    http://www.microsoft.com/technet/archive/winntas/downloads/adsi25.mspx?mfr=true
    Verwenden Sie Regsvr32, um ADsSecurity.dll zu registrieren. Wenn diese DLL nicht richtig registriert ist, gibt dieses Verhalten, dass ADSI nicht installiert ist. Wenn Sie den Code auf einem Windows NT-Computer oder auf einem Microsoft Windows 98-basierten Computer ausführen, Installieren der entsprechenden Active Directory Client Extension. Weitere Informationen dazu, wie Sie diese Clients erhalten finden Sie unter dem Abschnitt "Informationsquellen".
  2. Starten Sie Visual Basic. Dann erstellen Sie ein standard EXE-Projekt.
  3. Verweise für das Projekt anzeigen. Stellen Sie sicher, dass die Nachverfolgung aktiviert sind:
    • Aktive DS-Typbibliothek
    • ADsSecurity 2.5-Typbibliothek
  4. Nehmen Sie eine Befehlsschaltfläche im Formular.
  5. Doppelklicken Sie auf die Befehlsschaltfläche. Fügen Sie dann den folgenden Code im Ereignishandler Befehl Command1_Click .

Visual Basic-Beispielcode veranschaulicht, wie den Sortierung Algorithmus implementiert

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.
				

Informationsquellen

Weitere Informationen finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:
269175Wie Sie Visual C++ verwenden, um ordnungsgemäß ACEs in einer ACL bestellen
279682Wie Sie ADsSecurity.dll verwenden, um einen Zugriffssteuerungseintrag zu einem NTFS-Ordner hinzufügen
Weitere Informationen zum Installieren von Active Directory Client Extension finden Sie die folgende KB-Artikelnummer:
288358Zum Installieren von Active Directory Client Extension

Eigenschaften

Artikel-ID: 269159 - Geändert am: Montag, 15. Januar 2007 - Version: 7.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Windows Scripting Host 2.5
Keywords: 
kbmt kbdswadsi2003swept kbhowto KB269159 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 269159
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.

Ihr Feedback an uns

 

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