CreateProcessAsUserA 함수(processthreadsapi.h)

새 프로세스와 해당 기본 스레드를 만듭니다. 새 프로세스는 지정된 토큰으로 표시되는 사용자의 보안 컨텍스트에서 실행됩니다.

일반적으로 CreateProcessAsUser 함수를 호출하는 프로세스에는 SE_INCREASE_QUOTA_NAME 권한이 있어야 하며 토큰을 할당할 수 없는 경우 SE_ASSIGNPRIMARYTOKEN_NAME 권한이 필요할 수 있습니다. 이 함수가 ERROR_PRIVILEGE_NOT_HELD (1314)으로 실패하는 경우 대신 CreateProcessWithLogonW 함수를 사용합니다. CreateProcessWithLogonW 에는 특별한 권한이 필요하지 않지만 지정된 사용자 계정이 대화형으로 로그온할 수 있어야 합니다. 일반적으로 CreateProcessWithLogonW를 사용하여 대체 자격 증명으로 프로세스를 만드는 것이 가장 좋습니다.

구문

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
);

매개 변수

[in, optional] hToken

사용자를 나타내는 기본 토큰에 대한 핸들입니다. 핸들에는 TOKEN_QUERY, TOKEN_DUPLICATETOKEN_ASSIGN_PRIMARY 액세스 권한이 있어야 합니다. 자세한 내용은 Access-Token 개체에 대한 액세스 권한을 참조하세요. 토큰으로 표시되는 사용자는 lpApplicationName 또는 lpCommandLine 매개 변수로 지정된 애플리케이션에 대한 읽기 및 실행 액세스 권한이 있어야 합니다.

지정된 사용자를 나타내는 기본 토큰을 얻으려면 LogonUser 함수를 호출합니다. 또는 DuplicateTokenEx 함수를 호출하여 가장 토큰을 기본 토큰으로 변환할 수 있습니다. 이렇게 하면 클라이언트를 가장하는 서버 애플리케이션이 클라이언트의 보안 컨텍스트가 있는 프로세스를 만들 수 있습니다.

hToken이 호출자의 기본 토큰의 제한된 버전인 경우 SE_ASSIGNPRIMARYTOKEN_NAME 권한이 필요하지 않습니다. 필요한 권한을 아직 사용하도록 설정하지 않은 경우 CreateProcessAsUser 는 호출 기간 동안 사용하도록 설정합니다. 자세한 내용은 특별 권한으로 실행을 참조하세요.

터미널 서비스: 프로세스는 토큰에 지정된 세션에서 실행됩니다. 기본적으로 이 세션은 LogonUser라는 동일한 세션입니다. 세션을 변경하려면 SetTokenInformation 함수를 사용합니다.

[in, optional] lpApplicationName

실행할 모듈의 이름입니다. 이 모듈은 Windows 기반 애플리케이션일 수 있습니다. 로컬 컴퓨터에서 적절한 하위 시스템을 사용할 수 있는 경우 다른 유형의 모듈(예: MS-DOS 또는 OS/2)일 수 있습니다.

문자열은 실행할 모듈의 전체 경로 및 파일 이름을 지정하거나 부분 이름을 지정할 수 있습니다. 부분 이름의 경우 함수는 현재 드라이브와 현재 디렉터리를 사용하여 사양을 완료합니다. 함수는 검색 경로를 사용하지 않습니다. 이 매개 변수는 파일 이름 확장명을 포함해야 합니다. 기본 확장은 가정되지 않습니다.

lpApplicationName 매개 변수는 NULL일 수 있습니다. 이 경우 모듈 이름은 lpCommandLine 문자열의 첫 번째 공백으로 구분된 토큰이어야 합니다. 공백이 포함된 긴 파일 이름을 사용하는 경우 따옴표 붙은 문자열을 사용하여 파일 이름이 끝나고 인수가 시작되는 위치를 나타냅니다. 그렇지 않으면 파일 이름이 모호합니다. 예를 들어 문자열 "c:\program files\sub dir\program name"을 고려합니다. 이 문자열은 여러 가지 방법으로 해석할 수 있습니다. 시스템은 다음 순서로 가능성을 해석하려고 합니다.

