L'utilizzo di Visual Basic e ADsSecurity.dll per ordinare correttamente le voci ACE in un elenco ACL

Traduzione articoli Traduzione articoli
Identificativo articolo: 269159 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene illustrato come utilizzare ADsSecurity.dll per ottenere un descrittore di protezione (SD) per un file, un oggetto di Active Directory o una chiave del Registro di sistema. In questo articolo viene illustrato come, dopo aver ottenuto un descrittore di protezione, per recuperare l'elenco di controllo di accesso discrezionale (ACL) dal che SD e quindi aggiungere una voce di controllo di accesso (ACE) nel percorso corretto. L'articolo fornisce un semplice algoritmo con un esempio di codice Microsoft Visual Basic che illustrano come correttamente ordinare un elenco di controllo di accesso, quindi scrivere l'ACL di SD.

Informazioni

Il metodo IADsAccessControlList::AddAce aggiunta la voce ACE nella parte superiore dell'ACL. In alcuni casi, l'aggiunta nella parte superiore di una voce ACE creerÓ accesso di protezione indesiderati. La cache delle proprietÓ (Active Directory Service INTERFACES) in Microsoft Windows Server 2003 e Microsoft Windows XP verrÓ correttamente ordinare l'elenco DACL prima di scrivere nuovamente all'oggetto. Riordino Ŕ necessaria solo in Microsoft Windows 2000. L'ordine corretto di voci ACE in un elenco di controllo di accesso Ŕ la seguente:
ACE di accesso negato applicabili all'oggetto
ACE di negazione di accesso applicabili a un figlio dell'oggetto, ad esempio un insieme di proprietÓ o una proprietÓ
ACE di accesso consentito applicabili all'oggetto
ACE di accesso consentito applicabili a un figlio dell'oggetto, ad esempio un insieme di proprietÓ o una proprietÓ
Nei prodotti elencati in questo articolo, l'interfaccia IADsAccessControlList non supporta un metodo che correttamente gli ordini di un elenco di controllo di accesso. Le voci ACE devono essere ordinate in questi cinque gruppi:
Accesso negato per l'oggetto
Accesso negato su un figlio o proprietÓ
Accesso consentito per l'oggetto
Accesso consentito in un figlio o proprietÓ
Tutti ereditati ACE
L'ordinamento per le voci ACE ereditate non deve essere modificato. Tutte le voci ACE ereditate vengono aggiunte dal sistema operativo e vengono ordinate in modo appropriato. Un programmatore pu˛ specificare una voce di controllo di accesso dovrÓ essere ereditata e Windows 2000 o Windows NT si occuperÓ di propagazione di voce ACE da oggetti figlio.

Non vi Ŕ un'eccezione alle regole di propagazione. Le ACE aggiungere a ACL un oggetto non verranno automaticamente visualizzato applicate agli oggetti esistenti nella struttura. Spetta al programmatore di scorrere la struttura e propagare le ACE aggiungendo la voce ACE gli oggetti esistenti. La voce ACE verrÓ distribuire nuovi oggetti nella sottostruttura.

Algoritmo per l'ordinamento di voci ACE in un elenco di controllo di accesso

  1. Consente di ottenere l'ACL discrezionale (DACL) dal descrittore di protezione.
  2. Controllare il IADsAccessControlEntry::AceFlags per verificare se la voce ACE Ŕ stato ereditato (controllo per il ADS_ACEFLAG_INHERITED_ACE bit).
  3. Controllare il IADsAccessControlEntry::AceType per vedere quale tipo di accesso, che la voce ACE concede e quali l'accesso Ŕ concesso (oggetto o proprietÓ dell'oggetto). Nell'elenco seguente sono indicati i valori di tipo ACE e relativo significato:
    ADS_ACETYPE_ACCESS_ALLOWED - concede l'accesso consentito l'intero oggetto
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT - indica che l'accesso Ŕ consentito una proprietÓ o un insieme di proprietÓ
    ADS_ACETYPE_ACCESS_DENIED - Nega l'accesso all'intero oggetto
    ADS_ACETYPE_ACCESS_DENIED_OBJECT - Nega l'accesso a una proprietÓ o un insieme di proprietÓ.
  4. Inserire la voce ACE nel DACL temporaneo appropriato in base al valore IADsAccessControlListEntry::AceType.
  5. Consente di ricostruire l'ACL dagli elenchi separato di controllo di accesso nell'ordine seguente:
    Tipi di voce ACE ADS_ACETYPE_ACCESS_DENIED
    Tipi di voce ACE ADS_ACETYPE_ACCESS_DENIED_OBJECT
    Tipi di voce ACE ADS_ACETYPE_ACCESS_ALLOWED
    Tipi di voce ACE ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
    Le ACE con flag ADS_ACEFLAG_INHERITED_ACE impostare nel IADsAccessControlListEntry::AceFlags
  6. Impostare il nuovo ACL sul livello di revisione stesso come l'ACL precedente.
  7. Sostituire l'ACL per il descrittore di protezione.

Procedura per utilizzare il codice Visual Basic che in questo articolo viene fornito

  1. Registrare ADsSecurity.dll.

    ADsSecurity.dll fa parte del Resource Kit di Active Directory (Service INTERFACES) 2.5. Per scaricare il ADSI 2.5 Resource kit, il seguente sito Microsoft Web:
    http://www.microsoft.com/technet/archive/winntas/downloads/adsi25.mspx?mfr=true
    Utilizzare Regsvr32 per registrare ADsSecurity.dll. Se questa DLL non registra correttamente, in questo comportamento Ŕ possibile indica che ADSI non Ŕ installato. Se si esegue il codice in un computer basato su Microsoft Windows NT o in un computer basato su Microsoft Windows 98, installare l'appropriato Active Directory Client Extension. Per ulteriori informazioni su come ottenere questi client, vedere la sezione "Riferimenti".
  2. Avviare Visual Basic. Quindi creare un progetto EXE standard.
  3. Consente di visualizzare i riferimenti per il progetto. Assicurarsi che siano selezionata attenersi alla seguente:
    • Attiva libreria dei tipi DS
    • Libreria dei tipi ADsSecurity 2.5
  4. Consente di apportare un pulsante di comando nel modulo.
  5. Fare doppio clic sul pulsante comando. Quindi, incollare il codice riportato di seguito nel gestore comando Command1_Click .

Codice di esempio di Visual Basic viene illustrato come implementare l'algoritmo di ordinamento

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.
				

Riferimenti

Per ulteriori informazioni, fare clic sui numeri degli articoli della Microsoft Knowledge Base riportato di seguito:
269175L'utilizzo di Visual c ++ per ordinare correttamente le voci ACE in un elenco ACL
279682Come utilizzare ADsSecurity.dll per aggiungere una voce di controllo di accesso di una cartella NTFS
Per ulteriori informazioni sull'installazione di Active Directory Client Extension, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
288358Come installare Active Directory Client Extension

ProprietÓ

Identificativo articolo: 269159 - Ultima modifica: lunedý 15 gennaio 2007 - Revisione: 7.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Windows Scripting Host 2.5
Chiavi:á
kbmt kbdswadsi2003swept kbhowto KB269159 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 269159
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
Dichiarazione di non responsabilitÓ per articoli della Microsoft Knowledge Base su prodotti non pi¨ supportati
Questo articolo Ŕ stato scritto sui prodotti per cui Microsoft non offre pi¨ supporto. L?articolo, quindi, viene offerto ?cosý come Ŕ? e non verrÓ pi¨ aggiornato.

Invia suggerimenti

 

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