2014-02-08 1 views
0

CreateProcessASUser()을 사용하여 application.exe를 실행할 수있는 Windows 서비스를 작성했습니다.로컬 프로필에서 서비스를 실행하여 Windows 서비스에서 사용자 appdata 경로를 얻는 방법

HANDLE hTokenDup = NULL; 
DuplicateTokenEx(auToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenDup); 
CreateProcessAsUserW(hTokenDup, NULL, cmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); 

이 내 응용 프로그램 소스 대구입니다 :

static bool first = true; 

    TCHAR* getAppDataFolder() { 
     TCHAR* pathTchar = (TCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (_MAX_PATH + 1) * sizeof(TCHAR)); 
     BOOL getAppdata = SHGetSpecialFolderPath(0, pathTchar, CSIDL_APPDATA, false); 


     return pathTchar; 
    } 

    BOOL WriteFileFromWCHAR(HANDLE hFile, 
LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, 
LPDWORD lpNumberOfBytesWritten) 
    { 
     BYTE* arr = new BYTE[nNumberOfBytesToWrite]; 
     TCHAR* buff = (TCHAR*)lpBuffer; 
     for(int i = 0; i < nNumberOfBytesToWrite; i++) { 
      arr[i] = (BYTE)buff[i]; 
     } 
     return WriteFile(hFile , arr , nNumberOfBytesToWrite , lpNumberOfBytesWritten, NULL); 
    } 

    int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmd, int show) 
    { 
     int argc = 0; 
     _TCHAR** argv; 

     LPTSTR cmdLine = GetCommandLine(); 
     argv = CommandLineToArgvW(cmdLine, &argc); 



     if(argc == 2) { 

      TCHAR* path = getAppDataFolder(); 


      HANDLE hFile = CreateFile(argv[1] , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , 0 , 0); 
      if (hFile != INVALID_HANDLE_VALUE) 
      { 

       DWORD lpNumberOfBytesWritten; 

       WriteFileFromWCHAR(hFile, path, lstrlen(path), &lpNumberOfBytesWritten); 
      } 
      else { 

      } 




     } 
     return 0; 
    } 

나는이 주소를 작성해야합니다 (예 : "C : \ 사용자 \ CurrentUser \의 AppData \ 로밍") 파일이다. 하지만 Windows 서비스에서 appdata 경로를 검색 할 때 "C : \ Windows \ system32 \ config \ systemprofile \ AppData \ Roming"경로를 따라갑니다. 내 서비스에서 응용 프로그램을 실행하고 예상 경로를 파일에 쓸 수있게하려면 어떻게 C++로 코딩해야합니까?

답변

1

사용자 별 설정에 종속 된 API를 사용하려면 먼저 사용자의 토큰을 가지고 있어야합니다. 또한 CreateProcessAsUser()을 호출하기 전에 LoadUserProfile() (동일한 토큰 사용)으로 전화해야합니다.