CreatePrivateObjectSecurityEx-Funktion (securitybaseapi.h)

Die CreatePrivateObjectSecurityEx-Funktion ordnet und initialisiert einen selbstrelativen Sicherheitsdeskriptor für ein neues privates Objekt, das vom Ressourcen-Manager erstellt wurde, der diese Funktion aufruft.

Syntax

BOOL CreatePrivateObjectSecurityEx(
  [in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
  [in, optional] PSECURITY_DESCRIPTOR CreatorDescriptor,
  [out]          PSECURITY_DESCRIPTOR *NewDescriptor,
  [in, optional] GUID                 *ObjectType,
  [in]           BOOL                 IsContainerObject,
  [in]           ULONG                AutoInheritFlags,
  [in, optional] HANDLE               Token,
  [in]           PGENERIC_MAPPING     GenericMapping
);

Parameter

[in, optional] ParentDescriptor

Ein Zeiger auf den Sicherheitsdeskriptor für den übergeordneten Container des Objekts. Wenn kein übergeordneter Container vorhanden ist, ist dieser Parameter NULL.

[in, optional] CreatorDescriptor

Ein Zeiger auf einen Sicherheitsdeskriptor, der vom Ersteller des Objekts bereitgestellt wird. Wenn der Ersteller des Objekts nicht explizit Sicherheitsinformationen für das neue Objekt übergibt, kann dieser Parameter NULL sein. Alternativ kann dieser Parameter auf einen Standardsicherheitsdeskriptor verweisen.

[out] NewDescriptor

Ein Zeiger auf eine Variable, die einen Zeiger auf den neu zugeordneten selbstrelativen Sicherheitsdeskriptor empfängt. Wenn Sie die Verwendung des Sicherheitsdeskriptors abgeschlossen haben, geben Sie ihn frei, indem Sie die
DestroyPrivateObjectSecurity-Funktion .

[in, optional] ObjectType

Ein Zeiger auf eine GUID-Struktur , die den Typ des Objekts identifiziert, das NewDescriptor zugeordnet ist. Wenn das Objekt keine GUID aufweist, legen Sie ObjectType auf NULL fest.

[in] IsContainerObject

Gibt an, ob das neue Objekt andere Objekte enthalten kann. Der Wert TRUE gibt an, dass das neue Objekt ein Container ist. Der Wert FALSE gibt an, dass das neue Objekt kein Container ist.

[in] AutoInheritFlags

Eine Reihe von Bitflags, die steuern, wie Zugriffssteuerungseinträge (Access Control Entries , ACEs) von ParentDescriptor geerbt werden. Für diesen Parameter ist eine Kombination der folgenden Werte gültig.

Wert Bedeutung
SEF_AVOID_OWNER_CHECK
0x10
Die Funktion überprüft nicht die Gültigkeit des Besitzers im resultierenden NewDescriptor , wie in Den Hinweisen unten beschrieben. Wenn auch das flag SEF_AVOID_PRIVILEGE_CHECK festgelegt ist, kann der TokenparameterNULL sein.
SEF_AVOID_OWNER_RESTRICTION
0x1000
Alle vom ParentDescriptor angegebenen Einschränkungen, die die Fähigkeit des Aufrufers, eine DACL im CreatorDescriptor anzugeben, einschränken würden, werden ignoriert.
SEF_AVOID_PRIVILEGE_CHECK
0x08
Die Funktion führt keine Berechtigungsüberprüfung aus. Wenn auch das flag SEF_AVOID_OWNER_CHECK festgelegt ist, kann der TokenparameterNULL sein. Dieses Flag ist bei der Implementierung der automatischen Vererbung nützlich, um zu vermeiden, dass die Berechtigungen für die einzelnen aktualisierten untergeordneten Elemente überprüft werden.
SEF_DACL_AUTO_INHERIT
0x01
Die neue DACL (Discretionary Access Control List ) enthält ACEs, die von der DACL von ParentDescriptor geerbt werden, sowie alle expliziten ACEs, die in der DACL von CreatorDescriptor angegeben sind. Wenn dieses Flag nicht festgelegt ist, erbt die neue DACL keine ACEs.
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT
0x04
CreatorDescriptor ist der Standarddeskriptor für den Objekttyp, der durch ObjectType angegeben wird. Daher wird CreatorDescriptor ignoriert, wenn ParentDescriptor über objektspezifische ACEs für den Objekttyp verfügt, der durch den ObjectType-Parameter angegeben wird. Wenn keine solchen ACEs geerbt werden, wird CreatorDescriptor so behandelt, als ob dieses Flag nicht angegeben wäre.
SEF_DEFAULT_GROUP_FROM_PARENT
0x40
Die Gruppe von NewDescriptor ist standardmäßig die Gruppe aus ParentDescriptor. Wenn nicht festgelegt, wird die Gruppe von NewDescriptor standardmäßig auf die Gruppe des Tokens festgelegt, die durch den Token-Parameter angegeben wird. Die Gruppe des Tokens wird im Token selbst angegeben. Wenn der CreatorDescriptor-Parameter in beiden Fällen nicht NULL ist, wird die Gruppe NewDescriptor auf die Gruppe von CreatorDescriptor festgelegt.
SEF_DEFAULT_OWNER_FROM_PARENT
0x20
Der Besitzer von NewDescriptor verwendet standardmäßig den Besitzer von ParentDescriptor. Wenn dieser Wert nicht festgelegt ist, ist der Besitzer von NewDescriptor standardmäßig der Besitzer des durch den Token-Parameter angegebenen Tokens. Der Besitzer des Tokens wird im Token selbst angegeben. Wenn der CreatorDescriptor-Parameter in beiden Fällen nicht NULL ist, wird der NewDescriptor-Besitzer von CreatorDescriptor auf den Besitzer festgelegt.
SEF_MACL_NO_EXECUTE_UP
0x400
Wenn dieses Flag festgelegt ist, wird die obligatorische Bezeichnung ACE in CreatorDescriptor nicht verwendet, um eine obligatorische Bezeichnung ACE in NewDescriptor zu erstellen. Stattdessen wird NewDescriptor eine neue SYSTEM_MANDATORY_LABEL_ACE mit einer Zugriffsmaske von SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP und der SID aus der Integritäts-SID des Tokens hinzugefügt.
SEF_MACL_NO_READ_UP
0x200
Wenn dieses Flag festgelegt ist, wird die obligatorische Bezeichnung ACE in CreatorDescriptor nicht verwendet, um eine obligatorische Bezeichnung ACE in NewDescriptor zu erstellen. Stattdessen wird NewDescriptor eine neue SYSTEM_MANDATORY_LABEL_ACE mit einer Zugriffsmaske von SYSTEM_MANDATORY_LABEL_NO_READ_UP und der SID aus der Integritäts-SID des Tokens hinzugefügt.
SEF_MACL_NO_WRITE_UP
0x100
Wenn dieses Flag festgelegt ist, wird die obligatorische Bezeichnung ACE in CreatorDescriptor nicht verwendet, um eine obligatorische Bezeichnung ACE in NewDescriptor zu erstellen. Stattdessen wird NewDescriptor eine neue SYSTEM_MANDATORY_LABEL_ACE mit einer Zugriffsmaske von SYSTEM_MANDATORY_LABEL_NO_WRITE_UP und der SID aus der Integritäts-SID des Tokens hinzugefügt.
SEF_SACL_AUTO_INHERIT
0x02
Die neue Systemzugriffssteuerungsliste (SACL) enthält ACEs, die von der SACL von ParentDescriptor geerbt werden, sowie alle expliziten ACEs, die in der SACL von CreatorDescriptor angegeben sind. Wenn dieses Flag nicht festgelegt ist, erbt die neue SACL keine ACEs.

[in, optional] Token

Ein Handle für das Zugriffstoken für den Clientprozess, in dessen Auftrag das Objekt erstellt wird. Wenn es sich um ein Identitätswechseltoken handelt, muss es sich auf der SecurityIdentification-Ebene oder höher sein. Eine vollständige Beschreibung der Identitätswechselebene von SecurityIdentification finden Sie unter SECURITY_IMPERSONATION_LEVEL aufgezählten Typ.

Das Clienttoken enthält Standardsicherheitsinformationen, z. B. den Standardbesitzer, die primäre Gruppe und die DACL. Die Funktion verwendet diese Standardwerte, wenn die Informationen nicht in den Eingabesicherheitsdeskriptoren enthalten sind. Das Token muss für TOKEN_QUERY Zugriff geöffnet sein.

Wenn alle folgenden Bedingungen zutreffen, muss das Handle zusätzlich zu TOKEN_QUERY Zugriff für TOKEN_DUPLICATE Zugriff geöffnet werden.

  • Das Tokenhandle bezieht sich auf ein primäres Token.
  • Der Sicherheitsdeskriptor des Tokens enthält mindestens ein ACEs mit der OwnerRights-SID .
  • Für den CreatorDescriptor-Parameter wird ein Sicherheitsdeskriptor angegeben.
  • Der Aufrufer dieser Funktion legt das SEF_AVOID_OWNER_RESTRICTION-Flag im AutoInheritFlags-Parameter nicht fest.

[in] GenericMapping

Ein Zeiger auf eine GENERIC_MAPPING-Struktur , die die Zuordnung von jedem generischen Recht zu bestimmten Rechten für das Objekt angibt.

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. Einige der erweiterten Fehlercodes und ihre Bedeutungen sind in der folgenden Tabelle aufgeführt.

Rückgabecode Beschreibung
ERROR_INVALID_OWNER
Die Funktion kann keinen Besitzer für den neuen Sicherheitsdeskriptor abrufen, oder die SID kann nicht als Besitzer zugewiesen werden. Dies tritt auf, wenn die Besitzer-SID mit dem übergebenen Token überprüft wird.
ERROR_INVALID_PRIMARY_GROUP
Die Funktion kann keine primäre Gruppe für den neuen Sicherheitsdeskriptor abrufen.
ERROR_NO_TOKEN
Die Funktion hat NULL anstelle eines Tokens für die Besitzerüberprüfung oder Berechtigungsüberprüfung empfangen.
ERROR_PRIVILEGE_NOT_HELD
Es wird eine SACL festgelegt, SEF_AVOID_PRIVILEGE_CHECK nicht übergeben wurde, und für das übergebene Token wurde SE_SECURITY_NAME nicht aktiviert.

Hinweise

Die CreatePrivateObjectSecurity-Funktion ist identisch mit dem Aufrufen der CreatePrivateObjectSecurityEx-Funktion , wobei ObjectType auf NULL und AutoInheritFlags auf Null festgelegt ist.

Der AutoInheritFlags-Parameter unterscheidet sich von den ähnlich benannten Bits im Control-Element der SECURITY_DESCRIPTOR-Struktur . Eine Erläuterung der Steuerelementbits finden Sie unter SECURITY_DESCRIPTOR_CONTROL.

Wenn AutoInheritFlags das SEF_DACL_AUTO_INHERIT Bit angibt, wendet die Funktion die folgenden Regeln auf die DACL im neuen Sicherheitsdeskriptor an:

  • Das flag SE_DACL_AUTO_INHERITED wird im Control-Element des neuen Sicherheitsdeskriptors festgelegt.
  • Die DACL des neuen Sicherheitsdeskriptors erbt ACEs vom ParentDescriptor , unabhängig davon, ob CreatorDescriptor der Standardsicherheitsdeskriptor ist oder vom Ersteller explizit angegeben wurde. Die neue DACL ist eine Kombination der übergeordneten und ersteller-DACLs, wie durch die Vererbungsregeln definiert.
  • Geerbte ACEs werden als INHERITED_ACE gekennzeichnet.
Wenn AutoInheritFlags das SEF_SACL_AUTO_INHERIT Bit angibt, wendet die Funktion ähnliche Regeln auf die neue SACL an.

Für DACLs und SACLs werden bestimmte ACEs-Typen in ParentDescriptor und CreatorDescriptor bearbeitet und möglicherweise durch zwei ACEs in NewDescriptor ersetzt. Insbesondere kann ein vererbbarer ACE, der mindestens eines der folgenden zugeordneten Elemente enthält, zu zwei ACEs im Ausgabesicherheitsdeskriptor führen. Zu den zuordnungsfähigen Elementen gehören:

  • Generische Zugriffsrechte im ACCESS_MASK
  • Creator Owner SID oder Creator Group SID als ACE-Antragstellerbezeichner
ACEs mit einem der zuvor erwähnten zuordnungsfähigen Elemente führen in NewDescriptor zu den folgenden ACEs:
  • Ein ACE, bei dem es sich um eine Kopie des Originals handelt, aber das flag INHERIT_ONLY festgelegt ist. Dieser ACE wird jedoch nicht erstellt, wenn eine der folgenden beiden Bedingungen vorhanden ist:
    • Der IsContainerObject-Parameter ist FALSE. Vererbbare ACEs sind für Nichtcontainerobjekte bedeutungslos.
    • Der ursprüngliche ACE enthält das flag NO_PROPAGATE_INHERIT. Der ursprüngliche ACE soll als effektiver ACE für Kinder geerbt werden, aber nicht unter diesen Untergeordneten vererbbar.
  • Eine effektive ACE, bei der das INHERITED_ACE Bits aktiviert ist und die generischen Elemente bestimmten Elementen zugeordnet werden, einschließlich:
    • Generische Zugriffsrechte werden durch die entsprechenden Standard- und spezifischen Zugriffsrechte ersetzt, die in der Eingabe GenericMapping angegeben sind.
    • Die Ersteller-Besitzer-SID wird im resultierenden NewDescriptor durch den Besitzer ersetzt.
    • Die SID der Erstellergruppe wird im resultierenden NewDescriptor durch die Gruppe ersetzt.
Wenn AutoInheritFlags das SEF_AVOID_OWNER_CHECK Bit nicht angibt, wird die Gültigkeitsprüfung des Besitzers durchgeführt. Der Besitzer im resultierenden NewDescriptor muss eine rechtlich gebildete SID sein und entweder mit dem TokenUser in Token übereinstimmen oder mit einer Gruppe in den TokenGroups in Token übereinstimmen, wobei die Attribute der Gruppe SE_GROUP_OWNER enthalten müssen, und darf keine SE_GROUP_USE_FOR_DENY_ONLY enthalten.

Aufrufer, die keinen Zugriff auf das Token des Clients haben, der letztendlich den Besitzer festlegt, können die Überprüfung der Besitzer überspringen.

Um einen Sicherheitsdeskriptor für ein neues Objekt zu erstellen, rufen Sie CreatePrivateObjectSecurityEx auf, wobei ParentDescriptor auf den Sicherheitsdeskriptor des übergeordneten Containers und CreatorDescriptor auf den vom Ersteller des Objekts vorgeschlagenen Sicherheitsdeskriptor festgelegt ist.

Wenn der CreatorDescriptor-Sicherheitsdeskriptor eine SACL enthält, muss für Token die berechtigung SE_SECURITY_NAME aktiviert sein, oder der Aufrufer muss das flag SEF_AVOID_PRIVILEGE_CHECK in AutoInheritFlags angeben.

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

Übersicht über Client/Server-Access Control

CreatePrivateObjectSecurity

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

GetTokenInformation

OpenProcessToken

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL

SetPrivateObjectSecurityEx