SetPrivateObjectSecurityEx-Funktion (securitybaseapi.h)
Die SetPrivateObjectSecurityEx-Funktion ändert den Sicherheitsdeskriptor eines privaten Objekts, das vom Ressourcen-Manager verwaltet wird, der diese Funktion aufruft. Die SetPrivateObjectSecurityEx-Funktion verfügt über einen flags-Parameter, der angibt, ob der Ressourcen-Manager die automatische Vererbung von Zugriffssteuerungseinträgen (Access Control Entries , ACEs) unterstützt.
Syntax
BOOL SetPrivateObjectSecurityEx(
[in] SECURITY_INFORMATION SecurityInformation,
[in] PSECURITY_DESCRIPTOR ModificationDescriptor,
[in, out] PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
[in] ULONG AutoInheritFlags,
[in] PGENERIC_MAPPING GenericMapping,
[in, optional] HANDLE Token
);
Parameter
[in] SecurityInformation
Die festzulegenden Teile des Sicherheitsdeskriptors. Dieser Wert kann eine Kombination der SECURITY_INFORMATION Bitflags sein.
[in] ModificationDescriptor
Ein Zeiger auf eine SECURITY_DESCRIPTOR-Struktur . Die Teile dieses Sicherheitsdeskriptors, die durch den SecurityInformation-Parameter angegeben werden, werden auf den Sicherheitsdeskriptor ObjectsSecurityDescriptor angewendet.
[in, out] ObjectsSecurityDescriptor
Ein Zeiger auf einen Zeiger auf eine SECURITY_DESCRIPTOR-Struktur . Dieser Sicherheitsdeskriptor muss in selbstrelativer Form vorliegen. Der Arbeitsspeicher für den Sicherheitsdeskriptor muss aus dem Prozessheap (GetProcessHeap) mit der HeapAlloc-Funktion zugeordnet werden.
Bei der Eingabe ist dies der aktuelle Sicherheitsdeskriptor des privaten Objekts. Die Funktion ändert sie, um den neuen Sicherheitsdeskriptor zu erstellen. Bei Bedarf weist die SetPrivateObjectSecurityEx-Funktion zusätzlichen Arbeitsspeicher zu, um einen größeren Sicherheitsdeskriptor zu erstellen.
[in] AutoInheritFlags
Gibt die automatische Vererbung von ACEs an. Wenn der geschützte Server keine automatische Vererbung implementiert, sollte er null angeben. Andernfalls kann eine Kombination der folgenden Werte angegeben werden, die in Winnt.h definiert sind.
Wert | Bedeutung |
---|---|
|
Die neue DACL (Discretionary Access Control List ) enthält ACEs, die von der DACL des übergeordneten Objekts geerbt werden, sowie alle expliziten ACEs, die in der DACL von ModificationDescriptor angegeben sind. Wenn dieses Flag nicht festgelegt ist, erbt die neue DACL keine ACEs. |
|
Die neue Systemzugriffssteuerungsliste (SACL ) enthält ACEs, die von der SACL des Sicherheitsdeskriptors geerbt werden, der dem übergeordneten Objekt zugeordnet ist, sowie alle expliziten ACEs, die in der SACL von ModificationDescriptor angegeben sind. Wenn dieses Flag nicht festgelegt ist, erbt die neue SACL keine ACEs. |
|
Die Funktion führt keine Berechtigungsüberprüfung aus. Wenn auch das flag SEF_AVOID_OWNER_CHECK festgelegt ist, kann der TokenparameterNULL sein. Verwenden Sie dieses Flag bei der Implementierung der automatischen Vererbung, um die Überprüfung der Berechtigungen für die einzelnen aktualisierten untergeordneten Elemente zu vermeiden. |
|
Die Funktion überprüft nicht die Gültigkeit des Besitzers im resultierenden ObjectsSecurityDescriptor , wie unter Hinweise beschrieben. Wenn auch das SEF_AVOID_PRIVILEGE_CHECK-Flag festgelegt ist, kann der TokenparameterNULL sein. |
|
Der Besitzer von ObjectsSecurityDescriptor ist standardmäßig der Besitzer des übergeordneten Objekts. Wenn dieses Flag nicht festgelegt ist, verwendet der Besitzer von ObjectsSecurityDescriptor standardmäßig den Besitzer des durch den Tokenparameter angegebenen Tokens. Der Besitzer des Tokens wird im Token selbst angegeben. Wenn der ModificationDescriptor-Parameter in beiden Fällen nicht NULL ist, wird der ObjectsSecurityDescriptor-Besitzer von ModificationDescriptor auf den Besitzer festgelegt. |
|
Die Gruppe von ObjectsSecurityDescriptor ist standardmäßig die Gruppe des Besitzers des übergeordneten Objekts. Wenn dieses Flag nicht festgelegt ist, wird die Gruppe von ObjectsSecurityDescriptor standardmäßig auf die Gruppe des Tokens festgelegt, das durch den Token-Parameter angegeben wird. Die Gruppe des Tokens wird im Token selbst angegeben. Wenn der ModificationDescriptor-Parameter in beiden Fällen nicht NULL ist, wird die Gruppe ObjectsSecurityDescriptor auf die Gruppe von ModificationDescriptor festgelegt. |
|
Ein Prinzipal mit einer obligatorischen Ebene, die niedriger als die des Objekts ist, kann nicht in das Objekt schreiben. |
|
Ein Prinzipal mit einer obligatorischen Ebene, die niedriger als die des Objekts ist, kann das Objekt nicht lesen. |
|
Ein Prinzipal mit einer obligatorischen Ebene, die niedriger als die des Objekts ist, kann das Objekt nicht ausführen. |
|
Alle vom Besitzer des übergeordneten Objekts angegebenen Einschränkungen, die die Fähigkeit des Aufrufers, eine DACL in ObjectsSecurityDescriptor anzugeben, einschränken würden, werden ignoriert. |
[in] GenericMapping
Ein Zeiger auf eine GENERIC_MAPPING-Struktur , die die spezifischen und Standardzugriffsrechte angibt, die den einzelnen generischen Zugriffsrechten entsprechen.
[in, optional] Token
Identifiziert das Zugriffstoken für den Client, in dessen Auftrag die Sicherheit des privaten Objekts geändert wird. Dieser Parameter ist erforderlich, um sicherzustellen, dass der Client einen legitimen Wert für eine neue Besitzersicherheits-ID (SID) bereitgestellt hat. Das Token muss für TOKEN_QUERY Zugriff geöffnet sein.
Rückgabewert
Wenn die Funktion erfolgreich ist, gibt die Funktion ungleich null zurück.
Wenn die Funktion fehlschlägt, wird null zurückgegeben. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.
Hinweise
Wenn der AutoInheritFlags-Parameter null ist, ist SetPrivateObjectSecurityEx mit der SetPrivateObjectSecurity-Funktion identisch.
Diese Funktion ist nur für die Verwendung durch Ressourcen-Manager vorgesehen. Um die Standardmäßige Windows-Zugriffssteuerungssemantik für das Aktualisieren von Sicherheitsbeschreibungen zu implementieren, sollte ein Ressourcen-Manager überprüfen, ob die folgenden Bedingungen erfüllt sind, bevor SetPrivateObjectSecurityEx aufgerufen wird:
- Wenn der Besitzer des Objekts festgelegt wird, muss der aufrufende Prozess entweder über WRITE_OWNER Berechtigung verfügen oder der Besitzer des Objekts sein.
- Wenn die DACL des Objekts festgelegt wird, muss der aufrufende Prozess entweder über WRITE_DAC Berechtigung verfügen oder der Besitzer des Objekts sein.
- Wenn die SACL des Objekts festgelegt wird, muss die berechtigung SE_SECURITY_NAME für den aufrufenden Prozess aktiviert werden.
Der Prozess, der diese Funktion aufruft, sollte keine Identität eines Clients annehmen, da Clients in der Regel nicht über die entsprechenden Berechtigungen verfügen, die für zugrunde liegende Tokenvorgänge erforderlich sind.
Wenn AutoInheritFlags das SEF_DACL_AUTO_INHERIT Bit angibt, wendet die Funktion die folgenden Regeln auf die DACL an, um den neuen Sicherheitsdeskriptor aus dem aktuellen Deskriptor zu erstellen:
- Wenn das flag SE_DACL_PROTECTED nicht in den Steuerbits des aktuellen Sicherheitsdeskriptors oder des ModificationDescriptor festgelegt ist, erstellt die Funktion den Ausgabesicherheitsdeskriptor aus den geerbten ACEs des aktuellen Sicherheitsdeskriptors und nicht inheritierten ACEs von ModificationDescriptor. Das heißt, es ist unmöglich, einen geerbten ACE zu ändern, indem die Zugriffssteuerungsliste (Access Control List , ACL) für ein Objekt geändert wird. Dieses Verhalten behält die geerbten ACEs bei, da sie vom übergeordneten Container geerbt wurden.
Ein ACL-Editor sollte geerbte ACEs nicht verfügbar machen, um zu verhindern, dass sie geändert werden.
- Wenn SE_DACL_PROTECTED in ModificationDescriptor festgelegt ist, wird der aktuelle Sicherheitsdeskriptor ignoriert. Der Ausgabesicherheitsdeskriptor wird als Kopie von ModificationDescriptor erstellt, wobei alle INHERITED_ACE Bits deaktiviert sind.
Im Idealfall sollte ein ACL-Editor die INHERITED_ACE Bits deaktivieren, die dem Aufrufer mitteilen, dass die acEs, die vom übergeordneten Objekt geerbt wurden, jetzt explizit für das Objekt festgelegt werden.
- Wenn SE_DACL_PROTECTED im aktuellen Sicherheitsdeskriptor und nicht in ModificationDescriptor festgelegt ist, wird der aktuelle Sicherheitsdeskriptor ignoriert. Der Ausgabesicherheitsdeskriptor wird als Kopie von ModificationDescriptor erstellt. Es liegt in der Verantwortung des Aufrufers sicherzustellen, dass für die richtigen ACEs das INHERITED_ACE Bit aktiviert ist.
Für DACLs und SACLs werden bestimmte ACEs-Typen in der Eingabe ObjectsSecurityDescriptor und in ModificationDescriptor durch zwei ACEs in der Ausgabe ObjectsSecurityDescriptor ersetzt. Insbesondere führt ein vererbbarer ACE, der mindestens eines der folgenden zugeordneten Elemente enthält, zu zwei ACEs in der ObjectsSecurityDescriptor-Ausgabe. Zu den zuordnungsfähigen Elementen gehören:
- Generische Zugriffsrechte in der ACCESS_MASK-Struktur
- Creator Owner SID oder Creator Group SID als ACE-Antragstellerbezeichner
- Ein ACE, bei dem es sich um eine Kopie des Originals handelt, aber das flag INHERIT_ONLY festgelegt ist
- Ein ACE, in dem das INHERITED_ACE Bit aktiviert ist und die generischen Elemente bestimmten Elementen zugeordnet werden:
- Generische Zugriffsrechte werden durch die entsprechenden Standard- und spezifischen Zugriffsrechte ersetzt, die in der Eingabe GenericMapping angegeben sind.
- Creator Owner SID wird durch den Besitzer in der Ausgabe SecurityDescriptor ersetzt.
- Die Erstellergruppen-SID wird durch die Gruppe in der Ausgabe SecurityDescriptor ersetzt.
- Muss eine rechtlich gebildete SID sein
- Muss mit dem TokenUser in Token übereinstimmen.
- Muss mit einer Gruppe in tokenGroups in Token übereinstimmen, wobei die Attribute in der Gruppe:
- Einschließen von SE_GROUP_OWNER
- Einschließen von SE_GROUP_USE_FOR_DENY_ONLY
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | securitybaseapi.h (Einschließen von Windows.h) |
Bibliothek | Advapi32.lib |
DLL | Advapi32.dll |
Weitere Informationen
Client-/Server-Access Control-Funktionen