Método SetSD de la clase __SystemSecurity

El método SetSD establece el descriptor de seguridad del espacio de nombres al que está conectado un usuario. Este método necesita un descriptor de seguridad en formato de matriz de bytes binaria. Si va a escribir un script, use el método SetSecurityDescriptor. Para más información, vea Protección de espacios de nombres WMI y Cambio de seguridad de acceso en objetos protegibles.

Si va a programar en C++, puede manipular el descriptor de seguridad binario mediante SDDL y los métodos de conversión ConvertSecurityDescriptorToStringSecurityDescriptor y ConvertStringSecurityDescriptorToSecurityDescriptor.

Un usuario debe tener el permiso WRITE_DAC y, de forma predeterminada, un administrador tiene ese permiso. La única parte del descriptor de seguridad que se usa es la entrada de control de acceso (ACE) no heredada en la lista de control de acceso discrecional (DACL). Al establecer la marca CONTAINER_INHERIT en las ACE, el descriptor de seguridad afecta a los espacios de nombres secundarios. Se permiten las ACE de denegación y permiso.

Nota

Como las ASE de denegación y permiso están permitidas en una DACL, su orden es importante. Para más información, vea Orden de las ACE en una DACL.

Sintaxis

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

Parámetros

SD [in]

Matriz de bytes que compone el descriptor de seguridad.

Valor devuelto

Devuelve un valor HRESULT que indica el estado de una llamada de método. Para scripting y aplicaciones de Visual Basic, el resultado se puede obtener de OutParameters.ReturnValue. Para más información, vea Construcción de objetos InParameters y análisis de objetos OutParameters.

En la lista siguiente se enumeran los valores devueltos que son significativos para SetSD.

S_OK

El método se ejecutó correctamente.

WBEM_E_ACCESS_DENIED

El autor de la llamada no dispone de permisos suficientes para llamar a este método.

WBEM_E_METHOD_DISABLED

Se ha intentado ejecutar este método en un sistema operativo que no lo admite.

WBEM_E_INVALID_OBJECT

SD no supera las pruebas de validez básicas.

WBEM_E_INVALID_PARAMETER

SD no es válido debido a una de las siguientes acciones:

  • Falta la DACL.
  • DACL no es válida.
  • ACE tiene establecida la marca WBEM_FULL_WRITE_REP y no se establece la marca WBEM_PARTIAL_WRITE_REP o WBEM_WRITE_PROVIDER.
  • ACE tiene la marca INHERIT_ONLY_ACE establecida sin la marca CONTAINER_INHERIT_ACE.
  • ACE tiene un conjunto de bits de acceso desconocido.
  • ACE tiene un conjunto de marcas que no está en la tabla.
  • ACE tiene un tipo que no está en la tabla.
  • Falta el propietario y el grupo del SD.

Para más información sobre las marcas de entrada de control de acceso (ACE), vea Constantes de seguridad de WMI.

Comentarios

Para obtener más información sobre cómo modificar la seguridad del espacio de nombres mediante programación o manualmente, consulte Protección de espacios de nombres WMI.

Ejemplos

En el siguiente script se muestra cómo usar SetSD para establecer el descriptor de seguridad del espacio de nombres para el espacio de nombres raíz y cambiarlo a la matriz de bytes que se muestra en 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

En el ejemplo de código de C# siguiente se usa System.Security.AccessControl.RawSecurityDescriptor para enumerar, insertar y quitar nuevos objetos CommonAce en RawSecurityDescriptor.DiscretionaryAcl y, después, volverlo a convertir en una matriz de bytes para guardarlo mediante SetSD. Un valor SecurityIdentifier se puede recuperar mediante NTAccount y 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 Value
Cliente mínimo compatible
Windows Vista
Servidor mínimo compatible
Windows Server 2008
Espacio de nombres
Todos los espacios de nombres WMI

Consulte también

Clases del sistema WMI

__SystemSecurity

__SystemSecurity::GetSD

Constantes de seguridad de WMI

Win32_ACE

Win32_SecurityDescriptor

Protección de espacios de nombres de WMI