권한이있는 관리자 계정으로 실행되는 상위 프로세스 (예 : 명령 프롬프트)에서 프로세스를 시스템 컨텍스트로 시작할 수 있습니까? 이 문제는 psexec의 기능과 비슷하지만 실제로 어떻게 구현되는지에 관한 문제입니다.시스템 컨텍스트에서 프로세스 실행
crss.exe/winlogon.exe 프로세스를 열고 토큰을 복제하고 해당 프로세스 토큰을 사용하여 새 프로세스를 시작하려고 생각했습니다. 하지만 프로세스 핸들 (Getlasterror return 5)을 열지 못했습니다. 누군가가 이것이 올바른 접근인지 또는 프로세스가 다르게 시작되어야하는지 알려주실 수 있습니까?
HANDLE hWinLogonProcess;
for(const auto& ps : running_processes)
{
if(ps.id == GetCurrentProcessId() ||
0 != ps.short_name.CompareNoCase(L"winlogon.exe"))
{
continue;
}
DWORD dwWinLogonSessionId(0);
if(FALSE == ProcessIdToSessionId(GetCurrentProcessId(), &dwWinLogonSessionId))
{
std::wcerr<<"Could not get Winlogon process session id"<<std::endl;
continue;
}
if(dwWinLogonSessionId != dwCurSessionId)
{
continue;
}
hWinLogonProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ps.id);
if(FALSE == hWinLogonProcess)
{
std::wcerr<<"Failed to get winlogon process handle"<<std::endl;
return;
}
else
{
std::wcout<<"Able to open process "<<ps.short_name.GetString()<<" handle"<<std::endl;
break;
}
}
작업 도구 (psexec)가 있으므로 가능한 것이 확실하지만이를 수행 할 수있는 참조를 찾을 수 없습니다.
또한 이것은 question과 유사하지만 달성해야하는 방법에 대한 세부 정보가 있으므로 별도로 게시합니다.
[how psexec works (http://forum.sysinternals.com/topic9674_post41829.html#41829)]를 참조하십시오. 요컨대, psexec는 관리자 사용자에게 로그인하고 시스템 액세스를 얻기 위해 임시 서비스를 설치 및 실행 한 다음 해당 서비스가 명령을 실행 한 다음 psexec가 서비스를 중지하고 제거합니다. psexec은 파이프를 사용하여 자체와 서비스간에 입/출력을 교환하며, 서비스는 파이프를 사용하여 실행중인 명령과 입/출력을 교환합니다. –
고마워요 @RemyLebeau, 나는 이것을 달성하기 위해 psexec가 서비스를 만드는 것을 보았습니다. 그러나 나는 dll을 가지고 있고 이것에 새로운 exe를 소개하고 싶지 않다. 이를 프로그램 적으로 달성 할 수 있습니까? 현재 프로세스가 이미 관리자 권한으로 실행되고 있기 때문입니다. – user3279954
서비스 만 시스템 권한을 얻을 수 있으며 관리자 만 서비스를 설치할 수 있습니다. 드라이버가 아닌 한 DLL을 서비스로 직접 실행할 수는 없지만 별도의 EXE를 작성할 필요는 없습니다. 1) DLL을 ['Rundll32'] (https://support.microsoft.com/en-us/kb/164787)에서 호출 할 수 있도록 디자인 한 다음 해당 EXE를 서비스로 사용하거나 2) 메인 EXE는 커맨드 라인 매개 변수를 가진 서비스로서 스스로를 설치하고, 그 매개 변수로 EXE가 실행될 때 관련 서비스 API 호출을'WinMain()'함수에 추가하고 필요에 따라 "서비스"가 DLL을 사용하도록합니다. –