CreateProcessAsUser를 사용해서 해당 유저권한으로 프로세스를 실행시키고 싶은데 자꾸 SYSTEM으로 올라와서 정리.

작업했던 내용은 Service에서 사용하고 싶은 것이었는데...... 

찾은 몇가지 코드들은 여전히 SYSTEM으로 올라와서 찾다가

Service에서 실행되는 코드 발견..


둘의 차이가 뭔지 좀 보려고 우선 올려둠..


언젠간 보겠지.. (먼산)


# 응용 프로그램 코드


BOOL LaunchAppIntoDifferentSession(TCHAR* lpszProcessName, TCHAR* lpszCommendLine)

{

PROCESS_INFORMATION pi;

STARTUPINFO si;

BOOL bResult = FALSE;

DWORD dwSessionId, winlogonPid;

HANDLE hUserToken, hUserTokenDup, hPToken, hProcess;

DWORD dwCreationFlags;


// Log the client on to the local computer.


dwSessionId = WTSGetActiveConsoleSessionId();


//////////////////////////////////////////

// Find the winlogon process

////////////////////////////////////////


PROCESSENTRY32 procEntry;


HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hSnap == INVALID_HANDLE_VALUE)

{

return 1;

}


procEntry.dwSize = sizeof(PROCESSENTRY32);


if (!Process32First(hSnap, &procEntry))

{

return 1;

}


do

{

if (_tcsicmp(procEntry.szExeFile, _T("winlogon.exe")) == 0)

{

// We found a winlogon process...

// make sure it's running in the console session

DWORD winlogonSessId = 0;

if (ProcessIdToSessionId(procEntry.th32ProcessID, &winlogonSessId)

&& winlogonSessId == dwSessionId)

{

winlogonPid = procEntry.th32ProcessID;

break;

}

}


} while (Process32Next(hSnap, &procEntry));


////////////////////////////////////////////////////////////////////////


WTSQueryUserToken(dwSessionId, &hUserToken);

dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

si.lpDesktop = _T("winsta0\\default");

si.wShowWindow = SW_HIDE;

ZeroMemory(&pi, sizeof(pi));

TOKEN_PRIVILEGES tp;

LUID luid;

hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, winlogonPid);


if (!::OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY

| TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID

| TOKEN_READ | TOKEN_WRITE, &hPToken))

{

int abcd = GetLastError();

printf("Process token open Error: %u\n", GetLastError());

}


if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))

{

printf("Lookup Privilege value Error: %u\n", GetLastError());

}

tp.PrivilegeCount = 1;

tp.Privileges[0].Luid = luid;

tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;


DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, NULL,

SecurityIdentification, TokenPrimary, &hUserTokenDup);

int dup = GetLastError();


//Adjust Token privilege

SetTokenInformation(hUserTokenDup,

TokenSessionId, (void*)dwSessionId, sizeof(DWORD));


if (!AdjustTokenPrivileges(hUserTokenDup, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),

(PTOKEN_PRIVILEGES)NULL, NULL))

{

int abc = GetLastError();

printf("Adjust Privilege value Error: %u\n", GetLastError());

}


if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

{

printf("Token does not have the provilege\n");

}


LPVOID pEnv = NULL;


if (CreateEnvironmentBlock(&pEnv, hUserTokenDup, TRUE))

{

dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;

}

else

pEnv = NULL;


// Launch the process in the client's logon session.


bResult = CreateProcessAsUser(

hUserTokenDup,                     // client's access token

lpszProcessName,    // file to execute

lpszCommendLine,                 // command line

NULL,            // pointer to process SECURITY_ATTRIBUTES

NULL,               // pointer to thread SECURITY_ATTRIBUTES

FALSE,              // handles are not inheritable

dwCreationFlags,     // creation flags

pEnv,               // pointer to new environment block

NULL,               // name of current directory

&si,               // pointer to STARTUPINFO structure

&pi                // receives information about new process

);

// End impersonation of client.


//GetLastError Shud be 0


int iResultOfCreateProcessAsUser = GetLastError();


//Perform All the Close Handles tasks


CloseHandle(hProcess);

CloseHandle(hUserToken);

CloseHandle(hUserTokenDup);

CloseHandle(hPToken);


return 0;

}



# Service 에서의 코드


HRESULT RunAsInteractiveUser(TCHAR* lpszProcessName, TCHAR* lpszCommendLine)

