Freigeben über


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

Weitere Informationen

WMI-Systemklassen

__SystemSecurity

__SystemSecurity::GetSD

WMI-Sicherheitskonstanten

Win32_ACE

Win32_SecurityDescriptor

Schützen von WMI-Namespaces