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


계속 사용해 오던 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




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

출처 : http://cafe.naver.com/hgclient/77

  http://www.jynote.net/447

  http://egloos.zum.com/chez/v/1759035


* 필요시 계속 추가 예정


이 글은 뇌가 문도인듯한 제가 자꾸 잊어버려서 잊어버리지 않기 위해 정리해둡니다 ! 

제가 자주 사용하려는 것들 위주로 적을 것이라 더 많은 걸 알고 싶으시면 출처 및 구글 검색을 통해

확인하시면 되겠습니다 :D



Shift + Delete : 커서가 위치한 줄 삭제

활용 : 커서가 위치한 줄을 삭제한다.

         빠르게 현재 줄을 삭제할 때 많이 활용된다.


Ctrl + L : 커서가 위치한 줄 삭제, 선택된 줄단위로 삭제

활용 : 위 단축키와 비슷하지만 영역을 선택했을 때 여러줄을 줄단위로 삭제 한다.


Ctrl + K + C : 선택 영역 주석 달기

활용 : 선택 영역의 주석을 한 단계씩 추가한다.

 

Ctrl + K + U : 선택 영역 주석 없애기

활용 : 선택 영역을 주석을 한 단계씩 감소시킨다.


F9 : 브레이크 포인트 설정

활용 : 현재 커서가 위치한 줄에 중단점을 설정한다.

         중단점이 걸리면 디버그시 해당 코드를 실행하기전에 중지되어 사용자에게 코드 

   위치를 보여준다.


Ctrl + F2 : 커서가 위치한 줄에 책갈피 설정

활용 : 현재 문서에서 커서가 위치한 줄에 책갈피를 설정한다.

         책갈피는 관심있는 코드를 메모해놓고 쉽게 접근하기 위해 사용한다.


F2 : 다음 설정된 책갈피로 커서 이동

활용 : 현재 문서에서 설정된 책갈피가 있을 때 순차적으로 책갈피를 탐색한다.


Ctrl + Shift + F2 : 설정된 책갈피 모두 삭제

활용 : 현재 문서에 설정되어 있는 책갈피를 모두 삭제한다.


Ctrl + K + F : 소스 코드 자동 정렬

활용 : 정렬이 잘 되어있지 않을 때 ctrl + A 후 사용하면 자동 정렬된다.


Ctrl + / -> of 파일명 : 파일 찾기

활용 : 파일명을 빠르게 파일을 열 수 있다.

출처 : http://skyzerotiger.com/74


OpenGLES 를 다루다 보면 가장 큰 문제가 

Matrix와 관련된 함수가 없다는 것인데


친절하게 만들어 주신 분의 블로그를 찾았다 ㅠㅠ 



감사히 사용해야겠다. 

(위 블로그로 이동하시면 해당 소스가 있습니다)

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

OpenGLES 에서의 gluLookAt  (0) 2015.01.20
토파즈 필터 구현시 도움이 될만한 논문  (0) 2014.07.11
Color Curves Shader  (0) 2014.06.13
Kuwahara Effect  (0) 2014.06.11
Edge Effect Shader  (0) 2014.06.11

출처 : http://iphonedevelopment.blogspot.kr/2008/12/glulookat.html




 OpenGL에서 사용되던 카메라 시점을 설정해 주기 위한 


glLookAt이 OpenGLES에서는 제공되지 않기 때문에 찾던 중 발견함.


역시... 해외 능력자들은 대단하다 ㅠㅠb



gluLookAt.h

/*
* gluLookAt.h
*
* This is a modified version of the function of the same name from
* the Mesa3D project ( http://mesa3d.org/ ), which is licensed
* under the MIT license, which allows use, modification, and
* redistribution
*
* In order to work under OpenGL ES, all instances of GLdouble
* had to be changed to GLfloat, and all "d" function calls had
* to be changed to the "f" versions.
*
* Original developer's comments have been left in place.
*
* Out of respect for the original authors, this is licensed under
* the Mesa (MIT) license. Original license follows:
*
* -----------------------------------------------------------------------
*
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.

* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/

#import <Foundation/Foundation.h>
#import <OpenGLES/EAGL.h>
#import <OpenGLES/ES1/gl.h>
#import <OpenGLES/ES1/glext.h>

void gluLookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez,
GLfloat centerx, GLfloat centery, GLfloat centerz,
GLfloat upx, GLfloat upy, GLfloat upz);




gluLookAt.c

/*
* gluLookAt.c
*/


#include "gluLookAt.h"

void gluLookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez,
GLfloat centerx, GLfloat centery, GLfloat centerz,
GLfloat upx, GLfloat upy, GLfloat upz)
{
GLfloat m[16];
GLfloat x[3], y[3], z[3];
GLfloat mag;

/* Make rotation matrix */

/* Z vector */
z[0] = eyex - centerx;
z[1] = eyey - centery;
z[2] = eyez - centerz;
mag = sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]);
if (mag) { /* mpichler, 19950515 */
z[0] /= mag;
z[1] /= mag;
z[2] /= mag;
}

/* Y vector */
y[0] = upx;
y[1] = upy;
y[2] = upz;

/* X vector = Y cross Z */
x[0] = y[1] * z[2] - y[2] * z[1];
x[1] = -y[0] * z[2] + y[2] * z[0];
x[2] = y[0] * z[1] - y[1] * z[0];

