Freigeben über


CreateProcessAsUserA-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 möglicherweise 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 CreateProcessAsUserA(
  [in, optional]      HANDLE                hToken,
  [in, optional]      LPCSTR                lpApplicationName,
  [in, out, optional] LPSTR                 lpCommandLine,
  [in, optional]      LPSECURITY_ATTRIBUTES lpProcessAttributes,
  [in, optional]      LPSECURITY_ATTRIBUTES lpThreadAttributes,
  [in]                BOOL                  bInheritHandles,
  [in]                DWORD                 dwCreationFlags,
  [in, optional]      LPVOID                lpEnvironment,
  [in, optional]      LPCSTR                lpCurrentDirectory,
  [in]                LPSTARTUPINFOA        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 TOKEN_QUERY, TOKEN_DUPLICATEund TOKEN_ASSIGN_PRIMARY Zugriffsrechte verfügen. Weitere Informationen finden Sie unter Access Rights for Access-Token Objects. Der durch das Token dargestellte Benutzer muss Lese- und Ausführungszugriff auf die anwendung haben, die durch die lpApplicationName oder den lpCommandLine Parameter angegeben wurde.

Rufen Sie zum Abrufen eines primären Tokens, das den angegebenen Benutzer darstellt, die funktion LogonUser 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 den Identitätswechsel eines Clients angibt, einen Prozess erstellen, der den Sicherheitskontext des Clients aufweist.

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

Terminaldienste: Der Prozess wird in der im Token angegebenen Sitzung ausgeführt. Standardmäßig ist dies dieselbe Sitzung, die LogonUseraufgerufen hat. Verwenden Sie zum Ändern der Sitzung die SetTokenInformation--Funktion.

[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 angeben oder einen Teilnamen angeben. Bei einem Teilnamen verwendet die Funktion das aktuelle Laufwerk und das aktuelle Verzeichnis, um die Spezifikation abzuschließen. Die Funktion verwendet nicht den Suchpfad. Dieser Parameter muss die Dateinamenerweiterung enthalten; es wird keine Standarderweiterung angenommen.

Der parameter lpApplicationName 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 an zitierte Zeichenfolgen, 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 das ausführbare Modul eine 16-Bit-Anwendung ist, sollte lpApplicationName-NULL-sein, und die Zeichenfolge, auf die von lpCommandLine verweist, sollte das ausführbare Modul sowie die zugehörigen Argumente angeben. Standardmäßig werden alle 16-Bit-Windows-basierten Anwendungen, die von CreateProcessAsUser- erstellt wurden, 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 KB. Wenn lpApplicationNameNULL-ist, ist der Modulnameteil 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 Speicher sein (z. B. eine Variable oder eine Literalzeichenfolge). Wenn dieser Parameter eine konstante Zeichenfolge ist, kann die Funktion einen Zugriffsverstoß verursachen.

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

Wenn sowohl lpApplicationName als auch lpCommandLine- nichtNULL-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. Konsolenprozesse, die in C geschrieben wurden, können die argc und argv Argumente verwenden, um die Befehlszeile zu analysieren. Da Argv[0] der Modulname ist, wiederholen C-Programmierer im Allgemeinen den Modulnamen als erstes Token in der Befehlszeile.

Wenn lpApplicationNameNULL-ist, gibt das erste durch Leerzeichen getrennte Token der Befehlszeile den Modulnamen an. Wenn Sie einen langen Dateinamen verwenden, der ein Leerzeichen enthält, verwenden Sie Zeichenfolgen, um anzugeben, wo der Dateiname endet und die Argumente beginnen (siehe Erläuterung 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 .com Erweiterung enthalten. Wenn der Dateiname in einem Punkt (.) ohne Erweiterung endet oder wenn der Dateiname einen Pfad enthält, wird .exe nicht angefügt. Wenn der Dateiname keinen Verzeichnispfad enthält, sucht das System in der folgenden Sequenz 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 es wird durchsucht.
  5. Das Windows-Verzeichnis. Verwenden Sie die GetWindowsDirectory--Funktion, um den Pfad dieses Verzeichnisses abzurufen.
  6. Die Verzeichnisse, die in der PATH-Umgebungsvariable aufgeführt sind. Beachten Sie, dass diese Funktion nicht den vom App-Pfad Registrierungsschlüssel angegebenen Anwendungspfade durchsucht. Um diesen Anwendungspfad in die Suchsequenz einzuschließen, verwenden Sie die ShellExecute-Funktion.
Das System fügt der Befehlszeilenzeichenfolge ein NULL-Zeichen hinzu, um den Dateinamen von den Argumenten zu trennen. Dadurch wird die ursprüngliche Zeichenfolge in zwei Zeichenfolgen für die interne Verarbeitung 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 den zurückgegebenen Handle an den Prozess erben können. Wenn lpProcessAttributes-NULL- oder lpSecurityDescriptor-NULL-ist, erhält der Prozess einen Standardsicherheitsdeskriptor, und der Handle kann nicht geerbt werden. Der Standardsicherheitsdeskriptor ist der des Benutzers, auf den im hToken-Parameter verwiesen wird. Dieser Sicherheitsdeskriptor lässt möglicherweise keinen Zugriff für den Aufrufer zu, in diesem Fall wird der Prozess nach der Ausführung möglicherweise nicht erneut 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 den zurückgegebenen Handle an den Thread erben können. Wenn lpThreadAttributes-NULL- oder lpSecurityDescriptor-NULL-ist, erhält der Thread einen Standardsicherheitsdeskriptor, und der Handle kann nicht geerbt werden. Der Standardsicherheitsdeskriptor ist der des Benutzers, auf den im hToken-Parameter verwiesen wird. Dieser Sicherheitsdeskriptor lässt möglicherweise keinen Zugriff für den Aufrufer zu.

[in] bInheritHandles

Wenn dieser Parameter TRUEist, 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 denselben Wert und zugriffsrechte wie die ursprünglichen Handles aufweisen. Weitere Erläuterungen zu vererbbaren Handles finden Sie in den Anmerkungen.

Terminaldienste: Sie können keine Handles über Sitzungen hinweg erben. Wenn dieser Parameter TRUEist, müssen Sie den Prozess in derselben Sitzung wie der Aufrufer erstellen.

Protected Process Light (PPL)-Prozesse: Die generische Handlevererbung wird blockiert, wenn ein PPL-Prozess einen Nicht-PPL-Prozess erstellt, da PROCESS_DUP_HANDLE von einem Nicht-PPL-Prozess zu einem PPL-Prozess nicht zulässig ist. Siehe Prozesssicherheit und Zugriffsrechte

[in] dwCreationFlags

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

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

Wenn der dwCreationFlags-Parameter den Wert 0 hat:

  • Der Prozess erbt sowohl den Fehlermodus des Aufrufers als auch die Konsole des übergeordneten Elements.
  • Der Umgebungsblock für den neuen Prozess wird als ANSI-Zeichen angenommen (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-beendeten Zeichenfolgen. Jede Zeichenfolge befindet sich in der folgenden Form:

Name=Wert\0

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

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

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

Beachten Sie, dass ein ANSI-Umgebungsblock um zwei Nullbytes beendet wird: eine für die letzte Zeichenfolge, eine weitere zum Beenden des Blocks. Ein Unicode-Umgebungsblock wird durch vier Nullbyte beendet: zwei für die letzte Zeichenfolge, zwei weitere, um den Block zu beenden.

Windows Server 2003 und Windows XP: Wenn die Größe der kombinierten Benutzer- und Systemumgebungsvariable 8192 Byte überschreitet, wird der von CreateProcessAs User 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.

Um eine Kopie des Umgebungsblocks für einen bestimmten Benutzer abzurufen, verwenden Sie die CreateEnvironmentBlock--Funktion.

[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, weist der neue Prozess dasselbe aktuelle Laufwerk und verzeichnis wie der aufrufende Prozess auf. (Dieses Feature wird hauptsächlich für Shells bereitgestellt, die eine Anwendung starten und das ursprü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 der lpDesktop Member NULL ist, erbt der neue Prozess die Desktop- und Fensterstation des übergeordneten Prozesses. Wenn es sich bei diesem Element um eine leere Zeichenfolge "" handelt, stellt der neue Prozess mithilfe der in Prozessverbindung zu einer Window Stationbeschriebenen Regeln eine Verbindung mit einer Fensterstation hergestellt.

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 ohne Überprüfung unverändert in den untergeordneten Prozess kopiert, auch wenn das dwFlags Member STARTF_USESTDHANDLESangibt. Falsche Werte können dazu führen, dass der untergeordnete Prozess falsch ist oder abstürzt. Verwenden Sie das Application Verifier Laufzeitü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 fehlschlägt, ist der Rückgabewert null. Rufen Sie GetLastErrorauf, um erweiterte Fehlerinformationen zu erhalten.

Beachten Sie, dass die Funktion zurückgibt, bevor der Prozess die Initialisierung abgeschlossen hat. Wenn eine erforderliche DLL nicht gefunden werden kann oder nicht initialisiert werden kann, wird der Prozess beendet. Rufen Sie GetExitCodeProcessauf, um den Beendigungsstatus eines Prozesses abzurufen.

Bemerkungen

CreateProcessAsUser- muss das primäre Token des aufrufenden Prozesses mit den TOKEN_DUPLICATE und TOKEN_IMPERSONATE Zugriffsrechten öffnen können.

Standardmäßig erstellt CreateProcessAsUser den neuen Prozess auf einer nichtinteraktiven Fensterstation mit einem Desktop erstellt, der nicht sichtbar ist und keine Benutzereingaben empfangen kann. Um die Benutzerinteraktion mit dem neuen Prozess zu ermöglichen, müssen Sie den Namen der standardmäßigen interaktiven Fensterstation und des Desktops "winsta0\default" im lpDesktop- Mitglied der STARTUPINFO- Struktur angeben. Darüber hinaus müssen Sie vor dem Aufrufen CreateProcessAsUser-die Diskretionäre Zugriffssteuerungsliste (DACL) sowohl der standardmäßigen interaktiven Fensterstation als auch 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. Damit Sie auf die Informationen im registrierungsschlüssel HKEY_CURRENT_USER zugreifen können, müssen Sie die Profilinformationen des Benutzers in HKEY_USERS mit der LoadUserProfile-Funktion laden, bevor Sie CreateProcessAsUser-aufrufen. Achten Sie darauf, UnloadUserProfile- aufzurufen, 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, um Umgebungsvariablen einzuschließen, die für den Benutzer spezifisch sind, der durch hTokendargestellt wird. Die Variablen USERNAME und USERDOMAIN werden beispielsweise vom aufrufenden Prozess geerbt, wenn lpEnvironment- NULL ist. Es liegt in Ihrer Verantwortung, den Umgebungsblock für den neuen Prozess vorzubereiten und in lpEnvironmentanzugeben.

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

CreateProcessAsUser- ermöglicht Es Ihnen, im Sicherheitskontext des Aufrufers oder des Zielbenutzers auf das angegebene Verzeichnis und ausführbare Bild zuzugreifen. Standardmäßig greift CreateProcessAsUser im Sicherheitskontext des Aufrufers auf das Verzeichnis und das ausführbare Image 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 ausführbare Bild 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. Sie kann verwendet werden, um den Prozess zu identifizieren oder in der OpenProcess--Funktion anzugeben, um einen Handle für den Prozess zu öffnen. Dem anfänglichen Thread im Prozess wird auch ein Threadbezeichner zugewiesen. Sie kann in der OpenThread--Funktion angegeben werden, um einen 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 die Initialisierung abgeschlossen hat und auf benutzereingaben ohne Ausstehend 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 die Initialisierung abgeschlossen hat. Beispielsweise würde der Erstellungsprozess WaitForInputIdle- verwenden, 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 Beendigung an alle DLLs sendet, die an den Prozess angefügt sind. Andere Methoden zum Herunterfahren eines Prozesses benachrichtigen die angefügten DLLs nicht. Beachten Sie, dass andere Threads des Prozesses beendet werden, wenn ein Thread ExitProcessaufruft, ohne dass weitere Code ausgeführt werden kann (einschließlich des Threadendierungscodes von angefügten DLLs). Weitere Informationen finden Sie unter Beenden eines Prozess-.

Standardmäßig bewirkt das Übergeben TRUE- als Wert der bInheritHandles Parameter, dass alle vererbbaren Handles vom neuen Prozess geerbt werden. Dies kann für Anwendungen problematisch sein, die Prozesse aus mehreren Threads gleichzeitig erstellen und dennoch wünschen, dass jeder Prozess verschiedene Handles erbt. Anwendungen können die UpdateProcThreadAttributeList--Funktion mit dem PROC_THREAD_ATTRIBUTE_HANDLE_LIST-Parameter verwenden, um eine Liste der Handles bereitzustellen, die von einem bestimmten Prozess geerbt werden sollen.

Sicherheitsmerkungen

Der parameter lpApplicationName kann NULL sein, in diesem Fall muss der ausführbare Name die erste leerzeichentrennte Zeichenfolge in lpCommandLinesein. Wenn der Name der ausführbaren Datei oder des Pfads ein Leerzeichen enthält, besteht das Risiko, dass eine andere ausführbare Datei aufgrund der Art und Weise ausgeführt werden kann, wie die Funktion Leerzeichen analysiert. Das folgende Beispiel ist gefährlich, da die Funktion versucht, "Program.exe" auszuführen, falls vorhanden, anstelle von "MyApp.exe".
	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 verwenden, diese Anwendung anstelle der beabsichtigten Anwendung aus.

Um dieses Problem zu vermeiden, übergeben Sie nicht NULL 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 sowohl für Fan-In- als auch für Fanout-Remotesitzungen ordnungsgemäß. Aufgrund bestimmter Sicherheitsszenarien funktioniert jedoch ein cmdlet, das mit CreateProcessAsUser nur in PowerShell Version 3.0 für Fan-In-Remotesitzungen ordnungsgemäß funktioniert; Remotesitzungen werden aufgrund unzureichender Clientsicherheitsberechtigungen fehlschlagen. Verwenden Sie zum Implementieren eines Cmdlets, das sowohl für Fan-In- als auch für Fanout-Remotesitzungen in PowerShell, Version 3.0, funktioniert, die CreateProcess--Funktion.

Beispiele

Ein Beispiel finden Sie unter Starten eines interaktiven Clientprozesses.

Anmerkung

Der Processthreadsapi.h-Header definiert CreateProcessAsUser als Alias, der die ANSI- oder Unicode-Version dieser Funktion basierend auf der Definition der UNICODE-Präprozessorkonstante automatisch auswählt. Das Mischen der Verwendung des codierungsneutralen Alias mit Code, der nicht codierungsneutral ist, 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
mindestens unterstützte Client- Windows XP [nur Desktop-Apps]
mindestens unterstützte Server- Windows Server 2003 [Nur Desktop-Apps]
Zielplattform- Fenster
Header- processthreadsapi.h (include Windows.h)
Library Advapi32.lib
DLL- Advapi32.dll

Siehe auch

CloseHandle-

CreateEnvironmentBlock-

CreateProcess-

CreateProcessWithLogonW-

ExitProcess-

GetEnvironmentStrings

GetExitCodeProcess-

GetStartupInfo-

ImpersonateLoggedOnUser-

LoadUserProfile-

PROCESS_INFORMATION

Prozess- und Threadfunktionen

Prozesse

SECURITY_ATTRIBUTES

SHCreateProcessAsUserW-

STARTUPINFO-

STARTUPINFOEX-

SetErrorMode-

WaitForInputIdle-