Threadsicherheit und Zugriffsrechte
Mit Microsoft Windows können Sie den Zugriff auf Threadobjekte steuern. Weitere Informationen zur Sicherheit finden Sie unter Access-Control Model.
Sie können einen Sicherheitsdeskriptor für einen Thread angeben, wenn Sie die Funktionen CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateThread oder CreateRemoteThread aufrufen. Wenn Sie NULL angeben, erhält der Thread eine Standardsicherheitsbeschreibung. Die ACLs im Standardsicherheitsdeskriptor für einen Thread stammen aus dem primären Token oder identitätswechsel des Erstellers.
Um die Sicherheitsbeschreibung eines Threads abzurufen, rufen Sie die GetSecurityInfo-Funktion auf. Um die Sicherheitsbeschreibung eines Threads zu ändern, rufen Sie die SetSecurityInfo-Funktion auf.
Das von der CreateThread-Funktion zurückgegebene Handle hat THREAD_ALL_ACCESS Zugriff auf das Threadobjekt. Wenn Sie die GetCurrentThread-Funktion aufrufen, gibt das System eine Pseudohandle mit dem maximalen Zugriff zurück, den der Sicherheitsdeskriptor des Threads dem Aufrufer zulässt.
Zu den gültigen Zugriffsrechten für Threadobjekte gehören die Standardzugriffsrechte und einige threadspezifische Zugriffsrechte. In der folgenden Tabelle sind die Standardzugriffsrechte aufgeführt, die von allen Objekten verwendet werden.
Wert | Bedeutung |
---|---|
DELETE (0x00010000L) | Erforderlich, um das Objekt zu löschen. |
READ_CONTROL (0x00020000L) | Erforderlich, um Informationen im Sicherheitsdeskriptor für das Objekt zu lesen, ohne die Informationen in der SACL. Zum Lesen oder Schreiben der SACL müssen Sie das zugriffsrecht ACCESS_SYSTEM_SECURITY anfordern. Weitere Informationen finden Sie unter SACL-Zugriffsberechtigung. |
SYNCHRONIZE (0x00100000L) | Das Recht, das Objekt für die Synchronisierung zu verwenden. Dadurch kann ein Thread warten, bis sich das Objekt im signalierten Zustand befindet. |
WRITE_DAC (0x00040000L) | Erforderlich, um die DACL im Sicherheitsdeskriptor für das Objekt zu ändern. |
WRITE_OWNER (0x00080000L) | Erforderlich, um den Besitzer im Sicherheitsdeskriptor für das Objekt zu ändern. |
In der folgenden Tabelle sind die threadspezifischen Zugriffsrechte aufgeführt.
Wert | Bedeutung |
---|---|
SYNCHRONIZE (0x00100000L) | Ermöglicht die Verwendung des Threadhandles in einer der Wartefunktionen. |
THREAD_ALL_ACCESS | Alle möglichen Zugriffsrechte für ein Threadobjekt. Windows Server 2003 und Windows XP: Der Wert des THREAD_ALL_ACCESS-Flags wurde unter Windows Server 2008 und Windows Vista erhöht. Wenn eine für Windows Server 2008 und Windows Vista kompilierte Anwendung unter Windows Server 2003 oder Windows XP ausgeführt wird, enthält das THREAD_ALL_ACCESS-Flag Zugriffsbits, die nicht unterstützt werden, und die Funktion, die dieses Flag angibt, schlägt mit ERROR_ACCESS_DENIED fehl. Um dieses Problem zu vermeiden, geben Sie den Mindestsatz von Zugriffsrechten an, die für den Vorgang erforderlich sind. Wenn THREAD_ALL_ACCESS verwendet werden muss, legen Sie _WIN32_WINNT auf das Mindestbetriebssystem ihrer Anwendung fest (z. B #define _WIN32_WINNT _WIN32_WINNT_WINXP . ). Weitere Informationen finden Sie unter Verwenden der Windows-Header. |
THREAD_DIRECT_IMPERSONATION (0x0200) | Erforderlich für einen Serverthread, der die Identität eines Clients angibt. |
THREAD_GET_CONTEXT (0x0008) | Erforderlich, um den Kontext eines Threads mithilfe von GetThreadContext zu lesen. |
THREAD_IMPERSONATE (0x0100) | Erforderlich, um die Sicherheitsinformationen eines Threads direkt zu verwenden, ohne ihn mithilfe eines Kommunikationsmechanismus zu aufrufen, der Identitätswechseldienste bereitstellt. |
THREAD_QUERY_INFORMATION (0x0040) | Erforderlich, um bestimmte Informationen aus dem Threadobjekt zu lesen, z. B. den Exitcode (siehe GetExitCodeThread). |
THREAD_QUERY_LIMITED_INFORMATION (0x0800) | Erforderlich, um bestimmte Informationen aus den Threadobjekten zu lesen (siehe GetProcessIdOfThread). Ein Handle, das über das THREAD_QUERY_INFORMATION-Zugriffsrecht verfügt, wird automatisch THREAD_QUERY_LIMITED_INFORMATION gewährt. Windows Server 2003 und Windows XP: Dieses Zugriffsrecht wird nicht unterstützt. |
THREAD_SET_CONTEXT (0x0010) | Erforderlich, um den Kontext eines Threads mit SetThreadContext zu schreiben. |
THREAD_SET_INFORMATION (0x0020) | Erforderlich, um bestimmte Informationen im Threadobjekt festzulegen. |
THREAD_SET_LIMITED_INFORMATION (0x0400) | Erforderlich, um bestimmte Informationen im Threadobjekt festzulegen. Ein Handle, das über das THREAD_SET_INFORMATION-Zugriffsrecht verfügt, wird automatisch THREAD_SET_LIMITED_INFORMATION gewährt. Windows Server 2003 und Windows XP: Dieses Zugriffsrecht wird nicht unterstützt. |
THREAD_SET_THREAD_TOKEN (0x0080) | Erforderlich, um das Identitätswechseltoken für einen Thread mit SetThreadToken festzulegen. |
THREAD_SUSPEND_RESUME (0x0002) | Erforderlich zum Anhalten oder Fortsetzen eines Threads (siehe SuspendThread und ResumeThread). |
THREAD_TERMINATE (0x0001) | Erforderlich, um einen Thread mit TerminateThread zu beenden. |
Sie können das ACCESS_SYSTEM_SECURITY Zugriffsrecht auf ein Threadobjekt anfordern, wenn Sie die SACL des Objekts lesen oder schreiben möchten. Weitere Informationen finden Sie unter Zugriffssteuerungslisten (Access-Control Lists, ACLs) und SACL-Zugriffsberechtigung.
Geschützte Prozesse
Geschützte Prozesse verbessern die Unterstützung von Digital Rights Management. Das System schränkt den Zugriff auf geschützte Prozesse und die Threads geschützter Prozesse ein.
Windows Server 2003 und Windows XP: Geschützte Prozesse wurden ab Windows Vista hinzugefügt.
Die folgenden spezifischen Zugriffsrechte sind von einem Prozess auf die Threads eines geschützten Prozesses nicht zulässig:
THREAD_ALL_ACCESS
THREAD_DIRECT_IMPERSONATION
THREAD_GET_CONTEXT
THREAD_IMPERSONATE
THREAD_QUERY_INFORMATION
THREAD_SET_CONTEXT
THREAD_SET_INFORMATION
THREAD_SET_TOKEN
THREAD_TERMINATE
Das THREAD_QUERY_LIMITED_INFORMATION Recht wurde eingeführt, um den Zugriff auf eine Teilmenge der über THREAD_QUERY_INFORMATION verfügbaren Informationen zu ermöglichen.