Condividi tramite


Metodo SetSD della classe __SystemSecurity

Il metodo SetSD imposta il descrittore di sicurezza per lo spazio dei nomi a cui è connesso un utente. Questo metodo richiede un descrittore di sicurezza in formato matrice di byte binari. Se si scrive uno script, usare il metodo SetSecurityDescriptor . Per altre informazioni, vedere Protezione degli spazi dei nomi WMI e Modifica della sicurezza degli accessi in oggetti a protezione diretta.

Se si esegue la programmazione in C++, è possibile modificare il descrittore di sicurezza binario usando SDDL e i metodi di conversione ConvertSecurityDescriptorToStringSecurityDescriptor e ConvertStringSecurityDescriptorToSecurityDescriptor.

Un utente deve disporre dell'autorizzazione WRITE_DAC e, per impostazione predefinita, un amministratore dispone di tale autorizzazione. L'unica parte del descrittore di sicurezza usata è la voce di controllo di accesso non scritta (ACE) nell'elenco di controllo di accesso discrezionale (DACL). Impostando il flag CONTAINER_INHERIT negli ACL, il descrittore di sicurezza influisce sugli spazi dei nomi figlio. Sono consentiti sia gli ACL consentiti che gli ACL di negazione.

Nota

Poiché gli ACL negati e consentiti sono entrambi consentiti in un DACL, l'ordine degli ACL è importante. Per altre informazioni, vedere Ordinamento degli ACL in un DACL.

Sintassi

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

Parametri

SD [in]

Matrice di byte che costituisce il descrittore di sicurezza.

Valore restituito

Restituisce un valore HRESULT che indica lo stato di una chiamata al metodo. Per le applicazioni di scripting e Visual Basic, il risultato può essere ottenuto da OutParameters.ReturnValue. Per altre informazioni, vedere Costruzione di oggetti InParameters e analisi di oggetti OutParameters.

L'elenco seguente elenca i valori restituiti significativi per SetSD.

S_OK

Metodo eseguito correttamente.

WBEM_E_ACCESS_DENIED

Il chiamante non dispone di diritti sufficienti per chiamare questo metodo.

WBEM_E_METHOD_DISABLED

Si è tentato di eseguire questo metodo nel sistema operativo che non lo supporta.

WBEM_E_INVALID_OBJECT

SD non supera i test di validità di base.

WBEM_E_INVALID_PARAMETER

SD non è valido a causa di una delle condizioni seguenti:

  • DACL mancante.
  • DACL non valido.
  • ACE ha il flag WBEM_FULL_WRITE_REP impostato e il flag WBEM_PARTIAL_WRITE_REP o WBEM_WRITE_PROVIDER non è impostato.
  • ACE ha il flag INHERIT_ONLY_ACE impostato senza il flag di CONTAINER_INHERIT_ACE .
  • ACE ha un set di bit di accesso sconosciuto.
  • ACE ha un set di flag che non si trova nella tabella.
  • ACE ha un tipo non presente nella tabella.
  • Il proprietario e il gruppo non sono presenti in SD.

Per altre informazioni sui flag ace (Access Control Entry), vedere Costanti di sicurezza WMI.

Commenti

Per altre informazioni sulla modifica della sicurezza dello spazio dei nomi a livello di codice o manualmente, vedere Protezione degli spazi dei nomi WMI.

Esempio

Lo script seguente illustra come usare SetSD per impostare il descrittore di sicurezza dello spazio dei nomi per lo spazio dei nomi radice e modificarlo nella matrice di byte illustrata in 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

Nell'esempio di codice C# seguente viene usato System.Security.AccessControl.RawSecurityDescriptor per enumerare, inserire e rimuovere nuovi oggetti CommonAce in RawSecurityDescriptor.DiscretionaryAcl e quindi convertirlo nuovamente in una matrice di byte per salvarlo tramite SetSD. Un SecurityIdentifier può essere recuperato 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);

Requisiti

Requisito Valore
Client minimo supportato
Windows Vista
Server minimo supportato
Windows Server 2008
Spazio dei nomi
Tutti gli spazi dei nomi WMI

Vedi anche

Classi di sistema WMI

__SystemSecurity

__SystemSecurity::GetSD

Costanti di sicurezza WMI

Win32_ACE

Win32_SecurityDescriptor

Protezione degli spazi dei nomi WMI