SetSD-Methode der _ _ SystemSecurity-Klasse

Die SetSD-Methode legt den Sicherheitsdeskriptor für den Namespace fest, mit dem ein Benutzer verbunden ist. Diese Methode erfordert einen Sicherheitsdeskriptor im binären Bytearrayformat. Wenn Sie ein Skript schreiben, verwenden Sie die SetSecurityDescriptor-Methode. Weitere Informationen finden Sie unter Sichern von WMI-Namespaces und Ändern der Zugriffssicherheit für sicherungsfähige Objekte.

Wenn Sie in C++ programmieren, können Sie den binären Sicherheitsdeskriptor mit sddlund den Konvertierungsmethoden ConvertSecurityDescriptorToStringSecurityDescriptor und ConvertStringSecurityDescriptorToSecurityDescriptorbearbeiten.

Ein Benutzer muss über die _ WRITE-DAC-Berechtigung verfügen, und standardmäßig verfügt ein Administrator über diese Berechtigung. Der einzige Teil der Sicherheitsbeschreibung, der verwendet wird, ist der nicht überwachte Zugriffssteuerungseintrag (ACE) in der DACL (Discretionary Access Control List). Durch Festlegen des CONTAINER _ INHERIT-Flags in den ACEs wirkt sich der Sicherheitsdeskriptor auf untergeordnete Namespaces aus. AcEs zum Zulassen und Verweigern sind zulässig.

Hinweis

Da Verweigerungs- und Zulassungs-ACEs in einer DACL zulässig sind, ist die Reihenfolge der ACEs wichtig. Weitere Informationen finden Sie unter Sortieren von ACEs in einer DACL.

Syntax

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

Parameter

SD [ In]

Bytearray, das den Sicherheitsdeskriptor bildet.

Rückgabewert

Gibt ein HRESULT zurück, das den Status eines Methodenaufrufs angibt. Für Skripts und Visual Basic Anwendungen kann das Ergebnis aus OutParameters.ReturnValueabgerufen 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

Die Methode wurde erfolgreich ausgeführt.

WBEM _ E _ ACCESS _ DENIED

Der Aufrufer verfügt nicht über ausreichende Rechte zum Aufrufen dieser Methode.

WBEM _ _ E-METHODE _ DEAKTIVIERT

Es wurde versucht, diese Methode unter einem Betriebssystem auszuführen, das sie nicht unterstützt.

WBEM _ E _ UNGÜLTIGES _ OBJEKT

SD bestanden keine grundlegenden Gültigkeitstests.

WBEM _ E _ INVALID _ PARAMETER

SD ist aufgrund einer der folgenden Punkte ungültig:

  • DACL fehlt.
  • DACL ist ungültig.
  • Für ACE ist das WBEM _ FULL _ WRITE _ REP-Flag festgelegt, und das WBEM _ PARTIAL WRITE _ _ REP- oder WBEM _ WRITE _ PROVIDER-Flag ist nicht festgelegt.
  • Für ACE ist das INHERIT _ ONLY _ ACE-Flag ohne das CONTAINER INHERIT _ _ ACE-Flag festgelegt.
  • Ace hat ein unbekanntes Zugriffsbit festgelegt.
  • Ace hat ein Flag festgelegt, das nicht in der Tabelle enthalten ist.
  • ACE weist einen Typ auf, der nicht in der Tabelle enthalten ist.
  • Der Besitzer und die Gruppe fehlen in der SD.

Weitere Informationen zu den ACE-Flags (Access Control Entry, Zugriffssteuerungseintrag) finden Sie unter WMI-Sicherheitskonstanten.

Hinweise

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 den Namespacesicherheitsdeskriptor für den Stammnamespace festzulegen und in das bytearray zu ändern, das in strSD gezeigt wird.

' 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, um es über SetSD zu speichern. Ein SecurityIdentifier kann mit 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

Sichern von WMI-Namespaces