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 |