Τρόπος χρήσης της Visual Basic και ADsSecurity.dll για σωστή σειρά ACE που σε ένα ACL

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 269159
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Αυτό το άρθρο παρουσιάζει τον τρόπο χρήσης ADsSecurity.dll για να αποκτήσετε μια περιγραφή ασφαλείας (SD) για ένα αρχείο, το αντικείμενο της υπηρεσίας Active Directory ή το κλειδί μητρώου. Αυτό το άρθρο επιδεικνύει τον τρόπο, αφού έχει ήδη αποκτήσει ένα SD, να ανακτήσει τη λίστα διακριτικού ελέγχου πρόσβασης (ACL) από αυτόν SD και στη συνέχεια, προσθέστε μια καταχώρηση ελέγχου πρόσβασης (ACE) στην κατάλληλη θέση. Το άρθρο παρέχει μια απλή αλγόριθμο μαζί με ένα παράδειγμα κώδικα Microsoft Visual Basic που απεικονίζουν τον τρόπο σωστά παραγγείλετε ένα ACL μετά την εγγραφή της ACL στο SD.

Περισσότερες πληροφορίες

Η μέθοδος IADsAccessControlList::AddAce προσθέτει το ACE στο επάνω μέρος της ACL. Σε ορισμένες περιπτώσεις, η προσθήκη μιας καταχώρησης ελέγχου ΠΡΌΣΒΑΣΗΣ στο επάνω μέρος θα δημιουργήσει ανεπιθύμητα ασφαλείας πρόσβασης. Στη μνήμη cache ιδιοτήτων Active Directory Service Interfaces (ADSI) στον Microsoft Windows Server 2003 και στα Microsoft Windows XP θα παραγγείλετε σωστά το DACL πριν από την εγγραφή ξανά στο αντικείμενο. Αναδιάταξη απαιτείται μόνο στα Microsoft Windows 2000. Η σωστή σειρά ACE που ένα ACL είναι ως εξής:
ACE που δεν επιτρέπεται η πρόσβαση που ισχύουν για το ίδιο το αντικείμενο
ACE που δεν επιτρέπεται η πρόσβαση, που εφαρμόζονται σε θυγατρικό του αντικειμένου, όπως μια ιδιότητα ή ιδιότητα
ACE που επιτρέπεται πρόσβαση που ισχύουν για το ίδιο το αντικείμενο
ACE που επιτρέπεται πρόσβαση που εφαρμόζονται σε θυγατρικό του αντικειμένου, όπως μια ιδιότητα ή ιδιότητα
Στα προϊόντα που αναφέρονται σε αυτό το άρθρο, η διασύνδεση IADsAccessControlList δεν υποστηρίζει μια μέθοδο που ταξινομεί σωστά ένα ACL. Τα ACE που πρέπει να ταξινομηθούν σε αυτές τις πέντε ομάδες:
Άρνηση πρόσβασης στο αντικείμενο
Η πρόσβαση επιτρέπεται σε ένα θυγατρικό ή ιδιότητα
Επιτρέπεται πρόσβαση στο αντικείμενο
Η πρόσβαση επιτρέπεται σε ένα θυγατρικό ή ιδιότητα
Όλα τα μεταβιβαζόμενα ACE που
Παραγγελία για τα ACE που έχουν μεταβιβαστεί πρέπει δεν θα τροποποιηθεί. Όλα τα ACE που έχουν μεταβιβαστεί προστίθενται από το λειτουργικό σύστημα και είναι σωστά ταξινομημένα. Ένας προγραμματιστής να καθορίσετε ότι θα πρέπει να μεταβιβαστεί μιας καταχώρησης ελέγχου ΠΡΌΣΒΑΣΗΣ και θα εκτελέσει από τη μεταβίβαση της καταχώρησης ελέγχου ΠΡΌΣΒΑΣΗΣ σε εξαρτώμενα αντικείμενα, τα Windows 2000 ή Windows NT.