/* Recompute Y = Z cross X */
y[0] = z[1] * x[2] - z[2] * x[1];
y[1] = -z[0] * x[2] + z[2] * x[0];
y[2] = z[0] * x[1] - z[1] * x[0];

/* mpichler, 19950515 */
/* cross product gives area of parallelogram, which is < 1.0 for
* non-perpendicular unit-length vectors; so normalize x, y here
*/


mag = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
if (mag) {
x[0] /= mag;
x[1] /= mag;
x[2] /= mag;
}

mag = sqrt(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]);
if (mag) {
y[0] /= mag;
y[1] /= mag;
y[2] /= mag;
}

#define M(row,col) m[col*4+row]
M(0, 0) = x[0];
M(0, 1) = x[1];
M(0, 2) = x[2];
M(0, 3) = 0.0;
M(1, 0) = y[0];
M(1, 1) = y[1];
M(1, 2) = y[2];
M(1, 3) = 0.0;
M(2, 0) = z[0];
M(2, 1) = z[1];
M(2, 2) = z[2];
M(2, 3) = 0.0;
M(3, 0) = 0.0;
M(3, 1) = 0.0;
M(3, 2) = 0.0;
M(3, 3) = 1.0;
#undef M
glMultMatrixf(m);

/* Translate Eye to Origin */
glTranslatef(-eyex, -eyey, -eyez);

}


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

OpenGLES에서 Matrix 기능 사용하기  (0) 2015.01.20
토파즈 필터 구현시 도움이 될만한 논문  (0) 2014.07.11
Color Curves Shader  (0) 2014.06.13
Kuwahara Effect  (0) 2014.06.11
Edge Effect Shader  (0) 2014.06.11


자료구조와 알고리즘을 공부하기 좋은 사이트 !


http://visualgo.net/


확실히 시각화 해서 보니까 최고인듯 b




사용법에 대한 영상은 


http://www.youtube.com/watch?v=k0GHDQ0pqXY




출처 : http://hisalang.tistory.com/10


몇년을 사용하면서도 .... 중요한 기능을 모르는(?) 혹은

자꾸 잊어버리는 내가 밉다............ 하아...........


잊지 않게 스크랩 해둬야지 ㅜㅜ


도구 -> 옵션 -> 텍스트편집기 -> 모든언어 -> 줄번호 체크


순서로 라인 수 출력 ! 



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

개발자를 위한 API 정리 사이트  (0) 2016.06.29
visual studio 단축키 정리  (0) 2014.06.25
error LNK2019 : 해결법  (0) 2014.05.16


토파즈 필터를 알게되곤 구현욕구가 좀 생겨서 공부 좀 하려 합니당 ! 


그에 필요한 준비과정으로 읽어봐야 할 논문 !!



kang_eg2011.pdf


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

OpenGLES에서 Matrix 기능 사용하기  (0) 2015.01.20
OpenGLES 에서의 gluLookAt  (0) 2015.01.20
Color Curves Shader  (0) 2014.06.13
Kuwahara Effect  (0) 2014.06.11
Edge Effect Shader  (0) 2014.06.11

1차 출처 : http://cafe.naver.com/hgclient/77

2차 출처 : http://luyin.tistory.com/294


Ctrl + F : 찾기

Ctrl + Shift + F : 파일에서 찾기

Ctrl + Space : NameSpace

Ctrl + Shift + Space : Parameter

Home : 커서가 위치한 줄의 코드 시작 위치로

End : 커서가 위치한 줄의 코드 끝 위치로

Shift + Home : 커서가 위치한 줄 모두 블록

Shift + End : 커서가 위치한 줄 모두 블록

Shift + ← or → or ↑ or ↓ : 블록 잡기

드래그 + Alt : 현재 커서 위치부터 움직인 커서 위치까지 블록

Ctrl + ←, → : 구분단위로 커서 이동

Ctrl + Shift + ← or → : 구분단위로 블록

Ctrl + M, L : 전체 + 버튼으로 만들기

Ctrl + M, M : 커서 위치가 속한 곳을 + 버튼으로 만들기

Ctrl + M, L : 선택된 곳을 +버튼으로 만들기

Shift + Delete : 커서가 위치한 줄 삭제

Ctrl + L : 커서가 위치한 줄 삭제, 선택된 줄단위로 삭제

Ctrl + K, C : 선택 영역 주석 달기

Ctrl + K, U : 선택 영역 주석 없애기

 

F7 : 빌드

Ctrl + Alt + F7 : 전체 다시 빌드

F5 : 빌드 + 실행

Ctrl + F5 : 빌드 없이 실행

F9 : 브레이크 포인트 설정

F10 : 줄단위 실행

F11 : 코드 단위 실행

F12 : 정의로 이동

Ctrl + '-'키 : 이전 커서 위치로

Ctrl + Shift + '-'키 : 다음 커서 위치로

Ctrl + F2 : 커서가 위치한 줄에 책갈피 설정

F2 : 다음 설정된 책갈피로 커서 이동

Ctrl + Shift + F2 : 설정된 책갈피 모두 삭제

Ctrl + F10 : 커서 위치까지 실행

Alt + F8 : 선택 영역 코드 탭 정리하기

 

마우스 우클릭 - Find All Refrence : 모든참조 찾기

Alt + P + P : 프로젝트 속성

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

개발자를 위한 API 정리 사이트  (0) 2016.06.29
visual studio 라인 수 출력  (0) 2014.07.28
error LNK2019 : 해결법  (0) 2014.05.16

+ Recent posts