9

サンプルコードを探しています:

サービスが CreateProcessAsUser() を呼び出す場合、セッション 0 ではなく、ユーザーのセッションでプロセスを実行したい

これまでのところ、作成されたプロセスはセッション 0 のサービスのようにのみ実行されています

4

2 に答える 2

5

これは、サービスからコンソール アプリを起動する一部の古いコードから削除されました。NT4 で動作しましたが、最新バージョンの Windows でテストしていないため、NT4 での動作を保証することはできません。

編集:いいえ、そのままでは機能しません。デスクトップの作成、SID の設定などを行うには、ここにあるコードを追加する必要があります。

    if (!LogonUser(userId,
                   domain,
                   password,
                   LOGON32_LOGON_INTERACTIVE,
                   LOGON32_PROVIDER_DEFAULT,
                   &hUserToken))
    {
        return GetLastError();
    }

    if (!ImpersonateLoggedOnUser(hUserToken))
    {
        DWORD rc = GetLastError();
        CloseHandle(hUserToken);
        return rc;
    }

    STARTUPINFO             si;
    PROCESS_INFORMATION pi;

    memset(&si, 0, sizeof(si));
    memset(&pi, 0, sizeof(pi));

    si.cb = sizeof(si);

    rc = CreateProcessAsUser(hUserToken,                // user token
                           0,                           // app name
                           "foo.exe",                   // command line
                           0,                           // process attributes
                           0,                           // thread attributes
                           FALSE,                       // don't inherit handles
                           DETACHED_PROCESS,            // flags
                           0,                           // environment block
                           0,                           // current dir
                           &si,                         // startup info
                           &pi);                        // process info gets put here


    if (!rc)
    {
        DWORD rc = GetLastError();
        RevertToSelf();
        CloseHandle(hUserToken);
        return rc;
    }

    RevertToSelf();
    CloseHandle(hUserToken);

    return 0;
于 2011-09-02T20:14:59.860 に答える