Objetos do descritor de segurança do WMI

O WMI tem objetos e métodos que permitem ler e manipular descritores de segurança para determinar quem tem acesso a objetos protegíveis.

A função dos descritores de segurança

Os descritores de segurança definem os atributos de segurança de objetos protegíveis, como arquivos, chaves do Registro, namespaces do WMI, impressoras, serviços ou compartilhamentos. Um descritor de segurança contém informações sobre o proprietário e o grupo primário de um objeto. Um provedor pode comparar o descritor de segurança de recurso com a identidade de um usuário solicitante e determinar se o usuário tem ou não o direito de acessar o recurso que um usuário está solicitando. Para obter mais informações, consulte Acesso a objetos protegíveis do WMI.

Alguns métodos do WMI, como GetSD, retornam um descritor de segurança no formato de matriz de bytes binários. A partir do Windows Vista, use os métodos da classe Win32_SecurityDescriptorHelper para converter um descritor de segurança binário em uma instância de Win32_SecurityDescriptor, que pode ser manipulada com mais facilidade. Para obter mais informações, confira Alterar a segurança de acesso em objetos que podem ser protegidos.

Objetos de segurança Controle de Acesso e o WMI

Veja a seguir uma lista de objetos de segurança do WMI:

O diagrama a seguir mostra as relações entre objetos de segurança do WMI.

relações entre objetos de segurança do WMI

Para obter mais informações sobre a função de segurança de acesso, consulte Melhores práticas de segurança, Manutenção da segurança do WMI e Controle de Acesso.

Win32_SecurityDescriptor Object

A tabela a seguir lista as propriedades da classe Win32_SecurityDescriptor.

Propriedade Descrição
ControlFlags Conjunto de bits de controle que qualificam o significado de um SD ou seus membros individuais. Para obter mais informações sobre como definir os valores de bit ControlFlags, consulte Win32_SecurityDescriptor.
DACL ACL (Lista de Controle de Acesso Discricionária) de usuários e grupos e seus direitos de acesso a um objeto protegido. Essa propriedade contém uma matriz de instâncias Win32_ACE que representam entradas Controle de Acesso. Para saber mais, confira Criando uma DACL.
Grupo Grupo ao qual este objeto protegido pertence. Essa propriedade contém uma instância de Win32_Trustee que contém o nome, o domínio e o SID (identificador de segurança) do grupo ao qual o proprietário pertence.
Proprietário Proprietário deste objeto protegido. Essa propriedade contém uma instância de Win32_Trustee que contém o nome, o domínio e o SID (identificador de segurança) do proprietário.
SACL A ACL (Lista de Controle de Acesso do Sistema) contém uma matriz de instâncias Win32_ACE que representam o tipo de tentativas de acesso que geram registros de auditoria para usuários ou grupos. Para obter mais informações, consulte SACL para um novo objeto.

DACL e SACL

As matrizes de objetos Win32_ACE na DACL (lista de controle de acesso discricionário) e na lista de controle de acesso do sistema {SACL) criam um link entre um usuário ou grupo e seus direitos de acesso.

Quando uma propriedade DACL não contém uma ACE (entrada de controle de acesso), os direitos de acesso não são concedidos e o acesso ao objeto é negado.

Observação

Uma DACL NULL dá acesso total a todos, o que é um sério risco à segurança. Para saber mais, confira Criando uma DACL.

Win32_ACE, Win32_Trustee, Win32_SID

Um objeto Win32_ACE contém uma instância da classe Win32_Trustee que identifica um usuário ou grupo e uma propriedade AccessMask que é uma máscara de bits, que especifica as ações que um usuário ou grupo pode executar. Por exemplo, um usuário ou grupo pode receber o direito de ler um arquivo, mas não gravar no arquivo. Um objeto Win32_ACE também contém uma ACE que indica se é ou não um acesso de permissão ou negação.

Observação

A ordem de Win32_ACE em uma DACL é importante porque a ACE (entrada de controle de acesso) permitir e negar é permitida em uma DACL. Para obter mais informações, consulte Ordem das ACEs em uma DACL.

Cada conta de usuário ou grupo representado por um Win32_Trustee tem um SID (identificador de segurança) que identifica exclusivamente uma conta e especifica os privilégios de acesso da conta. A forma como você especifica os dados de SID depende do sistema operacional. Para obter mais informações, confira Alterar a segurança de acesso em objetos que podem ser protegidos.

O diagrama a seguir mostra o conteúdo de uma instância Win32_ACE.

conteúdo de uma instância win32-ace

Exemplo: verificar quem tem acesso a impressoras

O exemplo de código VBScript a seguir mostra como usar o descritor de segurança da impressora. O script chama o método GetSecurityDescriptor na classe Win32_Printer para obter o descritor e determina se há uma DACL (lista de controle de acesso discricionário) presente no descritor de segurança. Se houver uma DACL, o script obterá a lista de ACE (entrada de controle de acesso) da DACL. Cada ACE é representada por uma instância de Win32_ACE. O script verifica cada ACE para obter o nome do usuário e determinar se o usuário tem acesso à impressora. O usuário é representado em por uma instância de Win32_Trustee inserida na instância de Win32_ACE.

SE_DACL_PRESENT = &h4
ACCESS_ALLOWED_ACE_TYPE = &h0
ACCESS_DENIED_ACE_TYPE  = &h1

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate, (Security)}!\\" & strComputer & "\root\cimv2")

Set colInstalledPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer")

For Each objPrinter in colInstalledPrinters
   Wscript.Echo "Name: " & objPrinter.Name 
' Get security descriptor for printer
    Return = objPrinter.GetSecurityDescriptor( objSD )
    If ( return <> 0 ) Then
 WScript.Echo "Could not get security descriptor: " & Return
 wscript.Quit Return
    End If
' Extract the security descriptor flags
    intControlFlags = objSD.ControlFlags
    If intControlFlags AND SE_DACL_PRESENT Then
' Get the ACE entries from security descriptor
        colACEs = objSD.DACL
    For Each objACE in colACEs
' Get all the trustees and determine which have access to printer
        WScript.Echo objACE.Trustee.Domain & "\" & objACE.Trustee.Name
        If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then
            WScript.Echo vbTab & "User has access to printer"
        ElseIf objACE.AceType = ACCESS_DENIED_ACE_TYPE Then
            WScript.Echo vbTab & "User does not have access to the printer"
        End If
    Next
    Else
    WScript.Echo "No DACL found in security descriptor"
End If
Next

Como alterar a segurança de acesso em objetos protegíveis

Classe auxiliar de descritor de segurança

Práticas Recomendadas de segurança

Manter a segurança do WMI

Controle de acesso

Acesso a namespaces do WMI