Freigeben über


CreateProcessAsUserW-Funktion (processthreadsapi.h)

Erstellt einen neuen Prozess und seinen primären Thread. Der neue Prozess wird im Sicherheitskontext des Benutzers ausgeführt, der durch das angegebene Token dargestellt wird.

In der Regel muss der Prozess, der die CreateProcessAsUser-Funktion aufruft, über die SE_INCREASE_QUOTA_NAME-Berechtigung verfügen und ggf. die SE_ASSIGNPRIMARYTOKEN_NAME-Berechtigung erfordern, wenn das Token nicht zugewiesen werden kann. Wenn diese Funktion mit ERROR_PRIVILEGE_NOT_HELD (1314) fehlschlägt, verwenden Sie stattdessen die CreateProcessWithLogonW-Funktion . CreateProcessWithLogonW erfordert keine speziellen Berechtigungen, aber das angegebene Benutzerkonto muss sich interaktiv anmelden dürfen. Im Allgemeinen empfiehlt es sich, CreateProcessWithLogonW zu verwenden, um einen Prozess mit alternativen Anmeldeinformationen zu erstellen.

Syntax

BOOL CreateProcessAsUserW(
  [in, optional]      HANDLE                hToken,
  [in, optional]      LPCWSTR               lpApplicationName,
  [in, out, optional] LPWSTR                lpCommandLine,
  [in, optional]      LPSECURITY_ATTRIBUTES lpProcessAttributes,
  [in, optional]      LPSECURITY_ATTRIBUTES lpThreadAttributes,
  [in]                BOOL                  bInheritHandles,
  [in]                DWORD                 dwCreationFlags,
  [in, optional]      LPVOID                lpEnvironment,
  [in, optional]      LPCWSTR               lpCurrentDirectory,
  [in]                LPSTARTUPINFOW        lpStartupInfo,
  [out]               LPPROCESS_INFORMATION lpProcessInformation
);

Parameter

[in, optional] hToken

Ein Handle für das primäre Token, das einen Benutzer darstellt. Das Handle muss über die Zugriffsrechte TOKEN_QUERY, TOKEN_DUPLICATE und TOKEN_ASSIGN_PRIMARY verfügen. Weitere Informationen finden Sie unter Zugriffsrechte für Access-Token-Objekte. Der durch das Token dargestellte Benutzer muss Über Lese- und Ausführungszugriff auf die Anwendung verfügen, die durch den lpApplicationName- oder lpCommandLine-Parameter angegeben wird.

Um ein primäres Token abzurufen, das den angegebenen Benutzer darstellt, rufen Sie die LogonUser-Funktion auf. Alternativ können Sie die DuplicateTokenEx-Funktion aufrufen, um ein Identitätswechseltoken in ein primäres Token zu konvertieren. Dadurch kann eine Serveranwendung, die die Identität eines Clients angibt, einen Prozess erstellen, der über den Sicherheitskontext des Clients verfügt.

Wenn hToken eine eingeschränkte Version des primären Tokens des Aufrufers ist, ist die berechtigung SE_ASSIGNPRIMARYTOKEN_NAME nicht erforderlich. Wenn die erforderlichen Berechtigungen noch nicht aktiviert sind, aktiviert CreateProcessAsUser sie für die Dauer des Aufrufs. Weitere Informationen finden Sie unter Ausführen mit speziellen Berechtigungen.

Terminaldienste: Der Prozess wird in der im Token angegebenen Sitzung ausgeführt. Standardmäßig ist dies die gleiche Sitzung, die LogonUser aufgerufen hat. Verwenden Sie die SetTokenInformation-Funktion , um die Sitzung zu ändern.

[in, optional] lpApplicationName

Der Name des auszuführenden Moduls. Dieses Modul kann eine Windows-basierte Anwendung sein. Es kann sich um einen anderen Modultyp (z. B. MS-DOS oder OS/2) handeln, wenn das entsprechende Subsystem auf dem lokalen Computer verfügbar ist.

