Méthode SetSD de la classe __SystemSecurity

La méthode SetSD définit le descripteur de sécurité de l'espace de noms auquel un utilisateur est connecté. Cette méthode nécessite un descripteur de sécurité au format de tableau d’octets binaires. Si vous écrivez un script, utilisez la méthode SetSecurityDescriptor. Pour plus d’informations, voir Sécurisation des espaces de noms WMI et Modification de la sécurité d’accès sur les objets sécurisables.

Si vous programmez en C++, vous pouvez manipuler le descripteur de sécurité binaire à l’aide de SDDL et des méthodes de conversion ConvertSecurityDescriptorToStringSecurityDescriptor et ConvertStringSecurityDescriptorToSecurityDescriptor.

Un utilisateur doit disposer de l’autorisation WRITE_DAC et, par défaut, un administrateur dispose de cette autorisation. La seule partie du descripteur de sécurité qui est utilisée est l'entrée de contrôle d'accès (ACE) non héritée dans la liste de contrôle d'accès discrétionnaire (DACL). En définissant l’indicateur CONTAINER_INHERIT dans les ACE, le descripteur de sécurité affecte les espaces de noms enfants. Les ACE d'autorisation et de refus sont tous deux autorisés.

Notes

Comme les ACE de refus et d'autorisation sont tous deux autorisés dans une DACL, l'ordre des ACE est important. Pour plus d’informations, voir Ordre des ACE dans une DACL.

Syntaxe

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

Paramètres

SD [in]

Tableau d’octets qui compose le descripteur de sécurité.

Valeur retournée

Cette méthode retourne une valeur HRESULT qui indique l’état de l’appel de méthode. Pour les applications de script et Visual Basic, le résultat peut être obtenu à partir de OutParameters.ReturnValue. Pour plus d’informations, voir Construction d’objets InParameters et analyse d’objets OutParameters.

La liste suivante répertorie les valeurs de retour significatives pour GetSD.

S_OK

Méthode exécutée avec succès.

WBEM_E_ACCESS_DENIED

L'appelant n'a pas les droits suffisants pour appeler cette méthode.

WBEM_E_METHOD_DISABLED

Tentative d'exécution de cette méthode sur un système d'exploitation qui ne la prend pas en charge.

WBEM_E_INVALID_OBJECT

SD ne passe pas les tests de validité de base.

WBEM_E_INVALID_PARAMETER

SD n’est pas valide en raison de l’une des raisons suivantes :

  • La DACL est manquante.
  • La DACL n’est pas valide.
  • L’ACE a l’indicateur WBEM_FULL_WRITE_REP défini, et l’indicateur WBEM_PARTIAL_WRITE_REP ou WBEM_WRITE_PROVIDER n’est pas défini.
  • L’ACE a l’indicateur INHERIT_ONLY_ACE défini sans l’indicateur CONTAINER_INHERIT_ACE.
  • L’ACE a un ensemble de bits d’accès inconnu.
  • L’ACE a un jeu d’indicateurs qui n’est pas dans la table.
  • L’ACE a un type qui n’est pas dans la table.
  • Le propriétaire et le groupe sont absents du SD.

Pour plus d’informations sur les indicateurs d’entrée de contrôle d’accès (ACE), voir Constantes de sécurité WMI.

Notes

Pour plus d’informations sur la modification de la sécurité des espaces de noms par programmation ou manuellement, voir Sécurisation des espaces de noms WMI.

Exemples

Le script suivant montre comment utiliser SetSD pour définir le descripteur de sécurité de l’espace de noms pour l’espace de noms racine et le remplacer par le tableau d’octets affiché dans 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

L’exemple de code C# suivant utilise System.Security.AccessControl.RawSecurityDescriptor pour énumérer, insérer et supprimer de nouveaux objets CommonAce dans RawSecurityDescriptor.DiscretionaryAcl, puis les convertir en tableau d’octets pour l’enregistrer via SetSD. Un SecurityIdentifier peut être récupéré à l’aide de NTAccount et de 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);

Spécifications

Condition requise Valeur
Client minimal pris en charge
Windows Vista
Serveur minimal pris en charge
Windows Server 2008
Espace de noms
Tous les espaces de noms WMI

Voir aussi

Classes système WMI

__SystemSecurity

__SystemSecurity::GetSD

Constantes de sécurité WMI

Win32_ACE

Win32_SecurityDescriptor

Sécurisation des espaces de noms WMI