Partilhar via


Método SetSD da classe __SystemSecurity

O método SetSD define o descritor de segurança para o namespace no qual um usuário está conectado. Esse método requer um descritor de segurança no formato de matriz de bytes binários. Se você estiver escrevendo um script, use o método SetSecurityDescriptor. Para obter mais informações, confira Proteger namespaces do WMI e Alterar a segurança de acesso em objetos que podem ser protegidos.

Se você estiver programando em C++, poderá manipular o descritor de segurança binário usando a SDDL e os métodos de conversão ConvertSecurityDescriptorToStringSecurityDescriptor e ConvertStringSecurityDescriptorToSecurityDescriptor.

Um usuário deve ter a permissão WRITE_DAC e, por padrão, um administrador tem essa permissão. A única parte do descritor de segurança que é usada é a ACE (entrada de controle de acesso) não herdada na DACL (lista de controle de acesso discricionário). Ao definir o sinalizador CONTAINER_INHERIT nas ACEs, o descritor de segurança afeta namespaces filho. Tanto permitir quanto negar ACEs são opções válidas.

Observação

Como negar e permitir ACEs são opções válidas em uma DACL, a ordem das ACEs é importante. Para obter mais informações, confira Ordenação de ACEs em uma DACL.

Sintaxe

HRESULT SetSD(
  [in] uint8 SD[]
);

Parâmetros

SD [entrada]

Matriz de bytes que compõe o descritor de segurança.

Retornar valor

Retorna um HRESULT que indica o status de uma chamada de método. Para scripts e aplicativos do Visual Basic, o resultado pode ser obtido de OutParameters.ReturnValue. Para obter mais informações, veja Construir objetos InParameters e Analisar objetos OutParameters.

A lista a seguir tem os valores retornados que são significativos para SetSD.

S_OK

Método executado com êxito.

WBEM_E_ACCESS_DENIED

O chamador não tem direitos suficientes para chamar esse método.

WBEM_E_METHOD_DISABLED

Tentativa de executar esse método em um sistema operacional que não dá suporte a ele.

WBEM_E_INVALID_OBJECT

O SD não passa em testes básicos de validade.

WBEM_E_INVALID_PARAMETER

O SD não é válido devido a um dos seguintes motivos:

  • A DACL está ausente.
  • A DACL não é válida.
  • A ACE tem o sinalizador WBEM_FULL_WRITE_REP definido e o sinalizador WBEM_PARTIAL_WRITE_REP ou WBEM_WRITE_PROVIDER não está definido.
  • A ACE tem o sinalizador INHERIT_ONLY_ACE definido sem o sinalizador CONTAINER_INHERIT_ACE.
  • A ACE tem um conjunto de bits de acesso desconhecido.
  • A ACE tem um conjunto de sinalizadores que não está na tabela.
  • A ACE tem um tipo que não está na tabela.
  • O proprietário e o grupo estão ausentes do SD.

Para obter mais informações sobre os sinalizadores da ACE (entrada de controle de acesso), consulte Constantes de segurança do WMI.

Comentários

Para obter mais informações sobre como modificar a segurança do namespace de maneira programática ou manual, veja Proteger namespaces do WMI.

Exemplos

O script a seguir mostra como usar SetSD para definir o descritor de segurança do namespace para o namespace raiz e alterá-lo para a matriz de bytes mostrada em strSD.

' Hard-coded security descriptor
strSD = array( 1, 0, 4,129,72, 0, 0, 0, _ 
              88, 0, 0,  0, 0, 0, 0, 0, _
              20, 0, 0,  0, 2, 0,52, 0, _
               2, 0, 0,  0, 0, 2,24, 0, _
              63, 0, 6,  0, 1, 2, 0, 0, _
               0, 0, 0,  5,32, 0, 0, 0, _
              32, 2, 0,  0, 0, 2,20, 0, _
              63, 0, 6,  0, 1, 1, 0, 0, _
               0, 0, 0,  1, 0, 0, 0, 0, _
               1, 2, 0,  0, 0, 0, 0, 5, _
              32, 0, 0,  0,32, 2, 0, 0, _
               1, 2, 0,  0, 0, 0, 0, 5, _
              32, 0, 0,  0,32, 2, 0, 0)

' Connect to WMI and the root namespace.
Set oSvc = CreateObject( _
                         "WbemScripting.SWbemLocator"). _
                         ConnectServer(,"Root\Cimv2")

' Get the single __SystemSecurity object in this namespace.
Set oSecurity = oSvc.Get("__SystemSecurity=@")

' Change the namespace security.
nReturn = oSecurity.SetSD(strSD)
WScript.Echo "ReturnValue " & nReturn

O exemplo de código C# a seguir usa o System.Security.AccessControl.RawSecurityDescriptor para enumerar, inserir e remover novos objetos CommonAce da RawSecurityDescriptor.DiscretionaryAcl e convertê-la novamente em uma matriz de bytes para salvá-la por meio de SetSD. Um SecurityIdentifier pode ser recuperado usando NTAccount e Translate.

 byte[] sdValueByteArray = new Byte[0];

            string accountName = "My User or Group";

            AceFlags aceFlags = AceFlags.ContainerInherit;

            int accessRights = 131107; // Search for Namespace Access Rights Constants and build an Flags enum

            RawSecurityDescriptor rawSecurityDescriptor = new RawSecurityDescriptor(sdValueByteArray, 0);

            NTAccount ntAccount = new NTAccount(accountName);

            IdentityReference identityReference = ntAccount.Translate(typeof(SecurityIdentifier));

            if (identityReference == null)

            {

                string message = string.Format("The IdentityReference of NTAccount '{0}' is null.", accountName);

                throw new Exception(message);

            }

            SecurityIdentifier securityIdentifier = identityReference as SecurityIdentifier;

            if (securityIdentifier == null)

            {

                string message = "The IdentityReference of NTAccount '{0}' is not an SecurityIdentifier.";

                throw new Exception(message);

            }

            CommonAce commonAce;

            foreach (GenericAce genericAce in rawSecurityDescriptor.DiscretionaryAcl)

            {

                commonAce = genericAce as CommonAce;

                if (commonAce == null)

                {

                    continue;

                }

                if (commonAce.SecurityIdentifier.Value.Equals(securityIdentifier.Value, StringComparison.OrdinalIgnoreCase))

                {

                    return;

                }

            }

            commonAce = new CommonAce(aceFlags, AceQualifier.AccessAllowed, (int)accessRights, securityIdentifier, false, null);

            rawSecurityDescriptor.DiscretionaryAcl.InsertAce(rawSecurityDescriptor.DiscretionaryAcl.Count, commonAce);

Requisitos

Requisito Valor
Cliente mínimo com suporte
Windows Vista
Servidor mínimo com suporte
Windows Server 2008
Namespace
Todos os namespaces do WMI

Confira também

Classes de sistema do WMI

__SystemSecurity

__SystemSecurity::GetSD

Constantes de segurança do WMI

Win32_ACE

Win32_SecurityDescriptor

Como proteger namespaces do WMI