Die Zeichenfolge kann den vollständigen Pfad und Dateinamen des auszuführenden Moduls oder einen Teilnamen angeben. Bei einem Teilnamen verwendet die Funktion das aktuelle Laufwerk und das aktuelle Verzeichnis, um die Spezifikation zu vervollständigen. Die Funktion verwendet nicht den Suchpfad. Dieser Parameter muss die Dateinamenerweiterung enthalten. Es wird keine Standarderweiterung angenommen.

Der lpApplicationName-Parameter kann NULL sein. In diesem Fall muss der Modulname das erste leerzeichentrennte Token in der lpCommandLine-Zeichenfolge sein. Wenn Sie einen langen Dateinamen verwenden, der ein Leerzeichen enthält, verwenden Sie Zeichenfolgen in Anführungszeichen, um anzugeben, wo der Dateiname endet und die Argumente beginnen. Andernfalls ist der Dateiname mehrdeutig. Betrachten Sie beispielsweise die Zeichenfolge "c:\program files\sub dir\program name". Diese Zeichenfolge kann auf verschiedene Arten interpretiert werden. Das System versucht, die Möglichkeiten in der folgenden Reihenfolge zu interpretieren:

c:\program.exec:\program files\sub.exec:\program files\sub dir\program.exec:\program files\sub dir\program name.exe Wenn es sich bei dem ausführbaren Modul um eine 16-Bit-Anwendung handelt, sollte lpApplicationNameNULL sein, und die Zeichenfolge, auf die lpCommandLine verweist, sollte das ausführbare Modul sowie seine Argumente angeben. Standardmäßig werden alle 16-Bit-Windows-basierten Anwendungen, die von CreateProcessAsUser erstellt werden, in einem separaten VDM ausgeführt (entspricht CREATE_SEPARATE_WOW_VDM in CreateProcess).

[in, out, optional] lpCommandLine

Die auszuführende Befehlszeile. Die maximale Länge dieser Zeichenfolge beträgt 32.000 Zeichen. Wenn lpApplicationNameNULL ist, ist der Modulnamenteil von lpCommandLine auf MAX_PATH Zeichen beschränkt.

Die Unicode-Version dieser Funktion , CreateProcessAsUserW, kann den Inhalt dieser Zeichenfolge ändern. Daher kann dieser Parameter kein Zeiger auf schreibgeschützten Arbeitsspeicher (z. B. eine const-Variable oder eine Literalzeichenfolge) sein. Wenn es sich bei diesem Parameter um eine konstante Zeichenfolge handelt, kann die Funktion zu einer Zugriffsverletzung führen.

Der lpCommandLine-Parameter kann NULL sein. In diesem Fall verwendet die Funktion die Zeichenfolge, auf die lpApplicationName als Befehlszeile verweist.

Wenn sowohl lpApplicationName als auch lpCommandLine ungleich NULL sind, gibt *lpApplicationName das auszuführende Modul an, und *lpCommandLine gibt die Befehlszeile an. Der neue Prozess kann GetCommandLine verwenden, um die gesamte Befehlszeile abzurufen. In C geschriebene Konsolenprozesse können die Argumente argc und argv verwenden, um die Befehlszeile zu analysieren. Da argv[0] der Modulname ist, wiederholen C-Programmierer in der Regel den Modulnamen als erstes Token in der Befehlszeile.

