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 |