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++로 코딩해야합니까?