Wenn lpApplicationNameNULL ist, gibt das erste leerzeichentrennte Token der Befehlszeile den Modulnamen an. Wenn Sie einen langen Dateinamen verwenden, der ein Leerzeichen enthält, verwenden Sie Zeichenfolgen in Anführungszeichen, um anzugeben, wo der Dateiname endet und die Argumente beginnen (siehe Erklärung für den lpApplicationName-Parameter ). Wenn der Dateiname keine Erweiterung enthält, wird .exe angefügt. Wenn die Dateinamenerweiterung .com ist, muss dieser Parameter daher die erweiterung .com enthalten. Wenn der Dateiname mit einem Punkt (.) ohne Erweiterung endet oder der Dateiname einen Pfad enthält, wird .exe nicht angefügt. Wenn der Dateiname keinen Verzeichnispfad enthält, sucht das System in der folgenden Reihenfolge nach der ausführbaren Datei:

  1. Das Verzeichnis, aus dem die Anwendung geladen wurde.
  2. Das aktuelle Verzeichnis für den übergeordneten Prozess.
  3. Das 32-Bit-Windows-Systemverzeichnis. Verwenden Sie die GetSystemDirectory-Funktion , um den Pfad dieses Verzeichnisses abzurufen.
  4. Das 16-Bit-Windows-Systemverzeichnis. Es gibt keine Funktion, die den Pfad dieses Verzeichnisses abruft, aber er wird durchsucht.
  5. Das Windows-Verzeichnis. Verwenden Sie die GetWindowsDirectory-Funktion , um den Pfad dieses Verzeichnisses abzurufen.
  6. Die Verzeichnisse, die in der PATH-Umgebungsvariablen aufgeführt sind. Beachten Sie, dass diese Funktion nicht den anwendungsspezifischen Pfad durchsucht, der vom Registrierungsschlüssel App-Pfad angegeben wird. Verwenden Sie die Funktion ShellExecute , um diesen Anwendungspfad in die Suchsequenz einzuschließen.
Das System fügt der Befehlszeilenzeichenfolge ein NULL-Zeichen hinzu, um den Dateinamen von den Argumenten zu trennen. Dadurch wird die ursprüngliche Zeichenfolge für die interne Verarbeitung in zwei Zeichenfolgen unterteilt.

[in, optional] lpProcessAttributes

Ein Zeiger auf eine SECURITY_ATTRIBUTES-Struktur , die einen Sicherheitsdeskriptor für das neue Prozessobjekt angibt und bestimmt, ob untergeordnete Prozesse das zurückgegebene Handle an den Prozess erben können. Wenn lpProcessAttributesNULL oder lpSecurityDescriptorNULL ist, ruft der Prozess einen Standardsicherheitsdeskriptor ab, und das Handle kann nicht geerbt werden. Die Standardsicherheitsbeschreibung ist die des Benutzers, auf den im hToken-Parameter verwiesen wird. Dieser Sicherheitsdeskriptor lässt den Zugriff für den Aufrufer möglicherweise nicht zu. In diesem Fall wird der Prozess nach der Ausführung möglicherweise nicht mehr geöffnet. Das Prozesshandle ist gültig und verfügt weiterhin über Vollzugriffsrechte.

[in, optional] lpThreadAttributes

Ein Zeiger auf eine SECURITY_ATTRIBUTES-Struktur , die einen Sicherheitsdeskriptor für das neue Threadobjekt angibt und bestimmt, ob untergeordnete Prozesse das zurückgegebene Handle an den Thread erben können. Wenn lpThreadAttributesNULL oder lpSecurityDescriptorNULL ist, erhält der Thread einen Standardsicherheitsdeskriptor, und das Handle kann nicht geerbt werden. Die Standardsicherheitsbeschreibung ist die des Benutzers, auf den im hToken-Parameter verwiesen wird. Dieser Sicherheitsdeskriptor lässt den Zugriff für den Aufrufer möglicherweise nicht zu.

[in] bInheritHandles

Wenn dieser Parameter TRUE ist, wird jedes vererbbare Handle im aufrufenden Prozess vom neuen Prozess geerbt. Wenn der Parameter FALSE ist, werden die Handles nicht geerbt. Beachten Sie, dass geerbte Handles den gleichen Wert und dieselben Zugriffsrechte wie die ursprünglichen Handles haben. Weitere Informationen zu vererbbaren Handles finden Sie unter Hinweise.

Terminaldienste: Sie können handles nicht sitzungsübergreifend erben. Wenn dieser Parameter TRUE ist, müssen Sie den Prozess in derselben Sitzung wie der Aufrufer erstellen.

Geschützte Prozesslichtprozesse (PPL): Die generische Handlevererbung wird blockiert, wenn ein PPL-Prozess einen Nicht-PPL-Prozess erstellt, da PROCESS_DUP_HANDLE von einem Nicht-PPL-Prozess in einen PPL-Prozess nicht zulässig ist. Weitere Informationen finden Sie unter Prozesssicherheit und Zugriffsrechte.

