|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
CreateProcessAsUser
The CreateProcessAsUser function creates a new process and its primary thread. The new process then executes a specified executable file. The CreateProcessAsUser function is similar to the CreateProcess function, except that the new process runs in the security context of the user represented by the hToken parameter. By default, the new process is non-interactive, that is, it runs on a desktop that is not visible and cannot receive user input. Also, by default, the new process inherits the environment of the calling process, rather than the environment associated with the specified user.
BOOL CreateProcessAsUser(
HANDLE hToken, // handle to a token that represents a logged-on user LPCTSTR lpApplicationName, // pointer to name of executable module LPTSTR lpCommandLine, // pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes BOOL bInheritHandles, // new process inherits handles DWORD dwCreationFlags, // creation flags LPVOID lpEnvironment, // pointer to new environment block LPCTSTR lpCurrentDirectory, // pointer to current directory name LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION );
Parameters
hToken
Handle to a primary token that represents a user. The user represented by the token must have read and execute access to the application specified by the lpApplicationName or the lpCommandLine parameter. If your process has the SE_TCB_NAME privilege, it can call the LogonUser function to get a primary token that represents a specified user. Alternatively, you can call the DuplicateTokenEx function to convert an impersonation token into a primary token. This allows a server application that is impersonating a client to create a process that has the security context of the client.
The other parameters of the CreateProcessAsUser function behave just like the analogous parameters of the CreateProcess function.
lpApplicationName
Points to a null-terminated string specifying the full path and filename of the module to execute. If a partial name is specified, the current drive and current directory are used by default. If this parameter is NULL, the module name must be the first white space-delimited token in the lpCommandLine string. The specified module can be a Win32-based application, or it can be some other type of module (for example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer.
lpCommandLine
Points to a null-terminated string specifying the command line for the application to be executed. If this parameter is NULL, the lpApplicationName string is used as the command line. If both lpApplicationName and lpCommandLine are non-NULL, lpApplicationName specifies the module to execute and lpCommandLine is used as the command line. The new process can use GetCommandLine to retrieve the entire command line; or C runtime processes can use the argc/argv mechanism.
If lpApplicationName is NULL, the first white space-delimited token of the command line specifies the module name. If the filename does not contain an extension, .EXE is assumed. If the filename ends in a period (.) with no extension, or the filename contains a path, .EXE is not appended. If the filename does not contain a directory path, Windows searches for the executable file in the following sequence:
1. The directory from which the application loaded. 2. The current directory. 3. The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. The name of this directory is SYSTEM32. 4. The 16-bit Windows system directory. There is no Win32 function that obtains the path of this directory, but it is searched. The name of this directory is SYSTEM. 5. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
6. The directories that are listed in the PATH environment variable.
If the process to be created is an MS-DOS - based or 16-bit Windows-based application, lpCommandLine should be a full command line in which the first element is the application name. Because this also works well for Win32-based applications, it is the most robust way to set lpCommandLine.
lpProcessAttributes
Pointer to a SECURITY_ATTRIBUTES structure that specifies a security descriptor for the new process and determines whether child processes can inherit the returned handle. If lpProcessAttributes is NULL, the process gets a default security descriptor and the handle cannot be inherited.
lpThreadAttributes
Pointer to a SECURITY_ATTRIBUTES structure that specifies a security descriptor for the new process and determines whether child processes can inherit the returned handle. If lpThreadAttributes is NULL, the thread gets a default security descriptor and the handle cannot be inherited.
bInheritHandles
Indicates whether the new process inherits handles from the calling process. If TRUE, each inheritable open handle in the calling process is inherited by the new process. Inherited handles have the same value and access privileges as the original handles.
dwCreationFlags
Specifies additional flags that control the priority class and the creation of the process. The following creation flags can be specified in any combination, except as noted:
Value Meaning CREATE_DEFAULT_ERROR_MODE The new process does not inherit the error mode of the calling process. Instead, CreateProcessAsUser gives the new process the current default error mode. An application sets the current default error mode by calling SetErrorMode.This flag is particularly useful for multi-threaded shell applications that run with hard errors disabled. The default behavior for CreateProcessAsUser is for the new process to inherit the error mode of the caller. Setting this flag changes that default behavior. CREATE_NEW_CONSOLE The new process has a new console, instead of inheriting the parent's console. This flag cannot be used with the DETACHED_PROCESS flag. CREATE_NEW_PROCESS_GROUP The new process is the root process of a new process group. The process group includes all processes that are descendants of this root process. The process identifier of the new process group is the same as the process identifier, which is returned in the lpProcessInformation parameter. Process groups are used by the GenerateConsoleCtrlEvent function to enable sending a CTRL+C or CTRL+BREAK signal to a group of console processes. CREATE_SEPARATE_WOW_VDM This flag is only valid only starting a 16-bit Windows program. If set, the new process is run in a private Virtual DOS Machine (VDM). By default, all 16-bit Windows programs are run in a single, shared VDM. The advantage of running separately is that a crash only kills the single VDM; any other programs running in distinct VDMs continue to function normally. Also, 16-bit Windows applications that are run in separate VDMs have separate input queues. That means that if one application hangs momentarily, applications in separate VDMs continue to receive input. CREATE_SUSPENDED The primary thread of the new process is created in a suspended state, and does not run until the ResumeThread function is called. CREATE_UNICODE_ENVIRONMENT If set, the environment block pointed to by lpEnvironment uses Unicode characters. If clear, the environment block uses ANSI characters. DEBUG_PROCESS If set, the calling process is treated as a debugger, and the new process is a process being debugged. The system notifies the debugger of all debug events that occur in the process being debugged. DEBUG_ONLY_THIS_PROCESS If not set and the calling process is being debugged, the new process becomes another process being debugged by the calling process's debugger. If the calling process is not a process being debugged, no debugging-related actions occur. DETACHED_PROCESS For console processes, the new process does not have access to the console of the parent process. The new process can call the AllocConsole function at a later time to create a new console. This flag cannot be used with the CREATE_NEW_CONSOLE flag.
The dwCreationFlags parameter also controls the new process's priority class, which is used in determining the scheduling priorities of the process's threads. If none of the following priority class flags is specified, the priority class defaults to NORMAL_PRIORITY_CLASS unless the priority class of the creating process is IDLE_PRIORITY_CLASS. In this case the default priority class of the child process is IDLE_PRIORITY_CLASS. One of the following flags can be specified:
Priority Meaning HIGH_PRIORITY_CLASS Indicates a process that performs time-critical tasks that must be executed immediately for it to run correctly. The threads of a high-priority class process preempt the threads of normal-priority or idle-priority class processes. An example is Windows Task List, which must respond quickly when called by the user, regardless of the load on the operating system. Use extreme care when using the high-priority class, because a high-priority class CPU-bound application can use nearly all available cycles. IDLE_PRIORITY_CLASS Indicates a process whose threads run only when the system is idle and are preempted by the threads of any process running in a higher priority class. An example is a screen saver. The idle priority class is inherited by child processes. NORMAL_PRIORITY_CLASS Indicates a normal process with no special scheduling needs. REALTIME_PRIORITY_CLASS Indicates a process that has the highest possible priority. The threads of a real-time priority class process preempt the threads of all other processes, including operating system processes performing important tasks. For example, a real-time process that executes for more than a very brief interval can cause disk caches not to flush or cause the mouse to be unresponsive.
lpEnvironment
Points to an environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process.
An environment block consists of a null-terminated block of null-terminated strings. Each string is in the form:
name=value
Because the equal sign is used as a separator, it must not be used in the name of an environment variable. If an application provides an environment block, rather than passing NULL for this parameter, the current directory information of the system drives is not automatically propagated to the new process. For a discussion of this situation and how to handle it, see the following Remarks section. An environment block can contain Unicode or ANSI characters. If the environment block pointed to by lpEnvironment contains Unicode characters, the dwCreationFlags field's CREATE_UNICODE_ENVIRONMENT flag will be set. If the block contains ANSI characters, that flag will be clear.
Note that an ANSI environment block is terminated by two zero bytes: one for the last string, one more to terminate the block. A Unicode environment block is terminated by four zero bytes: two for the last string, two more to terminate the block.
lpCurrentDirectory
Points to a null-terminated string that specifies the current drive and directory for the new process. The string must be a full path and filename that includes a drive letter. If this parameter is NULL, the new process is created with the same current drive and directory as the calling process. This option is provided primarily for shells that need to start an application and specify its initial drive and working directory.
lpStartupInfo
Points to a STARTUPINFO structure that specifies how the main window for the new process should appear.
lpProcessInformation
Points to a PROCESS_INFORMATION structure that receives identification information about the new process.
Return Values
If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
The CreateProcessAsUser function requires the SE_ASSIGNPRIMARYTOKEN_NAME and SE_INCREASE_QUOTA_NAME privileges. If they are not already enabled, CreateProcessAsUser enables them for the duration of the call. By default, CreateProcessAsUser creates the new process on a noninteractive window station with a desktop that is not visible and cannot receive user input. To enable user interaction with the new process, you must specify the name of the default interactive window station and desktop, "winsta0\default", in the lpDesktop member of the STARTUPINFO structure. In addition, before calling CreateProcessAsUser, you must change the discretionary access control list (DACL) of both the default interactive window station and the default desktop. The DACLs for the window station and desktop must grant access to the user represented by the hToken parameter.
CreateProcessAsUser does not load the specified user's profile into the HKEY_USERS registry key. This means that access to information in the HKEY_CURRENT_USER registry key may not produce results consistent with a normal interactive logon. It is your responsibility to load the user's registry hive into HKEY_USERS before calling CreateProcessAsUser. If the lpEnvironment parameter is NULL, the new process inherits the environment of the calling process. CreateProcessAsUser does not automatically modify the environment block to include environment variables specific to the user represented by hToken. For example, the USERNAME and USERDOMAIN variables are inherited from the calling process if lpEnvironment is NULL. It is your responsibility to prepare the environment block for the new process and specify it in lpEnvironment.
CreateProcessAsUser allows you to access the specified directory and executable image in the security context of the caller or the target user. By default, CreateProcessAsUser accesses the directory and executable image in the security context of the caller. In this case, if the caller does not have access to the directory and executable image, the function fails. To access the directory and executable image using the security context of the target user, specify hToken in a call to the ImpersonateLoggedOnUser function before calling CreateProcessAsUser.
The new process and the new thread handles are created with full access rights (PROCESS_ALL_ACCESS and THREAD_ALL_ACCESS). For either handle, if a security descriptor is not provided, the handle can be used in any function that requires an object handle of that type. When a security descriptor is provided, an access check is performed on all subsequent uses of the handle before access is granted. If the access check denies access, the requesting process is not able to use the handle to gain access to the process or thread.
If the lpProcessAttributes parameter is NULL, the default security descriptor for the user referenced in the hToken parameter will be used. This security descriptor may not allow access for the caller, in which case the process may not be opened again once it is run. The handle returned in the PROCESS_INFORMATION structure is valid and will continue to have all access. This is also true for thread attributes. Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed.
The process is assigned a process identifier. The identifier is valid until the process terminates. It can be used to identify the process, or specified in the OpenProcess function to open a handle to the process. The initial thread in the process is also assigned a thread identifier. The identifier is valid until the thread terminates and can be used to uniquely identify the thread within the system. These identifiers are returned in the PROCESS_INFORMATION structure.
When specifying an application name in the lpApplicationName or lpCommandLine strings, it doesn't matter whether the application name includes the filename extension, with one exception: an MS-DOS - based or Windows-based application whose filename extension is .COM must include the .COM extension. The calling thread can use the WaitForInputIdle function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcessAsUser returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process.
The preferred way to shut down a process is by using the ExitProcess function, because this function notifies all dynamic-link libraries (DLLs) attached to the process of the approaching termination. Other means of shutting down a process do not notify the attached DLLs. Note that when a thread calls ExitProcess, other threads of the process are terminated without an opportunity to execute any additional code (including the thread termination code of attached DLLs).
ExitProcess, ExitThread, CreateThread, CreateRemoteThread, and a process that is starting (as the result of a call by CreateProcessAsUser) are serialized between each other within a process. Only one of these events can happen at a time. This means the following restrictions hold:
· During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process. · Only one thread in a process can be in a DLL initialization or detach routine at a time. · The ExitProcess function does not return until no threads are executing DLL initialization or detach routines.
See Also
AllocConsole, CloseHandle, CreateProcess, CreateRemoteThread, CreateThread, DuplicateTokenEx, ExitProcess, ExitThread, GenerateConsoleCtrlEvent, GetCommandLine, GetEnvironmentStrings, GetExitCodeProcess, GetFullPathName, GetStartupInfo, GetSystemDirectory, GetWindowsDirectory, ImpersonateLoggedOnUser, LoadModule, LogonUser, OpenProcess, PROCESS_INFORMATION, ResumeThread, SECURITY_ATTRIBUTES, SetConsoleCtrlHandler, SetErrorMode, STARTUPINFO, TerminateProcess, WaitForInputIdle, WinExec
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
CreateProcessAsUser
Функция CreateProcessAsUser создает новый процесс и первичную резьбу. Новый процесс затем выполняет определенный выполняемый файл. Функция CreateProcessAsUser подобная функции CreateProcess, кроме того новый процесс работает в контексте безопасности потребителя представленного параметром hToken. По умолчанию, новый процесс не-диалоговый, то есть, это работает на настольной системе, которая не видимая и не может получить ввод пользователя. Также, по умолчанию, новый процесс наследует среду вызова процесса, а не среда связывалась определенным потребителем.
BOOL CreateProcessAsUser(
РУЧКА hToken, // оперируется в признак, который представляется зарегистрированный-на потребителе LPCTSTR lpApplicationName, // указателе в имя выполняемого модуля LPTSTR lpCommandLine, // указателя, чтобы приказывать строку линии LPSECURITY_ATTRIBUTES lpProcessAttributes, // указателя, чтобы обрабатывать атрибуты безопасности LPSECURITY_ATTRIBUTES lpThreadAttributes, // указателя, чтобы заправлять атрибуты безопасности BOOL bInheritHandles, // новый процесс наследует ручки DWORD dwCreationFlags, // создание сигнализирует lpEnvironment LPVOID, // указатель новому блоку среды LPCTSTR lpCurrentDirectory, // указателя в текущее имя директория LPSTARTUPINFO lpStartupInfo, // указателя на указатель STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation // на PROCESS_INFORMATION );
Параметры
hToken
Прооперируйте первичный признак, который представляет потребителя. Потребитель представленный признаком по-видимому прочитал и выполнял доступ к приложению определенный lpApplicationName или параметром lpCommandLine. Если ваш процесс имеет привилегию SE_TCB_NAME, он может назвать функцию LogonUser, чтобы получать первичный признак, который представляет определенного потребителя. Кроме того, Вы можете назвать функцию DuplicateTokenEx, чтобы преобразовывать признак маскировки в первичный признак. Это допускает приложение сервера, которое подражает клиенту, чтобы создавать процесс, который имеет контекст безопасности клиента.
Другие параметры функции CreateProcessAsUser проведутся себя просто подобно аналогичным параметрам функции CreateProcess.
lpApplicationName
Точки на недействительный расторгнутую строку, определяющие полный путь и filename модуля, чтобы выполняться. Если частичное имя определено, текущий накопитель и текущий директорий используется по умолчанию. Если этот параметр НЕДЕЙСТВИТЕЛЕН, модульное имя должно быть первым интервал ограниченным признаком в строке lpCommandLine. Определенный модуль может быть базирующимся приложением Win32, или это может быть некоторым другим типом модуля (например, МС-DOS или OS/2) если подходящая подсистема доступна в локальном компьютере.
lpCommandLine
Точки на недействительный расторгнутую строку, определяющие командную строку для приложения, которое нужно выполняться. Если этот параметр НЕДЕЙСТВИТЕЛЕН, строка lpApplicationName использована как командная строка. Если как lpApplicationName так и lpCommandLine не-НЕДЕЙСТВИТЕЛЬНЫ, lpApplicationName определяет модуль, чтобы выполнять и lpCommandLine использован как командная строка. Новый процесс может использовать GetCommandLine, чтобы извлекать целую командную строку; или время прогона процессов C может использовать argc/argv механизм.
Если lpApplicationName НЕДЕЙСТВИТЕЛЕН, первый интервал ограниченный признак командной строки определяет модульное имя. Если filename не содержит расширение, .EXE принят. Если filename заканчивается в течение периода (.) без расширения, или filename содержит путь, .EXE не добавлен. Если filename не содержит путь директория, поисков Windows выполняемого файла в следующей последовательности:
1. Директорий из которого приложение загружалось. 2. Текущий директорий. 3. Системный директорий 32- бита Windows. Используйте функцию GetSystemDirectory, чтобы получать путь этого директория. Имя этого директория - SYSTEM32. 4. Системный директорий 16- бита Windows. Нет функции Win32, что получает путь этого директория, но поискано. Имя этого директория СИСТЕМНОЕ. 5. Директорий Windows. Используйте функцию GetWindowsDirectory, чтобы получать путь этого директория.
6. Директории, которые указаны в переменной среды ПУТИ.
Если процесс, который нужно создавать, - МС-DOS - основанное или 16- бит основывал приложение Windows, lpCommandLine должен быть полной командной строкой в которой первый элемент является прикладным именем. Поскольку это также работает хорошо для базирующихся приложений Win32, это - наиболее прочный путь устанавливать lpCommandLine.
lpProcessAttributes
Указатель в структуру SECURITY_ATTRIBUTES, которая определяет дескриптор безопасности для нового процесса и определяет независимо ребенка, процессы могут унаследовать возвращанную ручку. Если lpProcessAttributes НЕДЕЙСТВИТЕЛЕН, процесс получает по умолчанию дескриптор безопасности и ручка не может быть унаследована.
lpThreadAttributes
Указатель в структуру SECURITY_ATTRIBUTES, которая определяет дескриптор безопасности для нового процесса и определяет независимо ребенка, процессы могут унаследовать возвращанную ручку. Если lpThreadAttributes НЕДЕЙСТВИТЕЛЕН, резьба получает по умолчанию дескриптор безопасности и ручка не может быть унаследована.
bInheritHandles
Указывает наследует новый процесс ручки с вызова процесса. Если ИСТИНА, каждый inheritable открытая ручка в вызывающем процессе унаследованы новым процессом. Унаследованные ручки имеют ту же величину и привилегии доступа как оригинальные ручки.
dwCreationFlags
Определяет дополнительные флаги, которые управляют приоритетным классом и создание процесса. Следующие флаги создания могут быть определены в любой комбинации, кроме отмеченной:
Оцените Значение CREATE_DEFAULT_ERROR_MODE Новый процесс не наследует режим ошибки вызова процесса. Взамен, CreateProcessAsUser дает новому процессу текущий по умолчанию режим ошибки. Приложение устанавливает текущий по умолчанию режим ошибки вызывая SetErrorMode.Этот флаг особенно полезный для много-заправившее приложения оболочки, что прогон с жесткими ошибками выведенными из строя. По умолчанию поведение для CreateProcessAsUser - для нового процесса наследовать режим ошибки вызывающего оператора. Установка этого флага изменяет, который нарушает обязательства поведение. CREATE_NEW_CONSOLE Новый процесс имеет новую консоль, вместо наследующей родительской консоли. Этот флаг не может быть использован флагом DETACHED_PROCESS. CREATE_NEW_PROCESS_GROUP Новый процесс является корневым процессом новой группы процесса. Группа процесса включает все процессы, которые - потомки этого корневого процесса. Идентификатор процесса новой группы процесса такой же как и идентификатор процесса, который возвращан в параметр lpProcessInformation. Группы Процесса использованы функцией GenerateConsoleCtrlEvent, чтобы приспосабливаться посылая CTRL+C или сигнал CTRL+BREAK в группу консольных процессов. CREATE_SEPARATE_WOW_VDM Этот флаг только правильный только начиная с 16- битовой программы Windows. Если установлено, новый процесс является прогоном в частной Машине Virtual DOS (VDM). По умолчанию, все 16- битовые программы Windows являются прогоном в единственном, коллективном VDM. Преимущество прогона отдельно - то, что авария только убивает единственный VDM; любые другие программы, работающие в четких VDMs остаются функционировать нормально. Также, 16- битовые приложения Windows, которые - прогон в отдельных VDMs имеет отдельные входные очереди. Это означает, что если одно приложение висит на мгновение, приложения в отдельных VDMs остаются получать ввод. CREATE_SUSPENDED Первичная резьба нового процесса создана в приостановленном состоянии и не сделана работать пока функция ResumeThread не будет названа. CREATE_UNICODE_ENVIRONMENT Если установлено, блок среды указанный, чтобы lpEnvironment использует символы Уникода. Если очистка, блок среды использует символы ANSI. DEBUG_PROCESS Если установлено, вызывающий процесс рассмотрен как отладчик, и новый процесс является процессом, отлаживанным. Система уведомляет отладчик о всех отладочных событиях, которые происходят в процессе, отлаживанном. DEBUG_ONLY_THIS_PROCESS Если не установлено и вызывающий процесс отлаживается, новый процесс становится другим процессом, отлаживанным отладчиком процесса вызова. Если вызывающий процесс не является процессом, отлаживанным, никакая отладка-связавшее действия происходить. DETACHED_PROCESS Для консольных процессов, новый процесс нет имеет доступ к консоли родительского процесса. Новый процесс может назвать функцию AllocConsole от, чтобы создавать новую консоль. Этот флаг не может быть использован флагом CREATE_NEW_CONSOLE.
Параметр dwCreationFlags также регулирует приоритетный класс нового процесса, который использован в определении планирования приоритетов резьбы процесса. Если ни один из следующих приоритетных флагов класса не определены, приоритетный класс устанавливается по умолчанию на NORMAL_PRIORITY_CLASS если приоритетный класс создающего процесса не - IDLE_PRIORITY_CLASS. В этом случае, по умолчанию приоритетный класс процесса ребенка - IDLE_PRIORITY_CLASS. Одно из следующего сигнализирует может быть определено:
Приоритетное Значение HIGH_PRIORITY_CLASS Указывает процесс, который выполняет время-критические задачи, которые должны выполняться немедленно для этого, чтобы работать правильно. Резьба высокоприоритетного процесса класса захватывает резьбу нормального-приоритета или холостых-приоритетных процессов класса. Пример является Списком Задачи Windows, который должен ответить быстро когда названо пользователем, независимо от загрузки в операционной системе. Крайняя забота Использования при использовании высокоприоритетного класса, поскольку высокоприоритетный класс связавший приложение CPU может использовать почти все доступные циклы. IDLE_PRIORITY_CLASS Указывает процесс, чья резьба работает только когда система является ожиданием и захвачена резьбой любого процесса, работающего в более высоком приоритетном классе. Пример является экранным спасателем. Холостой приоритетный класс унаследован процессами ребенка. NORMAL_PRIORITY_CLASS Указывает нормальный процесс без специального планирования, которому нужно. REALTIME_PRIORITY_CLASS Указывает процесс, который имеет самый верхний возможный приоритет. Резьба приоритетного в реальном времени процесса класса захватывает резьбу всех других процессов, включая процессы операционной системы, выполняющие важные задачи. Например, процесс в реальном времени, который выполняется для более, чем a же краткого интервала может заставить кеши не, чтобы сбрасывать или заставлять мышь, чтобы быть неотзывчивым.
lpEnvironment
Точки на блока среды для нового процесса. Если этот параметр НЕДЕЙСТВИТЕЛЕН, новый процесс использует среду вызова процесса.
Блок среды состоит из недействительный расторгнутого блока недействительный расторгнутых строк. Каждая строка - в форме:
name=value
Поскольку знак равенства использован как разделитель, он не должен использован от имени переменной среды. Если приложение обеспечивает блока среды, а не передавая НЕДЕЙСТВИТЕЛЬНЫМ для этого параметра, текущая информация директория системных накопителей автоматически не распространиться в новый процесс. Для дискуссии этой ситуации и как, чтобы оперировать этому, смотри секцию Замечаний следующего. Блок среды может содержать Уникод или символы ANSI. Если блок среды указанный, чтобы lpEnvironment содержит символы Уникода, область dwCreationFlags флага CREATE_UNICODE_ENVIRONMENT будет установлена. Если блок содержит символы ANSI, которые сигнализируют быть ясно.
Отметьте, что блок среды ANSI расторгнутый двумя нулевыми байтами: за последней строки, еще одно, чтобы завершать блока. Блок среды Уникода расторгнутый четырьмя нулевыми байтами: два для последней строки, два более, чтобы завершать блока.
lpCurrentDirectory
Точки на недействительный расторгнутую строку, которые определяют текущего накопителя и директория для нового процесса. Строка должна быть полным путем и filename, что включает письмо накопителя. Если этот параметр НЕДЕЙСТВИТЕЛЕН, новый процесс создан тем же текущим накопителем и директорием как вызов процесса. Эта опция предусматривается первоначально для оболочек, что нужно запускать приложение и определять свой начальный директорий накопителя и работы.
lpStartupInfo
Точки на структуру STARTUPINFO, которые определяют как основное окно для нового процесса должно появляться.
lpProcessInformation
Точки на структуру PROCESS_INFORMATION, которые получают информацию идентификации о новом процессе.
Обратные Величины
Если функция добивается успеха, обратная величина ненулевая. Если функция терпит неудачу, обратная величина нулевая. Для того, чтобы расширять информацию ошибки, назовите GetLastError.
Замечания
Функция CreateProcessAsUser требует SE_ASSIGNPRIMARYTOKEN_NAME и привилегии SE_INCREASE_QUOTA_NAME. Если они уже не приспособлены, CreateProcessAsUser приспосабливается их в течение вызова. По умолчанию, CreateProcessAsUser создает новый процесс на станции окна noninteractive с настольной системой, который не видимый и не может получить ввод пользователя. Для того, чтобы приспосабливаться взаимодействие пользователя с новым процессом, Вы должны определить имя по умолчанию диалоговой станции окна и настольной системы, "winsta0\default", в элементе lpDesktop структуры STARTUPINFO. Кроме того, перед вызовом CreateProcessAsUser, Вы должны изменить управляющий список дискреционного доступа (DACL) как по умолчанию диалоговой станции окна так и по умолчанию настольная система. DACLs Для станции окна и настольная система должна предоставлять доступ к пользователю представленный параметром hToken.
CreateProcessAsUser НЕ загружает определенный профиль пользователя на клавишу регистрации HKEY_USERS. Это означает, что доступ к информации на клавише регистрации HKEY_CURRENT_USER не может производить результаты соответствующие нормальному диалоговому вводу. Это - ваша ответственность, чтобы загружать улй регистрации пользователя в HKEY_USERS перед вызовом CreateProcessAsUser. Если параметр lpEnvironment НЕДЕЙСТВИТЕЛЕН, новый процесс наследует среду вызова процесса. CreateProcessAsUser АВТОМАТИЧЕСКИ не модифицирует блока среды, чтобы включать переменные среды специфические пользователю представленному hToken. Например, ИМЯ пользователя и переменные USERDOMAIN унаследованы с вызова процесса если lpEnvironment НЕДЕЙСТВИТЕЛЕН. Это - ваша ответственность, чтобы подготавливать блока среды к новому процессу и определять это в lpEnvironment.
CreateProcessAsUser ПОЗВОЛЯЕТ Вам, чтобы иметь доступ к определенному директорию и выполняемому образу в контексте безопасности вызывающего оператора или целевой пользователь. По умолчанию, CreateProcessAsUser имеет доступ к директорию и выполняемому образу в контексте безопасности вызывающего оператора. В этом случае, если вызывающий оператор нет имеет доступ к директорию и выполняемому образу, функция терпит неудачу. Для того, чтобы иметь доступ к директорию и выполняемому образу, использовавшим контекст безопасности целевого пользователя, определите hToken на вызове в функцию ImpersonateLoggedOnUser перед вызовом CreateProcessAsUser.
Новый процесс и новые ручки резьбы созданы полными правами доступа (PROCESS_ALL_ACCESS и THREAD_ALL_ACCESS). Для также ручка, если дескриптор безопасности не предусмотрен, ручка может быть использована в любой функции, которая требует объектную ручку этого типа. Когда дескриптор безопасности предусмотрен, чек доступа выполнен во всем последующем использовании ручки прежде, чем доступу предоставят. Если чек доступа запрещит доступ, запрашивающий процесс не способный использовать ручку, чтобы приобретать доступ к процессу или резьбе.
Если параметр lpProcessAttributes НЕДЕЙСТВИТЕЛЕН, по умолчанию дескриптор безопасности для пользователя указанного в параметре hToken будет использован. Этот дескриптор безопасности не может допускать доступ для вызывающего оператора, в этом случае процесс не может открываться снова как только будет запущено. Ручка возвращанная в структуру PROCESS_INFORMATION - в силе и останется иметь весь доступ. Это - также истина для атрибутов резьбы. Ручки в PROCESS_INFORMATION должны быть закрыты CloseHandle когда они не - больше не нужно.
Процесс назначен идентификатор процесса. Идентификатор - в силе пока процесс не завершится. Может быть использовано, чтобы идентифицировать процесс, или определенный в функции OpenProcess, чтобы открывать ручку в процесс. Начальная резьба в процессе также назначена идентификатор резьбы. Идентификатор - в силе пока резьба не завершит и может быть использована, чтобы однозначно идентифицировать резьбу в пределах системы. Эти идентификаторы возвращаны в структуру PROCESS_INFORMATION.
При определении прикладного имени в lpApplicationName или строках lpCommandLine, это не имеет значения включает прикладное имя расширение filename, с одним исключением: МС-DOS - основанное или базирующееся приложение Windows, чье filename расширение - .COM должен включить расширение .COM. Вызов резьбы может использовать функцию WaitForInputIdle, чтобы ожидаться пока новый процесс не завершил свою инициализацию и ждал ввод пользователя без входного рассматривать. Это может быть полезным для синхронизации между родительскими и процессами ребенка, поскольку возврат CreateProcessAsUser не ждя новый процесс, чтобы завершать свою инициализацию. Например, создание процесса должно использовать WaitForInputIdle прежде чем попытаться находить окно связанное новым процессом.
Предпочтительный путь отключать процесс - используя функцию ExitProcess, поскольку эта функция уведомляет всю динамическую связь библиотек (DLLs) приложенную к процессу достигающего завершения. Другие средства отключающего процесса не уведомляют прилагаемый DLLs. Отметьтесь, что когда резьба называет ExitProcess, другая резьба процесса расторгнутая без возможности выполнять любой дополнительный код (включая код завершения резьбы прилагаемых DLLs).
ExitProcess, ExitThread, CreateThread, CreateRemoteThread, И процесс, который запускает (как результат вызова CreateProcessAsUser), издан сериями между друг друга в пределах процесса. Только одно из этих событий могут случиться за один раз. Это означает следующее хранилище ограничений:
В течение запуска процесса и программ инициализации DLL, новая резьба может быть создана, но они не начинают выполнение пока инициализация DLL не сделана для процесса. Только один резьба в процессе может быть в инициализации DLL или отделять программу за один раз. Функция ExitProcess не возвращается пока никакая резьба не будет выполнить инициализацию DLL или отделит программы.
Смотри Также
AllocConsole, CloseHandle, CreateProcess, CreateRemoteThread, CreateThread, DuplicateTokenEx, ExitProcess, ExitThread, GenerateConsoleCtrlEvent, GetCommandLine, GetEnvironmentStrings, GetExitCodeProcess, GetFullPathName, GetStartupInfo, GetSystemDirectory, GetWindowsDirectory, ImpersonateLoggedOnUser, LoadModule, LogonUser, OpenProcess, PROCESS_INFORMATION, ResumeThread, SECURITY_ATTRIBUTES, SetConsoleCtrlHandler, SetErrorMode, STARTUPINFO, TerminateProcess, WaitForInputIdle, WinExec
|
|
|
|
| |