SetSD-Methode der __SystemSecurity-Klasse
Die SetSD-Methode legt die Sicherheitsbeschreibung für den Namespace fest, mit dem ein Benutzer verbunden ist. Diese Methode erfordert eine Sicherheitsbeschreibung im binären Bytearrayformat. Wenn Sie ein Skript schreiben, verwenden Sie die SetSecurityDescriptor-Methode. Weitere Informationen finden Sie unter Schützen von WMI-Namespaces und Ändern der Zugriffssicherheit für sicherungsfähige Objekte.
Wenn Sie in C++ programmieren, können Sie die binäre Sicherheitsbeschreibung mithilfe von SDDL und den Konvertierungsmethoden ConvertSecurityDescriptorToStringSecurityDescriptor und ConvertStringSecurityDescriptorToSecurityDescriptor bearbeiten.
Ein Benutzer muss über die Berechtigung WRITE_DAC verfügen, und standardmäßig verfügt ein Administrator über diese Berechtigung. Der einzige Teil der Sicherheitsbeschreibung, der verwendet wird, ist der nicht geerbte Zugriffssteuerungseintrag (ACE) in der besitzerverwalteten Zugriffssteuerungsliste (DACL). Durch Festlegen des CONTAINER_INHERIT-Flags in den ACEs wirkt sich die Sicherheitsbeschreibung auf untergeordnete Namespaces aus. „ACEs zulassen“ und „ACEs verweigern“ sind zulässig.
Hinweis
Da sowohl „ACEs verweigern“ als auch „ACEs zulassen“ in einer DACL zulässig sind, ist die Reihenfolge der Zugriffssteuerungseinträge wichtig. Weitere Informationen finden Sie unter Reihenfolge von ACEs in einer DACL.
Syntax
HRESULT SetSD(
[in] uint8 SD[]
);
Parameter
-
SD [in]
-
Bytearray, das die Sicherheitsbeschreibung bildet.
Rückgabewert
Gibt ein HRESULT zurück, das den Status eines Methodenaufrufs angibt. Für Skripterstellung und Visual Basic-Anwendungen kann das Ergebnis aus OutParameters.ReturnValue abgerufen werden. Weitere Informationen finden Sie unter Erstellen von InParameters-Objekten und Analysieren von OutParameters-Objekten.
In der folgenden Liste sind die Rückgabewerte aufgeführt, die für SetSD von Bedeutung sind.
-
S_OK
-
Methode wurde erfolgreich ausgeführt.
-
WBEM_E_ACCESS_DENIED
-
Aufrufer verfügt nicht über ausreichende Rechte zum Aufrufen dieser Methode.
-
WBEM_E_METHOD_DISABLED
-
Es wurde versucht, diese Methode auf einem Betriebssystem auszuführen, das sie nicht unterstützt.
-
WBEM_E_INVALID_OBJECT
-
Sicherheitsbeschreibung besteht die grundlegenden Gültigkeitstests nicht.
-
WBEM_E_INVALID_PARAMETER
-
Sicherheitsbeschreibung ist aufgrund einer der folgenden Punkte ungültig:
- DACL fehlt.
- DACL ist nicht gültig.
- Für den Zugriffssteuerungseintrag wurde das WBEM_FULL_WRITE_REP-Flag festgelegt, die Flags WBEM_PARTIAL_WRITE_REP und WBEM_WRITE_PROVIDER wurden hingegen nicht festgelegt.
- Für den Zugriffssteuerungseintrag wurde das Flag INHERIT_ONLY_ACE ohne das Flag CONTAINER_INHERIT_ACE festgelegt.
- Für den Zugriffssteuerungseintrag wurde ein unbekanntes Zugriffsbit festgelegt.
- Für den Zugriffssteuerungseintrag wurde ein Flag festgelegt, das nicht in der Tabelle enthalten ist.
- Der Zugriffssteuerungseintrag weist einen Typ auf, der nicht in der Tabelle enthalten ist.
- Besitzer und Gruppe fehlen in der Sicherheitsbeschreibung.
Weitere Informationen zu den ACE-Flags finden Sie unter WMI-Sicherheitskonstanten.
Bemerkungen
Weitere Informationen zum programmgesteuerten oder manuellen Ändern der Namespacesicherheit finden Sie unter Schützen von WMI-Namespaces.
Beispiele
Das folgende Skript zeigt, wie Sie SetSD verwenden, um die Sicherheitsbeschreibung des Namespace für den Stammnamespace festzulegen und in das unter strSD gezeigte Bytearray zu ändern.
' 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
Im folgenden C#-Codebeispiel wird „System.Security.AccessControl.RawSecurityDescriptor“ verwendet, um neue CommonAce-Objekte in „RawSecurityDescriptor.DiscretionaryAcl“ aufzuzählen, einzufügen und zu entfernen, und sie dann wieder in ein Bytearray zu konvertieren und über „SetSD“ zu speichern. Ein „SecurityIdentifier“-Objekt kann mithilfe von „NTAccount“ und „Translate“ abgerufen werden.
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);
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) |
Windows Vista |
Unterstützte Mindestversion (Server) |
Windows Server 2008 |
Namespace |
Alle WMI-Namespaces |