[in] dwCreationFlags

Die Flags, die die Prioritätsklasse und die Erstellung des Prozesses steuern. Eine Liste der Werte finden Sie unter Prozesserstellungsflags.

Dieser Parameter steuert auch die Prioritätsklasse des neuen Prozesses, die verwendet wird, um die Planungsprioritäten der Prozessthreads zu bestimmen. Eine Liste der Werte finden Sie unter GetPriorityClass. Wenn keines der Prioritätsklassenflags angegeben ist, wird die Prioritätsklasse standardmäßig auf NORMAL_PRIORITY_CLASS festgelegt , es sei denn, die Prioritätsklasse des Erstellungsprozesses ist IDLE_PRIORITY_CLASS oder BELOW_NORMAL_PRIORITY_CLASS. In diesem Fall erhält der untergeordnete Prozess die Standardprioritätsklasse des aufrufenden Prozesses.

Wenn der dwCreationFlags-Parameter den Wert 0 aufweist:

  • Der Prozess erbt sowohl den Fehlermodus des Aufrufers als auch die Konsole des übergeordneten Elements.
  • Es wird davon ausgegangen, dass der Umgebungsblock für den neuen Prozess ANSI-Zeichen enthält (weitere Informationen finden Sie unter lpEnvironment-Parameter ).
  • Eine 16-Bit-Windows-basierte Anwendung wird auf einem freigegebenen virtuellen DOS-Computer (VDM) ausgeführt.

[in, optional] lpEnvironment

Ein Zeiger auf einen Umgebungsblock für den neuen Prozess. Wenn dieser Parameter NULL ist, verwendet der neue Prozess die Umgebung des aufrufenden Prozesses.

Ein Umgebungsblock besteht aus einem null-beendeten Block mit NULL-Zeichenfolgen. Jede Zeichenfolge hat die folgende Form:

Namen=value\0

Da das Gleichheitszeichen als Trennzeichen verwendet wird, darf es nicht im Namen einer Umgebungsvariablen verwendet werden.

Ein Umgebungsblock kann entweder Unicode- oder ANSI-Zeichen enthalten. Wenn der Umgebungsblock, auf den lpEnvironment verweist, Unicode-Zeichen enthält, stellen Sie sicher, dass dwCreationFlagsCREATE_UNICODE_ENVIRONMENT enthält.

Die ANSI-Version dieser Funktion CreateProcessAsUserA schlägt fehl, wenn die Gesamtgröße des Umgebungsblocks für den Prozess 32.767 Zeichen überschreitet.

Beachten Sie, dass ein ANSI-Umgebungsblock mit zwei 0 Bytes beendet wird: eins für die letzte Zeichenfolge und ein weiteres zum Beenden des Blocks. Ein Unicode-Umgebungsblock wird durch vier Nullbytes beendet: zwei für die letzte Zeichenfolge, zwei weitere zum Beenden des Blocks.

Windows Server 2003 und Windows XP: Wenn die Größe der kombinierten Benutzer- und Systemumgebungsvariable 8192 Bytes überschreitet, wird der von CreateProcessAsUser erstellte Prozess nicht mehr mit dem Umgebungsblock ausgeführt, der vom übergeordneten Prozess an die Funktion übergeben wird. Stattdessen wird der untergeordnete Prozess mit dem Umgebungsblock ausgeführt, der von der CreateEnvironmentBlock-Funktion zurückgegeben wird.

Verwenden Sie die Funktion CreateEnvironmentBlock , um eine Kopie des Umgebungsblocks für einen bestimmten Benutzer abzurufen.

[in, optional] lpCurrentDirectory

Der vollständige Pfad zum aktuellen Verzeichnis für den Prozess. Die Zeichenfolge kann auch einen UNC-Pfad angeben.

Wenn dieser Parameter NULL ist, verwendet der neue Prozess dasselbe aktuelle Laufwerk und Verzeichnis wie der aufrufende Prozess. (Dieses Feature wird in erster Linie für Shells bereitgestellt, die eine Anwendung starten und das anfängliche Laufwerk und das Arbeitsverzeichnis angeben müssen.)