{

BOOL bRet;

HRESULT hr;


HANDLE processToken = NULL;

TOKEN_PRIVILEGES oldTokenPrivileges = { 0 };


HANDLE impersonationToken = NULL;

HANDLE userToken = NULL;


LPVOID pEnvironment = NULL;

PROCESS_INFORMATION processInformation = { 0 };


__try {

bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &processToken);

if (!bRet) {

hr = GetLastError();

return hr;

}


// This step might not be necessary because SeTcbPrivilege is enabled by default for Local System

LUID luid;

bRet = LookupPrivilegeValue(NULL, _T("SeTcbPrivilege"), &luid);

if (!bRet) {

hr = GetLastError();

return hr;

}


TOKEN_PRIVILEGES adjTokenPrivileges = { 0 };

adjTokenPrivileges.PrivilegeCount = 1;

adjTokenPrivileges.Privileges[0].Luid = luid;

adjTokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;


DWORD dwOldTPLen;

bRet = AdjustTokenPrivileges(processToken, FALSE, &adjTokenPrivileges, sizeof(TOKEN_PRIVILEGES), &oldTokenPrivileges, &dwOldTPLen);

if (bRet) {

hr = GetLastError();

if (hr == ERROR_SUCCESS);

else if (hr == ERROR_NOT_ALL_ASSIGNED) {

// Enabled by default

}

}

else {

hr = GetLastError();

return hr;

}


DWORD conSessId = WTSGetActiveConsoleSessionId();

if (conSessId == 0xFFFFFFFF) {

// There is no session attached to the console

return ERROR_SUCCESS;

}


bRet = WTSQueryUserToken(conSessId, &impersonationToken);

if (!bRet) {

hr = GetLastError();

return hr;

}


bRet = DuplicateTokenEx(impersonationToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &userToken);

if (!bRet) {

hr = GetLastError();

return hr;

}


STARTUPINFO si = { 0 };

si.cb = sizeof(STARTUPINFO);

si.lpDesktop = _T("winsta0\\default");


bRet = CreateEnvironmentBlock(&pEnvironment, userToken, TRUE);

if (!bRet) {

hr = GetLastError();

return hr;

}


bRet = CreateProcessAsUser(userToken, lpszProcessName,

lpszCommendLine, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT,

pEnvironment, NULL, &si, &processInformation);

if (!bRet) {

hr = GetLastError();

return hr;

}

else

{

bRet = WaitForSingleObject(processInformation.hProcess, INFINITE);

DWORD retVal = NULL;

GetExitCodeProcess(processInformation.hProcess, &retVal);

if (1 == (int)retVal)

{

return ERROR_SUCCESS;

}

return E_FAIL;

}

}

__finally {

if (processInformation.hThread) {

CloseHandle(processInformation.hThread);

}

if (processInformation.hProcess) {

CloseHandle(processInformation.hProcess);

}

if (pEnvironment) {

bRet = DestroyEnvironmentBlock(pEnvironment);

}

if (userToken) {

CloseHandle(userToken);

}

if (impersonationToken) {

CloseHandle(impersonationToken);

}

if (processToken) {

bRet = AdjustTokenPrivileges(processToken, FALSE, &oldTokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);

CloseHandle(processToken);

}

}

}

'Programmer의 텅빈 공간 > C/C++' 카테고리의 다른 글

VS 2013 확장 기능  (0) 2016.04.22
visual studio 단축키 정리  (0) 2015.08.04
singleton  (0) 2014.05.06
non-mfc에서 TRACE, ASSERT 사용  (0) 2014.05.06
메모리 풀을 왜 사용해야 하는가 ?  (0) 2014.05.06

출처 : http://www.clien.net/cs2/bbs/board.php?bo_table=useful&wr_id=252660





다양한 언어들의 API가 정리되어 있다 !


공부할 때 이용하려고 포스팅해본다.



http://overapi.com/

'Programmer의 텅빈 공간' 카테고리의 다른 글

visual studio 라인 수 출력  (0) 2014.07.28
visual studio 단축키 정리  (0) 2014.06.25
error LNK2019 : 해결법  (0) 2014.05.16



요새 한창 빠져서 덕질하는 그 남자 !


젝키와 제이워크의 그 남자 ! 


김재덕 ! 




바로 이남자 !! 




오늘도 열심히 덕질 하기 위해 여기저기 돌다가 발견한 이것..


예전에도 봤었던 인터뷰인데 이렇게 다시 보니 새롭...



http://m.esports.dailygame.co.kr/view.php?ud=2013070512244555355




다시 이 인터뷰를 살펴보다 본 내용이 있는데.. 그것이 바로



두 선수 모두 아이돌 그룹에 있던 멤버를 닮았다는 이야기를 듣고 있잖아요. 김택용 선수는 슈퍼주니어 규현, 조재걸 선수는 예전 아이돌 그룹인 젝스키스 김재덕을 닮았다는 평가를 받고 있는데 어떻게 생각하나요?

김택용=규현이 형이랑 친한데 이런 기사 나가면 정말 규현이 형한테 민폐에요(웃음). 규현이 형이 훨씬 잘생겼죠. 전 발 끝도 못 쫓아가요(웃음).
조재걸=예전부터 김재덕씨를 닮았다는 이야기는 많이 들었는데 사실 누군지는 잘 몰랐어요(웃음). 제가 젝스키스를 보고 자란 세대는 아니거든요(웃음). 그 이야기를 듣고 네이버에서 찾아봤는데 느낌이 비슷하긴 하지만 김재덕씨가 더 잘생긴 것 같아요.





