1

指定したアドレスからファイルをダウンロードして createprocessasuser関数で実行するWindowsサービスを作成しましたが、出力をファイルにリダイレクトしようとするまではすべてうまくいきました

何も実行されていないプログラムの新しいウィンドウが表示されますが、ログファイルにも何もありません..

ここに私のコードがあります:

void exeAfterDownload(wchar_t *file){

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;

HANDLE h = CreateFile(_T("c:\\temp\\out.log"),
    FILE_APPEND_DATA,
    FILE_SHARE_WRITE | FILE_SHARE_READ,
    &sa,
    OPEN_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,
    NULL);

BOOL ret = FALSE;
DWORD flags = CREATE_NO_WINDOW;

ZeroMemory(&pi2, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si2, sizeof(STARTUPINFO));
si2.cb = sizeof(STARTUPINFO);
si2.dwFlags |= STARTF_USESTDHANDLES;
si2.hStdInput = NULL;
si2.hStdError = h;
si2.hStdOutput = h;

sessionId2 = WTSGetActiveConsoleSessionId();

if (WTSQueryUserToken(sessionId2, &dummy2)) {
    if (!DuplicateTokenEx(dummy2, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenPrimary, &token2)) {
        CloseHandle(dummy2);
    }
    CloseHandle(dummy2);

    if (!CreateProcessAsUser(token2, L"c:\\temp\\run.exe", NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si2, &pi2)) {  // The "new console" is necessary. Otherwise the process can hang our main process

        CloseHandle(token2);
    }
    CloseHandle(token2);
}
else{

}

}

リダイレクトなしで実行すると正常に動作し、このコードを別のプログラムで実行して使用createprocessすると、リダイレクトでも正常に動作しますが、createprocessasuser( win サービスから実行されるため) を使用するとログファイルには何もありません. 何か案は?

4

1 に答える 1

1

CreateProcessAsUser をFALSEからTRUEに設定する必要があります。inheritHandles フラグです。

于 2015-09-13T13:36:14.337 に答える