[in] lpStartupInfo

Ein Zeiger auf eine STARTUPINFO - oder STARTUPINFOEX-Struktur .

Der Benutzer muss vollzugriff auf die angegebene Fensterstation und den Desktop haben. Wenn der Prozess interaktiv sein soll, geben Sie winsta0\default an. Wenn das lpDesktop-Element NULL ist, erbt der neue Prozess die Desktop- und Fensterstation des übergeordneten Prozesses. Wenn es sich bei diesem Member um eine leere Zeichenfolge "" handelt, stellt der neue Prozess eine Verbindung mit einer Fensterstation mithilfe der unter Prozessverbindung mit einer Window Station beschriebenen Regeln her.

Verwenden Sie zum Festlegen erweiterter Attribute eine STARTUPINFOEX-Struktur , und geben Sie EXTENDED_STARTUPINFO_PRESENT im dwCreationFlags-Parameter an.

Handles in STARTUPINFO oder STARTUPINFOEX müssen mit CloseHandle geschlossen werden, wenn sie nicht mehr benötigt werden.

Wichtig Der Aufrufer ist dafür verantwortlich, sicherzustellen, dass die Standardhandlefelder in STARTUPINFO gültige Handlewerte enthalten. Diese Felder werden unverändert ohne Überprüfung in den untergeordneten Prozess kopiert, auch wenn der dwFlags-MemberSTARTF_USESTDHANDLES angibt. Falsche Werte können dazu führen, dass sich der untergeordnete Prozess falsch benimmt oder abstürzt. Verwenden Sie das Application Verifier Runtime-Überprüfungstool, um ungültige Handles zu erkennen.
 

[out] lpProcessInformation

Ein Zeiger auf eine PROCESS_INFORMATION-Struktur , die Identifikationsinformationen zum neuen Prozess empfängt.

Handles in PROCESS_INFORMATION müssen mit CloseHandle geschlossen werden, wenn sie nicht mehr benötigt werden.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.

Wenn die Funktion fehlerhaft ist, ist der Rückgabewert null. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.

Beachten Sie, dass die Funktion zurückgegeben wird, bevor die Initialisierung abgeschlossen ist. Wenn eine erforderliche DLL nicht gefunden werden kann oder nicht initialisiert werden kann, wird der Prozess beendet. Um die Beendigung status eines Prozesses zu erhalten, rufen Sie GetExitCodeProcess auf.

Hinweise

CreateProcessAsUser muss in der Lage sein, das primäre Token des aufrufenden Prozesses mit dem TOKEN_DUPLICATE und TOKEN_IMPERSONATE Zugriffsrechten zu öffnen.

Standardmäßig erstellt CreateProcessAsUser den neuen Prozess auf einer nichtinteraktiven Fensterstation mit einem Desktop, der nicht sichtbar ist und keine Benutzereingaben empfangen kann. Um die Benutzerinteraktion mit dem neuen Prozess zu aktivieren, müssen Sie den Namen der standardmäßigen interaktiven Fensterstation und des Desktops "winsta0\default" im lpDesktop-Element der STARTUPINFO-Struktur angeben. Darüber hinaus müssen Sie vor dem Aufrufen von CreateProcessAsUser die diskretionäre Zugriffssteuerungsliste (DACL) der standardmäßigen interaktiven Fensterstation und des Standarddesktops ändern. Die DACLs für die Fensterstation und den Desktop müssen dem Benutzer oder der Anmeldesitzung zugriff gewähren, die durch den hToken-Parameter dargestellt wird.

CreateProcessAsUser lädt das profil des angegebenen Benutzers nicht in den HKEY_USERS Registrierungsschlüssel. Daher müssen Sie für den Zugriff auf die Informationen im HKEY_CURRENT_USER Registrierungsschlüssel die Profilinformationen des Benutzers mit der LoadUserProfile-Funktion in HKEY_USERS laden, bevor Sie CreateProcessAsUser aufrufen. Rufen Sie UnloadUserProfile auf, nachdem der neue Prozess beendet wurde.