... 그렇다.. 난... 이 남자들에게 빠진건.. 



그냥 내 취향인 것이었다.......... !!



새로운 내 취향을 알게된 날 !

'덕망진창' 카테고리의 다른 글

현.망.진.창  (0) 2016.05.10


무도에서 젝키 컴백을 보면서 ... 


순식간에 덕통 사고를 당했다 !!




덕분에 갑작스런 덕질로 내 현실을 엉망진창... !!


일명 현망진창이 되어 버렸다 @_@




... 재덕 오빠 (드디어 나도 오빠라고 불리는 사람을 덕질한다 !) 





'덕망진창' 카테고리의 다른 글

나는..  (0) 2016.05.11


뒤늦게 팬미팅 하는 걸 알아챈 난 싸인 한장 못받고 .. 그저 멀리서 사진만 몇장 찍었더랬다.



근데 그 중에서도 건진 사진이 몇개 없으니 그야말로 흙손 ... 


그리고 그걸 또 약 3개월이나 지난 시기에 올리는 나란 사람..... 후후..


열심히 찍은 피넛과 프레이는.... 넘치는 팬들 사이에서 허우적 대다가 흔들린 사진 밖에 없다. (미안..)


이때까지만 해도.. 내 4월 말은 엄청나게 행복할 줄 알았었지... 









계속 사용해 오던 VS 2008 을 뒤로 하고 


컴파일 속도도 넘사벽으로 빠르며 더 좋아졌다는 VS 2013 을 주력으로 사용하게 되었다. 



몇몇 생소한 기능들도 있고 , 


잘 사용하던 기능이 안되서 답답하기도 하지만....


이것도 곧 ! 익숙해 지겠지 





VS 2013 을 주력으로 사용하게 되면서 


무료 확장 기능 중 아주 괜찮은 녀석을 발견해 잊어 버리기 전에 작성한다. !!


이름은


Productivity Power Tools 


라는 녀석인데 MS 공식 확장 기능이고, 코드 편집이나 뷰어 기능이 더 좋아진다 !!



소개 블로그 : https://blogs.msdn.microsoft.com/eva/?p=573


다운로드 : https://visualstudiogallery.msdn.microsoft.com/dbcb8670-889e-4a54-a226-a48a15e4cace




먹고 살려면 ... 열심히 코딩 해야지 ! 


회사 일에 이사에 정신 없이 보내다 보니...




블로그를 방치해두고 있었다 !



그리고 .. 그 사이.......


나진은 이제 역사속으로 ...........



ㅠㅠ 재거리를 보려면 중국 리그를 봐야 한다니...




매우 

늦었지만 그 동안 수고 많으셨습니다. 


선수 여러분, 코칭스텝 여러분, 대표님 모두 ! 



나진이 있어서 즐거웠습니다 :D

'Game은 나의 활력소 > 나진' 카테고리의 다른 글

온게임넷 라이브 tv  (0) 2015.09.07
롤챔스는...  (0) 2015.03.12
간만에 생각난 ..  (0) 2014.12.12
저번주의 롤챔스 프리시즌 !  (0) 2014.12.10
롤드컵 16강 대진  (0) 2014.09.12


지친다 .. 

'마음의 소리' 카테고리의 다른 글

2015.08.13  (0) 2015.08.13
갤럭시s6엣지 아이언맨 에디션 개봉기  (0) 2015.06.03
-  (0) 2015.05.12


간만에 온게임넷을 피씨로 보려니까 ..

전에 보던 tving은... 돈을 요구하고 ......


겨우 찾은 곳이 트위치 tv



http://www.twitch.tv/ogn


화질이 좀 그렇지만 ! 볼만합니다 :D



그래도 역시 tv에서 보는게 최고인듯..





'Game은 나의 활력소 > 나진' 카테고리의 다른 글

정신차려보니..  (0) 2016.03.08
롤챔스는...  (0) 2015.03.12
간만에 생각난 ..  (0) 2014.12.12
저번주의 롤챔스 프리시즌 !  (0) 2014.12.10
롤드컵 16강 대진  (0) 2014.09.12



요새 덕질을 해야 하는데 못해서 죽어감.... ㅇ<-<



회사 일에 정신 없어서 롤 경기도 못보고 있는데 ㅠㅠ


더 끔찍한 소식을 들었으니 !!!


그것은 바로 !!


날 이스포츠 덕후로 만든... 그 분이 ..


이번시즌 스타리그를 하고 계시다는 말 ! 



롤 경기도 힘든데.. 이제 스타리그로 봐야하는구나 헠헠..





택신 ! 당신을 다시 보러 스타리그 다운 받을께요 :D

'마음의 소리' 카테고리의 다른 글

2015.12.04  (0) 2015.12.04
갤럭시s6엣지 아이언맨 에디션 개봉기  (0) 2015.06.03
-  (0) 2015.05.12

+ Recent posts