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 |