c :\program files\sub.exec:\program files\sub dir\program.exec:\program files\sub dir\program name.exec:\program.exe 실행 모듈이 16비트 애플리케이션인 경우 lpApplicationNameNULL이어야 하며 lpCommandLine 이 가리키는 문자열은 실행 모듈과 인수를 지정해야 합니다. 기본적으로 CreateProcessAsUser에서 만든 모든 16비트 Windows 기반 애플리케이션은 별도의 VDM에서 실행됩니다(CreateProcessCREATE_SEPARATE_WOW_VDM 해당).

[in, out, optional] lpCommandLine

실행할 명령줄입니다. 이 문자열의 최대 길이는 32K입니다. lpApplicationNameNULL인 경우 lpCommandLine의 모듈 이름 부분은 MAX_PATH 문자로 제한됩니다.

이 함수의 유니코드 버전인 CreateProcessAsUserW는 이 문자열의 내용을 수정할 수 있습니다. 따라서 이 매개 변수는 읽기 전용 메모리(예: const 변수 또는 리터럴 문자열)에 대한 포인터가 될 수 없습니다. 이 매개 변수가 상수 문자열인 경우 함수는 액세스 위반을 일으킬 수 있습니다.

lpCommandLine 매개 변수는 NULL일 수 있습니다. 이 경우 함수는 lpApplicationName 이 가리키는 문자열을 명령줄로 사용합니다.

lpApplicationNamelpCommandLine모두 NULL이 아닌 경우 *lpApplicationName은 실행할 모듈을 지정하고 *lpCommandLine은 명령줄을 지정합니다. 새 프로세스는 GetCommandLine 을 사용하여 전체 명령줄을 검색할 수 있습니다. C로 작성된 콘솔 프로세스는 argc 및 argv 인수 사용하여 명령줄을 구문 분석할 수 있습니다. argv[0]은 모듈 이름이기 때문에 C 프로그래머는 일반적으로 명령줄에서 모듈 이름을 첫 번째 토큰으로 반복합니다.

lpApplicationNameNULL인 경우 명령줄의 첫 번째 공백으로 구분된 토큰은 모듈 이름을 지정합니다. 공백이 포함된 긴 파일 이름을 사용하는 경우 따옴표 붙은 문자열을 사용하여 파일 이름이 끝나고 인수가 시작되는 위치를 나타냅니다( lpApplicationName 매개 변수에 대한 설명 참조). 파일 이름에 확장명을 포함하지 않으면 .exe 추가됩니다. 따라서 파일 이름 확장명을 .com 경우 이 매개 변수에는 .com 확장명을 포함해야 합니다. 파일 이름이 확장명 없이 마침표(.)로 끝나거나 파일 이름에 경로가 포함된 경우 .exe 추가되지 않습니다. 파일 이름에 디렉터리 경로가 없는 경우 시스템은 다음 순서로 실행 파일을 검색합니다.

  1. 애플리케이션이 로드된 디렉터리입니다.
  2. 부모 프로세스의 현재 디렉터리입니다.
  3. 32비트 Windows 시스템 디렉터리입니다. GetSystemDirectory 함수를 사용하여 이 디렉터리의 경로를 가져옵니다.
  4. 16비트 Windows 시스템 디렉터리입니다. 이 디렉터리의 경로를 가져오는 함수는 없지만 검색됩니다.
  5. Windows 디렉터리입니다. GetWindowsDirectory 함수를 사용하여 이 디렉터리의 경로를 가져옵니다.
  6. PATH 환경 변수에 나열된 디렉터리입니다. 이 함수는 App Paths 레지스트리 키로 지정된 애플리케이션별 경로를 검색하지 않습니다. 이 애플리케이션별 경로를 검색 순서에 포함하려면 ShellExecute 함수를 사용합니다.
시스템은 명령줄 문자열에 null 문자를 추가하여 파일 이름을 인수와 분리합니다. 이렇게 하면 내부 처리를 위해 원래 문자열을 두 개의 문자열로 나눕니다.

[in, optional] lpProcessAttributes