Wenn der lpEnvironment-Parameter NULL ist, erbt der neue Prozess die Umgebung des aufrufenden Prozesses. CreateProcessAsUser ändert den Umgebungsblock nicht automatisch so, dass er Umgebungsvariablen enthält, die für den von hToken dargestellten Benutzer spezifisch sind. Beispielsweise werden die VARIABLEN USERNAME und USERDOMAIN vom aufrufenden Prozess geerbt, wenn lpEnvironment NULL ist. Es liegt in Ihrer Verantwortung, den Umgebungsblock für den neuen Prozess vorzubereiten und ihn in lpEnvironment anzugeben.

Die Funktionen CreateProcessWithLogonW und CreateProcessWithTokenW ähneln CreateProcessAsUser, mit der Ausnahme, dass der Aufrufer die LogonUser-Funktion nicht aufrufen muss, um den Benutzer zu authentifizieren und ein Token abzurufen.

CreateProcessAsUser ermöglicht Ihnen den Zugriff auf das angegebene Verzeichnis und das ausführbare Image im Sicherheitskontext des Aufrufers oder des Zielbenutzers. Standardmäßig greift CreateProcessAsUser auf das Verzeichnis und das ausführbare Image im Sicherheitskontext des Aufrufers zu. Wenn der Aufrufer in diesem Fall keinen Zugriff auf das Verzeichnis und das ausführbare Image hat, schlägt die Funktion fehl. Um mithilfe des Sicherheitskontexts des Zielbenutzers auf das Verzeichnis und die ausführbare Datei zuzugreifen, geben Sie hToken in einem Aufruf der ImpersonateLoggedOnUser-Funktion an, bevor Sie CreateProcessAsUser aufrufen.

Dem Prozess wird ein Prozessbezeichner zugewiesen. Der Bezeichner ist gültig, bis der Prozess beendet wird. Es kann verwendet werden, um den Prozess zu identifizieren, oder in der OpenProcess-Funktion angegeben werden, um ein Handle für den Prozess zu öffnen. Dem anfänglichen Thread im Prozess wird auch ein Threadbezeichner zugewiesen. Es kann in der OpenThread-Funktion angegeben werden, um ein Handle für den Thread zu öffnen. Der Bezeichner ist gültig, bis der Thread beendet wird und kann verwendet werden, um den Thread innerhalb des Systems eindeutig zu identifizieren. Diese Bezeichner werden in der PROCESS_INFORMATION-Struktur zurückgegeben.

Der aufrufende Thread kann die WaitForInputIdle-Funktion verwenden, um zu warten, bis der neue Prozess seine Initialisierung abgeschlossen hat und auf Eine Benutzereingabe ohne ausstehende Eingabe wartet. Dies kann für die Synchronisierung zwischen übergeordneten und untergeordneten Prozessen nützlich sein, da CreateProcessAsUser zurückgibt, ohne darauf zu warten, dass der neue Prozess seine Initialisierung abgeschlossen hat. Der Erstellungsprozess verwendet beispielsweise WaitForInputIdle , bevor versucht wird, ein Fenster zu finden, das dem neuen Prozess zugeordnet ist.

Die bevorzugte Möglichkeit zum Herunterfahren eines Prozesses ist die Verwendung der ExitProcess-Funktion , da diese Funktion eine Benachrichtigung über die bevorstehende Beendigung an alle DLLs sendet, die an den Prozess angefügt sind. Andere Mittel zum Herunterfahren eines Prozesses benachrichtigen die angefügten DLLs nicht. Beachten Sie, dass, wenn ein Thread ExitProcess aufruft, andere Threads des Prozesses beendet werden, ohne dass zusätzlichen Code ausgeführt werden kann (einschließlich des Threadabschlusscodes der angefügten DLLs). Weitere Informationen finden Sie unter Beenden eines Prozesses.