Υπάρχει μια εξαίρεση τους κανόνες της μετάδοσης. Προσθήκη ενός αντικειμένου ACL άσους θα δεν λάβετε εφαρμόζονται αυτόματα σε υπάρχοντα αντικείμενα στο δέντρο. Είναι ευθύνη του τον προγραμματιστή για να καθοδηγήσετε το δέντρο και μεταβίβαση της καταχώρησης ελέγχου ΠΡΌΣΒΑΣΗΣ, προσθέτοντας τα υπάρχοντα αντικείμενα της καταχώρησης ελέγχου ΠΡΌΣΒΑΣΗΣ. Η καταχώρηση ACE θα διαβιβαστεί σε νέα αντικείμενα στη δευτερεύουσα δομή.

Ο αλγόριθμος ταξινόμησης ACE που ένα ACL

  1. Αποκτήστε το ACL (DACL) διακριτικού από την περιγραφή ασφαλείας.
  2. Check the IADsAccessControlEntry::AceFlags to see if the ACE was inherited (check for the ADS_ACEFLAG_INHERITED_ACE bit).
  3. Check the IADsAccessControlEntry::AceType to see what type of access the ACE grants and what the access is granted to (the object itself or properties of the object). The following list outlines the ACE type values and what they mean:
    ADS_ACETYPE_ACCESS_ALLOWED - grants allowed access to the entire object
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT - indicates the access is allowed to a property or property set
    ADS_ACETYPE_ACCESS_DENIED - denies access to the entire object
    ADS_ACETYPE_ACCESS_DENIED_OBJECT - denies access to a property or property set.
  4. Place the ACE in the appropriate temporary DACL based on the IADsAccessControlListEntry::AceType value.
  5. Rebuild the ACL from the separate ACLs in the following order:
    ADS_ACETYPE_ACCESS_DENIED ACE types
    ADS_ACETYPE_ACCESS_DENIED_OBJECT ACE types
    ADS_ACETYPE_ACCESS_ALLOWED ACE types
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT ACE types
    ACEs with ADS_ACEFLAG_INHERITED_ACE flag set in the IADsAccessControlListEntry::AceFlags
  6. Set the new ACL to the same revision level as the old ACL.
  7. Replace the ACL on the security descriptor.

Steps to use the Visual Basic code that is provided in this article

  1. Register ADsSecurity.dll.

    ADsSecurity.dll is part of the Active Directory Service Interfaces (ADSI) 2.5 Resource Kit. To download the ADSI 2.5 Resource kit, visit the following Microsoft Web site:
    http://www.Microsoft.com/technet/Archive/winntas/downloads/adsi25.mspx?mfr=TRUE
    Use Regsvr32 to register ADsSecurity.dll. If this DLL does not register correctly, this behavior indicates that ADSI is not installed. If you are running the code on a Microsoft Windows NT-based computer or on a Microsoft Windows 98-based computer, install the appropriate Active Directory Client Extension. For more information about how to obtain these clients, see the "References" section.
  2. Η εκκίνηση της Visual Basic. Then, create a standard EXE project.
  3. Προβολή τουΑναφορέςfor the project. Make sure that the follow are selected:
    • Active DS Type Library
    • ADsSecurity 2.5 Type Library
  4. Make a command button on the form.
  5. Double-click the command button. Then, paste the following code in theCommand1_Clickcommand handler.

Visual Basic sample code illustrates how to implement the sorting algorithm

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 (Knowledge Base):
269175How to use Visual C++ to properly order ACEs in an ACL
279682How to use ADsSecurity.dll to add an access control entry to an NTFS folder
For additional information about how to install Active Directory Client Extension, click the following article number to view the article in the Microsoft Knowledge Base:
288358Τρόπος εγκατάστασης της επέκτασης προγράμματος-πελάτη της υπηρεσίας καταλόγου Active Directory

Ιδιότητες

Αναγν. άρθρου: 269159 - Τελευταία αναθεώρηση: Κυριακή, 19 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Λέξεις-κλειδιά: 
kbdswadsi2003swept kbhowto kbmt KB269159 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:269159
Αποποίηση ευθυνών για περιεχόμενο της Γνωσιακής Βάσης (KB) που έχει αποσυρθεί
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.

Αποστολή σχολίων

 

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