새 프로세스 개체에 대한 보안 설명자를 지정하고 자식 프로세스가 반환된 핸들을 프로세스에 상속할 수 있는지 여부를 결정하는 SECURITY_ATTRIBUTES 구조체에 대한 포인터입니다. lpProcessAttributesNULL이거나 lpSecurityDescriptorNULL인 경우 프로세스는 기본 보안 설명자를 가져오고 핸들을 상속할 수 없습니다. 기본 보안 설명자는 hToken 매개 변수에서 참조된 사용자의 설명자입니다. 이 보안 설명자는 호출자에 대한 액세스를 허용하지 않을 수 있으며, 이 경우 프로세스가 실행된 후 다시 열리지 않을 수 있습니다. 프로세스 핸들은 유효하며 계속해서 모든 액세스 권한을 갖습니다.

[in, optional] lpThreadAttributes

새 스레드 개체에 대한 보안 설명자를 지정하고 자식 프로세스가 반환된 핸들을 스레드에 상속할 수 있는지 여부를 결정하는 SECURITY_ATTRIBUTES 구조체에 대한 포인터입니다. lpThreadAttributesNULL이거나 lpSecurityDescriptorNULL인 경우 스레드는 기본 보안 설명자를 가져오고 핸들을 상속할 수 없습니다. 기본 보안 설명자는 hToken 매개 변수에서 참조된 사용자의 설명자입니다. 이 보안 설명자는 호출자에 대한 액세스를 허용하지 않을 수 있습니다.

[in] bInheritHandles

이 매개 변수가 TRUE이면 호출 프로세스의 상속 가능한 각 핸들은 새 프로세스에서 상속됩니다. 매개 변수가 FALSE이면 핸들이 상속되지 않습니다. 상속된 핸들은 원래 핸들과 동일한 값 및 액세스 권한을 갖습니다. 상속 가능한 핸들에 대한 추가 설명은 비고를 참조하세요.

터미널 서비스: 세션 간에 핸들을 상속할 수 없습니다. 또한 이 매개 변수가 TRUE이면 호출자와 동일한 세션에서 프로세스를 만들어야 합니다.

PPL(Protected Process Light) 프로세스: PPL이 아닌 프로세스에서 PPL 프로세스로 PROCESS_DUP_HANDLE 허용되지 않으므로 PPL 프로세스가 PPL이 아닌 프로세스를 만들 때 제네릭 핸들 상속이 차단됩니다. 프로세스 보안 및 액세스 권한 참조

[in] dwCreationFlags

우선 순위 클래스 및 프로세스 만들기를 제어하는 플래그입니다. 값 목록은 프로세스 만들기 플래그를 참조하세요.

또한 이 매개 변수는 프로세스 스레드의 일정 우선 순위를 결정하는 데 사용되는 새 프로세스의 우선 순위 클래스를 제어합니다. 값 목록은 GetPriorityClass를 참조하세요. 우선 순위 클래스 플래그를 지정하지 않으면 만들기 프로세스의 우선 순위 클래스가 IDLE_PRIORITY_CLASS 또는 BELOW_NORMAL_PRIORITY_CLASS 않는 한 우선 순위 클래스는 기본적으로 NORMAL_PRIORITY_CLASS. 이 경우 자식 프로세스는 호출 프로세스의 기본 우선 순위 클래스를 받습니다.

dwCreationFlags 매개 변수의 값이 0인 경우:

  • 이 프로세스는 호출자와 부모 콘솔의 오류 모드를 모두 상속합니다.
  • 새 프로세스에 대한 환경 블록은 ANSI 문자를 포함하는 것으로 간주됩니다(추가 정보는 lpEnvironment 매개 변수 참조).
  • 16비트 Windows 기반 애플리케이션은 공유 VDM(Virtual DOS 머신)에서 실행됩니다.

[in, optional] lpEnvironment

새 프로세스의 환경 블록에 대한 포인터입니다. 이 매개 변수가 NULL인 경우 새 프로세스는 호출 프로세스의 환경을 사용합니다.

환경 블록은 null로 종료된 null로 끝나는 문자열 블록으로 구성됩니다. 각 문자열은 다음과 같은 형식입니다.

이름=value\0

등호는 구분 기호로 사용되므로 환경 변수의 이름에 사용하면 안 됩니다.