Standardmäßig bewirkt die Übergabe von TRUE als Wert des bInheritHandles-Parameters , dass alle vererbbaren Handles vom neuen Prozess geerbt werden. Dies kann problematisch für Anwendungen sein, die Prozesse aus mehreren Threads gleichzeitig erstellen, aber von jedem Prozess unterschiedliche Handles erben möchten. Anwendungen können die UpdateProcThreadAttributeList-Funktion mit dem parameter PROC_THREAD_ATTRIBUTE_HANDLE_LIST verwenden, um eine Liste von Handles bereitzustellen, die von einem bestimmten Prozess geerbt werden sollen.

Sicherheitsbemerkungen

Der lpApplicationName-Parameter kann NULL sein. In diesem Fall muss der name der ausführbaren Datei die erste durch Leerzeichen getrennte Zeichenfolge in lpCommandLine sein. Wenn die ausführbare Datei oder der Pfadname ein Leerzeichen enthält, besteht das Risiko, dass eine andere ausführbare Datei ausgeführt werden kann, da die Funktion Leerzeichen analysiert. Das folgende Beispiel ist gefährlich, da die Funktion versucht, "Program.exe" (falls vorhanden) anstelle von "MyApp.exe" auszuführen.
	LPTSTR szCmdline[] = _tcsdup(TEXT("C:\\Program Files\\MyApp"));
	CreateProcessAsUser(hToken, NULL, szCmdline, /*...*/ );

Wenn ein böswilliger Benutzer eine Anwendung namens "Program.exe" auf einem System erstellen würde, führt jedes Programm, das createProcessAsUser fälschlicherweise über das Verzeichnis Programme aufruft, diese Anwendung anstelle der beabsichtigten Anwendung aus.

Um dieses Problem zu vermeiden, übergeben Sie NULL nicht für lpApplicationName. Wenn Sie NULL für lpApplicationName übergeben, verwenden Sie Anführungszeichen um den ausführbaren Pfad in lpCommandLine, wie im folgenden Beispiel gezeigt.

	LPTSTR szCmdline[] = _tcsdup(TEXT("\"C:\\Program Files\\MyApp\""));
	CreateProcessAsUser(hToken, NULL, szCmdline, /*...*/);

Powershell: Wenn die CreateProcessAsUser-Funktion verwendet wird, um ein Cmdlet in PowerShell Version 2.0 zu implementieren, funktioniert das Cmdlet ordnungsgemäß sowohl für Fan-In- als auch für Fan-Out-Remotesitzungen. Aufgrund bestimmter Sicherheitsszenarien funktioniert ein mit CreateProcessAsUser implementiertes Cmdlet in PowerShell Version 3.0 jedoch nur ordnungsgemäß für Fan-in-Remotesitzungen. Remotesitzungen aufgrund unzureichender Clientsicherheitsberechtigungen schlagen fehl. Verwenden Sie die CreateProcess-Funktion , um ein Cmdlet zu implementieren, das sowohl für Fan-In- als auch für Fan-Out-Remotesitzungen in PowerShell 3.0 funktioniert.

Beispiele

Ein Beispiel finden Sie unter Starten eines interaktiven Clientprozesses.

Hinweis

Der processthreadsapi.h-Header definiert CreateProcessAsUser als Alias, der automatisch die ANSI- oder Unicode-Version dieser Funktion basierend auf der Definition der UNICODE-Präprozessorkonstante auswählt. Das Mischen der Verwendung des codierungsneutralen Alias mit nicht codierungsneutralem Code kann zu Nichtübereinstimmungen führen, die zu Kompilierungs- oder Laufzeitfehlern führen. Weitere Informationen finden Sie unter Konventionen für Funktionsprototypen.

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 processthreadsapi.h (einschließlich Windows.h)
Bibliothek Advapi32.lib
DLL Advapi32.dll

Weitere Informationen

CloseHandle

CreateEnvironmentBlock

CreateProcess

CreateProcessWithLogonW

ExitProcess

GetEnvironmentStrings

GetExitCodeProcess

GetStartupInfo

IdentitätswechselLoggedOnUser

LoadUserProfile

PROCESS_INFORMATION

Prozess- und Threadfunktionen

Prozesse

SECURITY_ATTRIBUTES

SHCreateProcessAsUserW

STARTUPINFO

STARTUPINFOEX

SetErrorMode

Waitforinputidle