Share via


CreatePrivateObjectSecurityWithMultipleInheritance-Funktion (securitybaseapi.h)

Die CreatePrivateObjectSecurityWithMultipleInheritance-Funktion ordnet und initialisiert einen selbstrelativen Sicherheitsdeskriptor für ein neues privates Objekt, das vom Ressourcen-Manager erstellt wurde, der diese Funktion aufruft. Diese Funktion unterstützt private Objekte (z. B. Verzeichnisdienstobjekte mit angefügten Hilfsklassen), die aus mehreren Objekttypen oder Klassen bestehen.

Syntax

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

Parameter

[in, optional] ParentDescriptor

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

[in, optional] CreatorDescriptor

Ein Zeiger auf eine Sicherheitsbeschreibung, die 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 eine Standardsicherheitsbeschreibung verweisen.

[out] NewDescriptor

Ein Zeiger auf eine Variable, um einen Zeiger auf den neu zugewiesenen selbstrelativen Sicherheitsdeskriptor zu empfangen. Wenn Sie die Verwendung des Sicherheitsdeskriptors abgeschlossen haben, geben Sie ihn frei, indem Sie die
DestroyPrivateObjectSecurity-Funktion .

[in, optional] ObjectTypes

Ein Array von Zeigern auf GUID-Strukturen , die die Objekttypen oder Klassen des Mit NewDescriptor zugeordneten Objekts identifizieren. Für Active Directory-Objekte enthält dieses Array Zeiger auf die Klassen-GUIDs der Strukturklasse des Objekts und alle angefügten Hilfsklassen. Legen Sie ObjectTypes auf NULL fest, wenn das Objekt keine GUID aufweist.

[in] GuidCount

Die Anzahl der GUIDs, die im ObjectTypes-Parameter vorhanden sind.