환경 블록에는 유니코드 또는 ANSI 문자가 포함될 수 있습니다. lpEnvironment에서 가리키는 환경 블록에 유니코드 문자가 포함된 경우 dwCreationFlagsCREATE_UNICODE_ENVIRONMENT 포함되어 있어야 합니다.

이 함수의 ANSI 버전인 CreateProcessAsUserA 는 프로세스에 대한 환경 블록의 총 크기가 32,767자를 초과하면 실패합니다.

ANSI 환경 블록은 0바이트로 종료됩니다. 하나는 마지막 문자열에 대해 하나씩, 다른 하나는 블록을 종료합니다. 유니코드 환경 블록은 0바이트 4개로 종료됩니다. 마지막 문자열의 경우 2개, 블록을 종료하려면 2개씩 종료됩니다.

Windows Server 2003 및 Windows XP: 결합된 사용자 및 시스템 환경 변수의 크기가 8192바이트보다 큰 경우 CreateProcessAsUser 에서 만든 프로세스는 더 이상 부모 프로세스에서 함수에 전달된 환경 블록으로 실행되지 않습니다. 대신 자식 프로세스는 CreateEnvironmentBlock 함수에서 반환된 환경 블록으로 실행됩니다.

지정된 사용자에 대한 환경 블록의 복사본을 검색하려면 CreateEnvironmentBlock 함수를 사용합니다.

[in, optional] lpCurrentDirectory

프로세스의 현재 디렉터리에 대한 전체 경로입니다. 문자열은 UNC 경로를 지정할 수도 있습니다.

이 매개 변수가 NULL인 경우 새 프로세스는 호출 프로세스와 동일한 현재 드라이브 및 디렉터리를 가집니다. (이 기능은 주로 애플리케이션을 시작하고 초기 드라이브 및 작업 디렉터리를 지정해야 하는 셸에 대해 제공됩니다.)

[in] lpStartupInfo

STARTUPINFO 또는 STARTUPINFOEX 구조체 대한 포인터입니다.

사용자는 지정된 창 스테이션과 데스크톱 모두에 대한 모든 권한이 있어야 합니다. 프로세스를 대화형으로 설정하려면 winsta0\default를 지정합니다. lpDesktop 멤버가 NULL인 경우 새 프로세스는 부모 프로세스의 데스크톱 및 창 스테이션을 상속합니다. 이 멤버가 빈 문자열인 ""인 경우 새 프로세스는 창 스테이션에 대한 연결 프로세스에 설명된 규칙을 사용하여 창 스테이션에 연결합니다.

확장 특성을 설정하려면 STARTUPINFOEX 구조를 사용하고 dwCreationFlags 매개 변수에 EXTENDED_STARTUPINFO_PRESENT 지정합니다.

STARTUPINFO 또는 STARTUPINFOEX의 핸들은 더 이상 필요하지 않은 경우 CloseHandle을 사용하여 닫아야 합니다.

중요 호출자는 STARTUPINFO 의 표준 핸들 필드에 유효한 핸들 값이 포함되어 있는지 확인해야 합니다. 이러한 필드는 dwFlags 멤버가 STARTF_USESTDHANDLES 지정하는 경우에도 유효성 검사 없이 자식 프로세스에 변경되지 않고 복사됩니다. 값이 잘못되면 자식 프로세스가 잘못 실행되거나 충돌할 수 있습니다. Application Verifier 런타임 확인 도구를 사용하여 잘못된 핸들을 검색합니다.
 

[out] lpProcessInformation

새 프로세스에 대한 식별 정보를 수신하는 PROCESS_INFORMATION 구조체에 대한 포인터입니다.

PROCESS_INFORMATION 핸들은 더 이상 필요하지 않은 경우 CloseHandle을 사용하여 닫아야 합니다.

반환 값

함수가 성공하면 반환 값이 0이 아닙니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

프로세스가 초기화를 완료하기 전에 함수가 반환됩니다. 필요한 DLL을 배치할 수 없거나 초기화에 실패하면 프로세스가 종료됩니다. 프로세스의 종료 상태 얻으려면 GetExitCodeProcess를 호출합니다.

설명

CreateProcessAsUser는 TOKEN_DUPLICATE TOKEN_IMPERSONATE 액세스 권한으로 호출 프로세스의 기본 토큰을 열 수 있어야 합니다.

