Como utilizar o Visual Basic e ADsSecurity.dll para encomendar correctamente ACEs de uma lista de controlo de acesso (ACL-Access Control List)

Traduções de Artigos Traduções de Artigos
Artigo: 269159 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo mostra como utilizar ADsSecurity.dll para obter um descritor de segurança (SD) de um ficheiro, o objecto do Active Directory ou a chave de registo. Este artigo demonstra como, uma vez que tenha sido obtido um SD para obter a lista de controlo de acesso discricionário (ACL) a partir desse SD e, em seguida, adicione uma entrada de controlo de acesso (ACE) na localização correcta. O artigo fornece um algoritmo simples juntamente com um exemplo de código Microsoft Visual Basic que ilustra como ordenar uma lista de controlo de acesso (ACL-Access Control List) então escrever a ACL de SD. correctamente

Mais Informação

O método IADsAccessControlList::AddAce adiciona a ACE na parte superior da ACL. Em alguns casos, adicionar uma ACE na parte superior criará acesso de segurança não desejados. Cache de propriedades interfaces de serviço do Active Directory (ADSI) no Microsoft Windows Server 2003 e no Microsoft Windows XP irá correctamente encomendar a DACL antes de escrever novamente para o objecto. Reordenar só é necessário no Microsoft Windows 2000. A ordem correcta das ACEs de uma lista de controlo de acesso (ACL-Access Control List) é:
Acesso negado ACEs que se aplicam ao próprio objecto
Acesso negado ACE aplicáveis a um subordinado do objecto, tal como um conjunto de propriedades ou propriedade
ACE permitido o acesso que se aplicam ao próprio objecto
ACE permitido o acesso aplicáveis a um subordinado do objecto, tal como um conjunto de propriedades ou propriedade
Nos produtos listados neste artigo, a interface IADsAccessControlList não suporta um método que ordena correctamente uma lista de controlo de acesso (ACL-Access Control List). As ACEs devem ser ordenadas para estes grupos de cinco:
Acesso negado no objecto
Acesso negado num subordinado ou propriedade
Acesso permitido no objecto
Acesso permitido num subordinado ou propriedade
Todos os herdadas ACE
A ordenação para as ACE herdadas deve não ser alterada. Todas as ACE herdadas são adicionadas pelo sistema operativo e são ordenadas correctamente. Um programador pode especificar que uma ACE deverão ser herdada e Windows 2000 ou Windows NT efectuará propagar a ACE a objectos secundários.

Existe uma excepção para as regras de propagação. Ases à ACL de um objecto irão não obter aplicados automaticamente a objectos existentes na árvore da. É da responsabilidade do programador para atravessar a árvore e propagar a ACE adicionando a ACE objectos existentes. A ACE é propagada em novos objectos na subárvore.

Algoritmo de ordenação ACEs de uma lista de controlo de acesso (ACL-Access Control List)

  1. Obter a ACL discricionária (DACL) a partir do descritor de segurança.
  2. Verificar IADsAccessControlEntry::AceFlags para ver se a ACE herdada (Procurar ADS_ACEFLAG_INHERITED_ACE bit).
  3. Verifique o IADsAccessControlEntry::AceType para ver o tipo de acesso que a ACE concede e o acesso é concedido a (o próprio objecto ou as propriedades do objecto). A lista seguinte descreve os valores de tipo de ACE, Access Control ENTRY e respectivo significado:
    ADS_ACETYPE_ACCESS_ALLOWED - concede acesso permitido a todo o objecto
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT - indica o acesso é permitido para uma propriedade ou conjunto de propriedades
    ADS_ACETYPE_ACCESS_DENIED - nega o acesso ao objecto inteiro
    ADS_ACETYPE_ACCESS_DENIED_OBJECT - nega o acesso a uma propriedade ou conjunto de propriedades.
  4. Coloque a ACE a DACL temporária adequada com base no valor IADsAccessControlListEntry::AceType.
  5. Reconstrua a ACL da ACL separadas pela seguinte ordem:
    Tipos de ADS_ACETYPE_ACCESS_DENIED ACE
    Tipos de ADS_ACETYPE_ACCESS_DENIED_OBJECT ACE
    Tipos de ADS_ACETYPE_ACCESS_ALLOWED ACE
    Tipos de ADS_ACETYPE_ACCESS_ALLOWED_OBJECT ACE
    Ases com ADS_ACEFLAG_INHERITED_ACE sinalizador definido no IADsAccessControlListEntry::AceFlags
  6. Definido nova ACL para o mesmo nível de revisão como a ACL antigo.
  7. Substitua a ACL no descritor de segurança.

Passos para utilizar o código do Visual Basic que é fornecido neste artigo

  1. Registe ADsSecurity.dll.

    ADsSecurity.dll faz parte do Resource Kit do Active Directory Service Interfaces (ADSI) 2.5. Para transferir o ADSI 2.5 Resource kit, visite o seguinte Web site da Microsoft:
    http://www.microsoft.com/technet/archive/winntas/downloads/adsi25.mspx?mfr=true
    Utilize o Regsvr32 para registar ADsSecurity.dll. Se esta DLL não regista correctamente, este comportamento indica que o ADSI não está instalado. Se estão a executar o código num computador com o Microsoft Windows NT ou num computador baseado no Microsoft Windows 98, instale a extensão de cliente do Active Directory adequado. Para mais informações sobre como obter estes clientes, consulte a secção "Referências".
  2. Inicie o Visual Basic. Em seguida, crie um projecto EXE padrão.
  3. Visualize referências para o projecto. Certifique-se que a seguir estão seleccionadas:
    • Biblioteca de tipos DS do Active Directory
    • Biblioteca de tipos ADsSecurity 2.5
  4. Tornar um botão de comando do formulário.
  5. Faça duplo clique no botão de comando. Em seguida, cole o código seguinte no processador de comandos Command1_Click .

Código de exemplo do Visual Basic ilustra como implementar o algoritmo de ordenação

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.
				

Referências

Para obter informações adicionais, clique números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft:
269175Como utilizar o Visual C++ para encomendar correctamente ACEs de uma lista de controlo de acesso (ACL-Access Control List)
279682Como utilizar ADsSecurity.dll para adicionar uma entrada de controlo de acesso a uma pasta NTFS
Para obter informações adicionais sobre como instalar a extensão de cliente do Active Directory, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
288358Como instalar a extensão de cliente do Active Directory

Propriedades

Artigo: 269159 - Última revisão: 15 de janeiro de 2007 - Revisão: 7.1
A informação contida neste artigo aplica-se a:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Windows Scripting Host 2.5
Palavras-chave: 
kbmt kbdswadsi2003swept kbhowto KB269159 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 269159
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

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