답변

2

이 세션 0에 서비스처럼 실행하는 서비스에서 콘솔 응용 프로그램을 출시 옛날 코드에서 제거되었다. 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

새 바탕 화면을 만들 필요가 없습니다. 사용자의 상호 작용하는'WinSta0 \ Default' 데스크탑 (Microsoft의 예제에서 볼 수 있듯이)과 같이'STARTUPINFO' 구조체에 기존 데스크탑을 지정합니다. 그리고 당신은 SID를 가지고 주위를 망칠 필요가 없습니다. 서비스의'CreateProcessAsUser()'는 그것들 없이는 정상적으로 작동 할 수 있습니다. 나는 아무 문제없이 몇 년 동안 서비스에서 그것을 사용 해왔고, 나는 그것을위한 SID를 조작하지 않는다. 반면에'LogonUser()'또는'ImpersonateLoggedOnUser()'를 사용하지 않고 대신'WTSQueryUserToken()'과'DuplicateTokenEx()'를 사용합니다. –

+1

또한'CreateProcessAsUser()'를 호출하기 전에'CreateEnvironmentBlock()'을 호출해야합니다. –

+0

@RemyLebeau 나는 (어느 정도) 동의한다. 아마도 새로운 대답을 써야 할 것입니다. 3 년 전의 답변으로 승낙도없고 투표도 없으므로 위아래로 지금 당장 더 많은 시간을 할애하기를 꺼립니다. –