기본적으로 CreateProcessAsUser 는 표시되지 않고 사용자 입력을 받을 수 없는 바탕 화면이 있는 비대화형 창 스테이션에 새 프로세스를 만듭니다. 새 프로세스와 사용자 상호 작용을 사용하도록 설정하려면 STARTUPINFO 구조의 lpDesktop 멤버에서 기본 대화형 창 스테이션 및 데스크톱의 이름인 "winsta0\default"를 지정해야 합니다. 또한 CreateProcessAsUser를 호출하기 전에 기본 대화형 창 스테이션과 기본 데스크톱 모두의 DACL(임의 액세스 제어 목록)을 변경해야 합니다. 창 스테이션 및 데스크톱에 대한 DACL은 hToken 매개 변수로 표시되는 사용자 또는 로그온 세션에 대한 액세스 권한을 부여해야 합니다.

CreateProcessAsUser 는 지정된 사용자의 프로필을 HKEY_USERS 레지스트리 키에 로드하지 않습니다. 따라서 HKEY_CURRENT_USER 레지스트리 키의 정보에 액세스하려면 CreateProcessAsUser를 호출하기 전에 LoadUserProfile 함수를 사용하여 사용자의 프로필 정보를 HKEY_USERS 로드해야 합니다. 새 프로세스가 종료 된 후 UnloadUserProfile 을 호출해야 합니다.

lpEnvironment 매개 변수가 NULL인 경우 새 프로세스는 호출 프로세스의 환경을 상속합니다. CreateProcessAsUserhToken으로 표시되는 사용자와 관련된 환경 변수를 포함하도록 환경 블록을 자동으로 수정하지 않습니다. 예를 들어 lpEnvironment 가 NULL인 경우 USERNAME 및 USERDOMAIN 변수는 호출 프로세스에서 상속됩니다. 새 프로세스에 대한 환경 블록을 준비하고 lpEnvironment에서 지정하는 것은 사용자의 책임입니다.

CreateProcessWithLogonWCreateProcessWithTokenW 함수는 호출자가 LogonUser 함수를 호출하여 사용자를 인증하고 토큰을 가져올 필요가 없다는 점을 제외하고 CreateProcessAsUser와 유사합니다.

CreateProcessAsUser 를 사용하면 호출자 또는 대상 사용자의 보안 컨텍스트에서 지정된 디렉터리 및 실행 파일 이미지에 액세스할 수 있습니다. 기본적으로 CreateProcessAsUser 는 호출자의 보안 컨텍스트에서 디렉터리 및 실행 파일 이미지에 액세스합니다. 이 경우 호출자가 디렉터리 및 실행 파일 이미지에 액세스할 수 없는 경우 함수가 실패합니다. 대상 사용자의 보안 컨텍스트를 사용하여 디렉터리 및 실행 파일 이미지에 액세스하려면 CreateProcessAsUser를 호출하기 전에 ImpersonateLoggedOnUser 함수 호출에서 hToken을 지정합니다.

프로세스에 프로세스 식별자가 할당됩니다. 식별자는 프로세스가 종료될 때까지 유효합니다. 프로세스를 식별하는 데 사용하거나 OpenProcess 함수에 지정하여 프로세스에 대한 핸들을 열 수 있습니다. 프로세스의 초기 스레드에도 스레드 식별자가 할당됩니다. OpenThread 함수에 지정하여 스레드에 대한 핸들을 열 수 있습니다. 식별자는 스레드가 종료될 때까지 유효하며 시스템 내에서 스레드를 고유하게 식별하는 데 사용할 수 있습니다. 이러한 식별자는 PROCESS_INFORMATION 구조에서 반환됩니다.

호출 스레드는 WaitForInputIdle 함수를 사용하여 새 프로세스가 초기화를 완료하고 입력이 보류 중인 사용자 입력을 대기할 때까지 기다릴 수 있습니다. CreateProcessAsUser는 새 프로세스가 초기화를 완료할 때까지 기다리지 않고 반환되기 때문에 부모 프로세스와 자식 프로세스 간의 동기화에 유용할 수 있습니다. 예를 들어 만들기 프로세스는 새 프로세스와 연결된 창을 찾기 전에 WaitForInputIdle 을 사용합니다.

