Como usar o controle de acesso de alto nível APIs a partir do Visual Basic

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 295004
Sumário
A API do Win32 fornece dois conjuntos de APIs para trabalhar com descritores de segurança (SDs) e listas de controle de acesso (ACLs). Nível baixo, bem como controle de acesso de alto nível API conjuntos fornecem uma interface para trabalhar com SDs e ACLs. Para Microsoft Windows 2000 e MIcrosoft Windows XP, o controle de acesso de alto nível APIs foram aprimorados para suporte a entradas de controle de acesso específicas do objeto (ACEs), objetos do serviço (DS) de diretório e herança automática. Este artigo fornece código de exemplo que usa APIs de alto nível de acesso controle para modificar uma existente acesso discricional lista de controle (DACL) em um objeto que podem ser protegidos de pasta.
Mais Informações
O seguinte código de exemplo do Visual Basic usa a API GetNamedSecurityInfo() para recuperar a DACL existente da pasta C:\Test1. Em seguida, ele cria a estrutura EXPLICIT_ACCESS todos confiança com acesso GENERIC_READ usando a API BuildExplicitAccessWithName(). Neste exemplo, a ACE é construída com herança CONTAINER_INHERIT_ACE ou OBJECT_INHERIT_ACE, que aplica-se como uma ACE eficaz para a pasta C:\Test1 e uma ACE herdável para subpastas, bem como arquivos.

A API SetEntriesInAcl() cria uma nova lista de controle de acesso (ACL) mesclando novas informações de controle de acesso especificadas em EXPLICIT_ACCESS estruturas em uma ACL existente e retorna uma DACL recém-atualizada na memória. Essa DACL atualizada em seguida, é usado para configurar a segurança na pasta C:\Test1 usando a API SetNamedSecurityInfo().
Option Explicit' Success status of high level access control APIsPrivate Const ERROR_SUCCESS = 0&' Type of Securable Object we are operating in this sample codePrivate Const SE_FILE_OBJECT = 1&' The Security Information constants requiredPrivate Const DACL_SECURITY_INFORMATION = 4&Private Const SET_ACCESS = 2&' Standard access rights extracted from WinNT.hPrivate Const SYNCHRONIZE = &H100000Private Const READ_CONTROL = &H20000Private Const WRITE_DAC = &H40000Private Const WRITE_OWNER = &H80000Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)Private Const DELETE = &H10000' Generic access rights extracted from WinNT.hPrivate Const GENERIC_ALL = &H10000000Private Const GENERIC_EXECUTE = &H20000000Private Const GENERIC_READ = &H80000000Private Const GENERIC_WRITE = &H40000000' Inheritance FlagsPrivate Const CONTAINER_INHERIT_ACE = &H2Private Const OBJECT_INHERIT_ACE = &H1' The TRUSTEE structure identifies the user account, group account, or logon session' to which an ACE applies. The structure can use a name or a security identifier (SID)' to identify the trustee.' Access control APIs, such as SetEntriesInAcl and GetExplicitEntriesFromAcl, use this' structure to identify the account associated with the access-control or audit-control' information in an EXPLICIT_ACCESS structure.Private Type TRUSTEE    pMultipleTrustee As Long    MultipleTrusteeOperation As Long    TrusteeForm As Long    TrusteeType As Long    ptstrName As StringEnd Type' EXPLICIT_ACCESS structure that specifies access-control information for a specified' trustee such as access mask as well as inheritance flagsPrivate Type EXPLICIT_ACCESS    grfAccessPermissions As Long    grfAccessMode As Long    grfInheritance As Long    pTRUSTEE As TRUSTEEEnd Type' High Level access control API declarationsPrivate Declare Sub BuildExplicitAccessWithName Lib "Advapi32.dll" Alias _    "BuildExplicitAccessWithNameA" _    (ea As Any, _    ByVal TrusteeName As String, _    ByVal AccessPermissions As Long, _    ByVal AccessMode As Integer, _    ByVal Inheritance As Long)    Private Declare Function SetEntriesInAcl Lib "Advapi32.dll" Alias _    "SetEntriesInAclA" _    (ByVal CountofExplicitEntries As Long, _    ea As Any, _    ByVal OldAcl As Long, _    NewAcl As Long) As LongPrivate Declare Function GetNamedSecurityInfo Lib "Advapi32.dll" Alias _    "GetNamedSecurityInfoA" _    (ByVal ObjName As String, _    ByVal SE_OBJECT_TYPE As Long, _    ByVal SecInfo As Long, _    ByVal pSid As Long, _    ByVal pSidGroup As Long, _    pDacl As Long, _    ByVal pSacl As Long, _    pSecurityDescriptor As Long) As Long    Private Declare Function SetNamedSecurityInfo Lib "Advapi32.dll" Alias _    "SetNamedSecurityInfoA" _    (ByVal ObjName As String, _    ByVal SE_OBJECT As Long, _    ByVal SecInfo As Long, _    ByVal pSid As Long, _    ByVal pSidGroup As Long, _    ByVal pDacl As Long, _    ByVal pSacl As Long) As LongPrivate Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As LongPrivate Sub Command1_Click()Dim result As LongDim pSecDesc As LongDim ea As EXPLICIT_ACCESSDim pNewDACL As LongDim pOldDACL As Long ' Get the DACL information of c:\test1 folder using GetNamedSecurityInfo() API.' SE_FILE_OBJECT constant says that the named securable object is a file or folderresult = GetNamedSecurityInfo("c:\test1", SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, 0&, 0&, pOldDACL, 0&, pSecDesc)If result = ERROR_SUCCESS Then        ' Construct an EXPLICIT_ACCESS structure for Everyone with GENERIC_READ access that will apply for c:\test1    ' as well as subfolder and files using BuildExplicitAccessWithName() API    BuildExplicitAccessWithName ea, "Users", GENERIC_READ, SET_ACCESS, CONTAINER_INHERIT_ACE Or OBJECT_INHERIT_ACE        ' Merge constructed EXPLICIT_ACCESS structure to the existing DACL and get an updated DACL in memory from    ' SetEntriesInAcl() API    result = SetEntriesInAcl(1, ea, pOldDACL, pNewDACL)    If result = ERROR_SUCCESS Then        MsgBox "SetEntriesInAcl succeeded"                ' Call SetNamedSecurityInfo() API with the updated DACL in memory to change the DACL of c:\test1 folder        result = SetNamedSecurityInfo("c:\test1", SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, 0&, 0&, pNewDACL, 0&)        If result = ERROR_SUCCESS Then            MsgBox "SetNamedSecurityInfo succeeded"        Else            MsgBox "SetNamedSecurityInfo failed with error code : " & result        End If                ' Free the memory allocated for the new DACL by the SetEntriesInAcl() API, using LocalFree() API        LocalFree pNewDACL    Else        MsgBox "SetEntriesInAcl failed with error code : " & result    End If        ' Free the memory allocated for the security descriptor by the GetNamedSecurityInfo() API, using LocalFree() API    LocalFree pSecDescElse    MsgBox "GetNamedSecurityInfo failed with error code : " & resultEnd IfEnd Sub				
Referências
Para obter mais informações, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
102102Como adicionar uma ACE de acesso permitido para um arquivo
316440Como usar o controle de acesso de nível inferior APIs a partir do Visual Basic

Propriedades

ID do Artigo: 295004 - Última Revisão: 11/21/2006 15:36:07 - Revisão: 4.1

Interface de Programação de Aplicativos do Microsoft Win32

  • kbmt kbacl kbapi kbhowto kbkernbase kbsecurity KB295004 KbMtpt
Comentários