[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 (ACEs) von ParentDescriptor geerbt werden. Für diesen Parameter ist eine Kombination der folgenden Werte gültig.

Wert Bedeutung
SEF_DACL_AUTO_INHERIT
0x01
Die neue diskretionäre Zugriffssteuerungsliste (DACL) enthält ACEs, die von der DACL von ParentDescriptor geerbt wurden, 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_SACL_AUTO_INHERIT
0x02
Die neue Systemzugriffssteuerungsliste (SACL) enthält ACEs, die von der SACL von ParentDescriptor geerbt wurden, sowie alle expliziten ACEs, die in der SACL von CreatorDescriptor angegeben sind. Wenn dieses Flag nicht festgelegt ist, erbt die neue SACL keine ACEs.
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT
0x04
CreatorDescriptor ist der Standarddeskriptor für die Objekttypen, die von ObjectTypes angegeben werden. Daher wird CreatorDescriptor ignoriert, wenn ParentDescriptor über objektspezifische ACEs für die Objekttypen verfügt, die durch den ObjectTypes-Parameter angegeben werden. Wenn keine solchen ACEs geerbt werden, wird CreatorDescriptor so behandelt, als wäre dieses Flag nicht angegeben.
SEF_AVOID_PRIVILEGE_CHECK
0x08
Die Funktion führt keine Berechtigungsüberprüfung aus. Wenn auch das SEF_AVOID_OWNER_CHECK-Flag festgelegt ist, kann der Token-ParameterNULL sein. Dieses Flag ist nützlich bei der Implementierung der automatischen Vererbung, um die Überprüfung der Berechtigungen für die einzelnen aktualisierten untergeordneten Elemente zu vermeiden.
SEF_AVOID_OWNER_CHECK
0x10
Die Funktion überprüft nicht die Gültigkeit des Besitzers im resultierenden NewDescriptor , wie im Abschnitt Hinweise beschrieben. Wenn auch das flag SEF_AVOID_PRIVILEGE_CHECK festgelegt ist, kann der TokenparameterNULL sein.
SEF_DEFAULT_OWNER_FROM_PARENT
0x20
Der Besitzer von NewDescriptor verwendet standardmäßig den Besitzer von ParentDescriptor. Wenn nicht festgelegt, wird der Besitzer von NewDescriptor standardmäßig auf den Besitzer des durch den Token-Parameter angegebenen Tokens festgelegt. 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_DEFAULT_GROUP_FROM_PARENT
0x40
Die Gruppe von NewDescriptor ist standardmäßig auf die Gruppe von ParentDescriptor festgelegt. 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 NewDescriptor-Gruppe auf die Gruppe von CreatorDescriptor festgelegt.
SEF_MACL_NO_WRITE_UP
0x100
Ein Prinzipal mit einer obligatorischen Ebene, die niedriger als die des -Objekts ist, kann nicht in das Objekt schreiben.
SEF_MACL_NO_READ_UP
0x200
Ein Prinzipal mit einer obligatorischen Ebene, die niedriger als die des -Objekts ist, kann das Objekt nicht lesen.
SEF_MACL_NO_EXECUTE_UP
0x400
Ein Prinzipal mit einer obligatorischen Ebene, die niedriger als die des Objekts ist, kann das Objekt nicht ausführen.
SEF_AVOID_OWNER_RESTRICTION
0x1000
Alle durch den ParentDescriptor-Parameter angegebenen Einschränkungen, die die Fähigkeit des Aufrufers, eine DACL im CreatorDescriptor anzugeben, einschränken würden, werden ignoriert.

[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 im SECURITY_IMPERSONATION_LEVEL aufgezählten Typs.

Das Clienttoken enthält Standardsicherheitsinformationen, z. B. den Standardbesitzer, die primäre Gruppe und die DACL. Diese 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.
  • Die Sicherheitsbeschreibung 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 einen wert ohne Zero zurück.

Wenn die Funktion fehlschlägt, gibt sie null zurück. Rufen Sie GetLastError für erweiterte Fehlerinformationen auf. Einige erweiterte Fehlercodes und ihre Bedeutungen sind in der folgenden Tabelle aufgeführt.

Rückgabecode Beschreibung
ERROR_INVALID_PRIMARY_GROUP
Die Funktion kann keine primäre Gruppe für die neue Sicherheitsbeschreibung abrufen.
ERROR_INVALID_OWNER
Die Funktion kann keinen Besitzer für den neuen Sicherheitsdeskriptor abrufen, oder der Sicherheitsbezeichner (SID) kann nicht als Besitzer zugewiesen werden. Dies tritt auf, wenn die Besitzer-SID mit dem übergebenen Token überprüft wird.
ERROR_NO_TOKEN
Die Funktion erhielt NULL anstelle eines Tokens für die Besitzerüberprüfung oder Berechtigungsüberprüfung .
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 CreatePrivateObjectSecurityEx-Funktion ist identisch mit dem Aufrufen der CreatePrivateObjectSecurityWithMultipleInheritance-Funktion mit einer einzelnen GUID in ObjectTypes.

Die AutoInheritFlags unterscheiden 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 von 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. Insbesondere werden alle ACEs in ParentDescriptor , die entweder auf alle untergeordneten Objekte oder auf eine in ObjectTypes aufgeführte Objektklasse vererbt werden können, auf die neue DACL angewendet.
  • 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 dieser zugeordneten Elemente führen zu den folgenden beiden ACEs in NewDescriptor:
  • 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.
  • Ein effektiver ACE, bei 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.
    • 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 gemäß den folgenden Regeln 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. Die Attribute für die Gruppe:
  • Muss SE_GROUP_OWNER enthalten
  • 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 CreatePrivateObjectSecurityWithMultipleInheritance auf, wobei ParentDescriptor auf den Sicherheitsdeskriptor des übergeordneten Containers und CreatorDescriptor auf den vom Ersteller des Objekts vorgeschlagenen Sicherheitsdeskriptor festgelegt ist.

Um den aktuellen Sicherheitsdeskriptor für ein Objekt zu überprüfen, rufen Sie CreatePrivateObjectSecurityWithMultipleInheritance auf, wobei ParentDescriptor auf den Sicherheitsdeskriptor des übergeordneten Containers und CreatorDescriptor auf den aktuellen Sicherheitsdeskriptor des Objekts festgelegt ist. Durch diesen Aufruf wird sichergestellt, dass die ACEs ordnungsgemäß von übergeordneten zu untergeordneten Sicherheitsbeschreibungen vererbt werden.

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

CreatePrivateObjectSecurityEx

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL