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 |