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

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
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.
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: 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 ADsSecurityDim sd As IADsSecurityDescriptorDim dacl As IADsAccessControlListDim ace As IADsAccessControlEntryDim newAce As New AccessControlEntry'' Declare temporary ACLs for sorting the original' ACL'Dim newdacl As New AccessControlListDim ImpDenyDacl As New AccessControlListDim ImpDenyObjectDacl As New AccessControlListDim InheritedDacl As New AccessControlListDim ImpAllowDacl As New AccessControlListDim impAllowObjectDacl As New AccessControlListPrivate 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.DiscretionaryAclDebug.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)NextDebug.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_PRESENTnewAce.ObjectType = "{BF967A68-0DE6-11D0-A285-00AA003049E2}"newAce.AccessMask = ADS_RIGHT_DS_READ_PROP Or ADS_RIGHT_DS_WRITE_PROPnewAce.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECTnewAce.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 IfNext'' 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 aceNext'' Implicit Deny Object'For Each ace In ImpDenyObjectDacl  newdacl.AddAce aceNext'' Implicit Allow'For Each ace In ImpAllowDacl  newdacl.AddAce aceNext'' Implicit Allow Object'For Each ace In impAllowObjectDacl  newdacl.AddAce aceNext'' Inherited Aces'For Each ace In InheritedDacl  newdacl.AddAce aceNextsd.DiscretionaryAcl = newdaclDebug.Print DateFor 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.ObjectTypeNext'' 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

Avviso: questo articolo è stato tradotto automaticamente

プロパティ

文書番号:269159 - 最終更新日: 01/15/2007 09:08:14 - リビジョン: 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 KbMtit
フィードバック