문제

지정된 사용자 세부 정보 집합을 사용하여 CreateProcessWithLogonW()를 호출하여 서비스 내에서 시작되는 Windows 실행 파일이 있습니다.

이것은 잘 작동하고 프로세스가 예상대로 시작됩니다.그러나 이 프로세스가 현재 CreateProcess()를 사용하여 다른 프로세스 자체를 시작하려고 하면 이러한 프로세스는 시작된 다음 즉시 종료됩니다. 이는 데스크톱 액세스가 필요한 실행 파일입니다.

CreateProcess()에 대한 Microsoft의 기사를 읽은 후 - http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

왜 이런 일이 일어나고 있는지 알 수 있고 어느 정도 의미가 있다고 생각합니다.CreateProcess()는 호출 프로세스가 사용자를 가장하고 있다는 것을 알고 있으므로 상위 프로세스(이 경우에는 로컬 시스템 계정)를 사용합니다.그러나 물론 로컬 시스템 계정에서 실행되는 모든 항목에는 필요한 액세스 권한이 없으므로 시작된 프로세스가 종료됩니다.

이상하게도 이전에 LogonUser() 및 CreateProcessAsUser()를 사용하여 서비스 내에서 초기 실행 파일을 시작할 때는 제대로 작동했습니다.하지만 올바른 권한이 없는 문제로 인해 이를 CreateProcessWithLogonW()로 변경해야 했습니다.

이에 대한 해결책을 아는 사람이 있나요?웹의 다른 곳에서 이에 대해 이야기하는 것을 본 적이 있지만 확실한 해결책은 없습니다.나중에 다른 프로세스를 시작하는 데 사용할 수 있도록 CreateProcessWithLogonW()에 로그온한 사용자의 토큰이 필요한 것 같습니다.하지만 이 토큰을 얻을 수 있는 방법이 없습니다. 현재 사용자가 어떤 방식으로든 이 토큰을 검색할 수 있습니까?

어떤 도움이라도 대단히 감사하겠습니다. 감사합니다 :)

도움이 되었습니까?

해결책

사용하여 시작된 코드를 소유하고 있습니까? CreateProcessWithLogonW (그리고 결국 전화 CreateProcess)? 그렇지 않은 경우 수행해야 할 수도 있습니다. IAT (또는 API) 후크 그것 (즉, 런타임에), CreateProcess 사용하는 적절한 절차가 있습니다 CreateProcessWithLogonW 또는 CreateProcessWithTokenW. 보다 apihijack, 우회.

이 작업이 완료되면 아동 과정은 HKCU. 아직이 작업을 수행하지 않은 경우 전화하기 전에 사용자 당 한 번, 사용자 당 한 번, 각각의 가장 한 사용자의 프로필을로드해야합니다. CreateProcessWithLogonW.

기본적으로 CreateProcesswithLogonw는 지정된 사용자 프로파일을 HKey_Users 레지스트리 키에로드하지 않습니다. 이는 HKEY_CURRENT_USER 레지스트리 키의 정보에 대한 액세스가 일반 대화식 로그온과 일치하는 결과를 생성하지 못할 수 있음을 의미합니다. logon_with_profile을 사용하거나 loaduserProfile 함수를 호출하여 CreateProcesswithLogonw를 호출하기 전에 사용자 레지스트리 하이브를 HKEY_USERS에로드하는 것은 귀하의 책임입니다.

다른 팁

우리는 오래 전에 찾은 일부 코드를 사용하여 문제를 해결했습니다.소스 모듈 중 하나의 "저작권" 섹션에는 다음이 포함되어 있습니다.

/////////////////////////////////////////////////////////////
// CreateProcessAsUser.cpp
// 
// Written by Valery Pryamikov (1999)
// 
// Command line utility that executes a command under specified user identity 
// by temporarily installing itself as a service.
//
// Based on Keith Brown's AsLocalSystem utility (http://www.develop.com/kbrown)
// Uses some code from Mike Nelson's dcomperm sample utility 
//   and from tlist sample (Microsoft Source Code Samples)
//
// Use:
//  CreateProcessAsUser.exe [-i[nteractive]]|[-s[ystem]]|
//       [-u"UserName" -d"DomainName" -p"Password"]|[-a"AppID"] command
//  Command must begin with the process (path to the exe file) to launch
//  -i        process will be launched under credentials of the 
//            "Interactive User" (retrieved from winlogon\shell process)
//  -a        process will be launched under credentials of the user 
//            specified in "RunAs" parameter of AppID.
//  -s        process will be launched as local system
//  -u -d -p  process will be launched on the result token of the 
//            LogonUser(userName,domainName,password,LOGON32_LOGON_BATCH...)
//
// either (-s) or (-i) or (-a) or (-u -d -p) parameters must supplied
// 
// Examples:
// CreateProcessAsUser -s cmd.exe
// CreateProcessAsUser -a"{731A63AF-2990-11D1-B12E-00C04FC2F56F}" winfile.exe
//
/////////////////////////////////////////////////////////////

아마도 이 정보는 귀하의 Google 검색에서 히트를 기록할 것입니다. 몇 가지 빠른 시도를 시도했지만 빈손으로 나왔습니다.우리는 필요한 결과를 산출하는 API 세트로 ​​내부를 분해했습니다.

데스크탑과 상호 작용할 수있는 서비스 옵션이 없습니까? 서비스를 위해 해당 옵션을 설정하는 것이 가능성이 있다면 아마도 가장 간단한 솔루션 일 것입니다.

이 과정이 서비스라고 가정합니다. 이 질문에는 지정되지 않았지만 로컬 시스템 계정으로 실행되고 있다는 점을 감안할 때 논리적으로 보입니다.

당신이 붙어있는 곳은 들어 가지 않습니다 CreateProcess, 그것은 들어 왔습니다 CreateService. 서비스가 데스크탑과 상호 작용할 수 있도록하려면 지정해야합니다. SERVICE_INTERACTIVE_PROCESS 논쟁의 깃발 중 하나로 dwServiceType. 이 설정은 서비스의 아동 프로세스에 의해 상속됩니다.

서비스 도구를 사용하여 기존 서비스 설정을 수정하고 서비스의 속성을 선택하고 "로그온"탭을 클릭 한 다음 "데스크탑과 상호 작용할 수있는 서비스 허용"확인란을 선택할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top