0

を使用して application.exe を実行できる Windows サービスを作成しましたCreateProcessASUser()

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:\Users\CurrentUser\AppData\Roaming") をファイルに書き込む必要があります。しかし、Windows サービスから appdata パスを取得すると、パス "C:\Windows\system32\config\systemprofile\AppData\Roming" を取得します。サービスがアプリケーションを実行し、予想されるパスをファイルに書き込むことができるようにするには、C++ でコーディングするにはどうすればよいですか?

4

1 に答える 1

1

ユーザー固有の設定に依存する API を使用する前に、ユーザーを偽装する必要があります (既にユーザーのトークンを持っています)。LoadUserProfile()また、 を呼び出す前に (同じトークンを使用して)呼び出す必要がありますCreateProcessAsUser()

于 2014-02-08T21:23:24.380 に答える