回答

2

此運行像一個服務從一些舊代碼,從服務啓動控制檯應用程序剝離。它在NT4下工作,但我沒有用現代版本的Windows測試它,所以不能保證它能像在NT4上那樣工作。

編輯:不,這不會按原樣工作。您需要添加代碼here以創建桌面,設置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; 
+1

您不需要創建新的桌面。您可以在'STARTUPINFO'結構中指定一個現有桌面,例如用戶的交互式'WinSta0 \ Default'桌面(如Microsoft示例所示)。而且你也不需要混淆SID。服務中的CreateProcessAsUser()可以在沒有它們的情況下正常工作。我一直在服務中使用它多年,沒有任何問題,我也沒有爲它操縱SID。另一方面,我不使用LogonUser()或ImpersonateLoggedOnUser(),而是使用WTSQueryUserToken()和DuplicateTokenEx()。 –

+1

另外,在調用'CreateProcessAsUser()'之前,你應該調用'CreateEnvironmentBlock()'。 –

+0

@RemyLebeau我同意(有點)。也許你應該寫一個新的答案。這是一個三歲的答案,沒有接受,也沒有投票,所以我不願意花更多的時間在現在。 –

相關問題