프로세스를 종료하는 기본 방법은 ExitProcess 함수를 사용하는 것입니다. 이 함수는 프로세스에 연결된 모든 DLL에 종료에 근접하는 알림을 보내기 때문입니다. 프로세스를 종료하는 다른 수단은 연결된 DLL에 알리지 않습니다. 스레드가 ExitProcess를 호출하면 추가 코드(연결된 DLL의 스레드 종료 코드 포함)를 실행할 기회 없이 프로세스의 다른 스레드가 종료됩니다. 자세한 내용은 프로세스 종료를 참조하세요.

기본적으로 TRUEbInheritHandles 매개 변수 값으로 전달하면 모든 상속 가능한 핸들이 새 프로세스에서 상속됩니다. 이는 여러 스레드에서 동시에 프로세스를 만들면서도 각 프로세스가 서로 다른 핸들을 상속하기를 원하는 애플리케이션에 문제가 될 수 있습니다. 애플리케이션은 PROC_THREAD_ATTRIBUTE_HANDLE_LIST 매개 변수와 함께 UpdateProcThreadAttributeList 함수를 사용하여 특정 프로세스에서 상속할 핸들 목록을 제공할 수 있습니다.

보안 설명

lpApplicationName 매개 변수는 NULL일 수 있습니다. 이 경우 실행 파일 이름은 lpCommandLine에서 첫 번째 공백으로 구분된 문자열이어야 합니다. 실행 파일 또는 경로 이름에 공백이 있는 경우 함수가 공백을 구문 분석하는 방식으로 인해 다른 실행 파일을 실행할 수 있는 위험이 있습니다. 다음 예제는 함수가 "MyApp.exe" 대신 "Program.exe"(있는 경우)을 실행하려고 하기 때문에 위험합니다.
	LPTSTR szCmdline[] = _tcsdup(TEXT("C:\\Program Files\\MyApp"));
	CreateProcessAsUser(hToken, NULL, szCmdline, /*...*/ );

악의적인 사용자가 시스템에서 "Program.exe"라는 애플리케이션을 만드는 경우 Program Files 디렉터리를 사용하여 CreateProcessAsUser 를 잘못 호출하는 프로그램은 의도한 애플리케이션 대신 이 애플리케이션을 실행합니다.

이 문제를 방지하려면 lpApplicationName에 대해 NULL을 전달하지 마세요. lpApplicationName대해 NULL을 전달하는 경우 아래 예제와 같이 lpCommandLine의 실행 경로 주위에 따옴표를 사용합니다.

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

Powershell: CreateProcessAsUser 함수를 사용하여 PowerShell 버전 2.0에서 cmdlet을 구현하는 경우 cmdlet은 팬인 및 팬아웃 원격 세션 모두에 대해 올바르게 작동합니다. 그러나 특정 보안 시나리오로 인해 CreateProcessAsUser 로 구현된 cmdlet은 팬인 원격 세션의 경우 PowerShell 버전 3.0에서만 올바르게 작동합니다. 클라이언트 보안 권한이 부족하여 팬아웃 원격 세션이 실패합니다. PowerShell 버전 3.0에서 팬인 및 팬아웃 원격 세션 모두에 대해 작동하는 cmdlet을 구현하려면 CreateProcess 함수를 사용합니다.

예제

예제는 대화형 클라이언트 프로세스 시작을 참조하세요.

참고

processthreadsapi.h 헤더는 CREATEProcessAsUser를 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 processthreadsapi.h(Windows.h 포함)
라이브러리 Advapi32.lib
DLL Advapi32.dll

추가 정보

CloseHandle

CreateEnvironmentBlock

CreateProcess

CreateProcessWithLogonW

ExitProcess

GetEnvironmentStrings

GetExitCodeProcess

GetStartupInfo

ImpersonateLoggedOnUser

LoadUserProfile

PROCESS_INFORMATION

프로세스 및 스레드 함수

프로세스

SECURITY_ATTRIBUTES

SHCreateProcessAsUserW

STARTUPINFO

STARTUPINFOEX

SetErrorMode

WaitForInputIdle