2014-01-07 11 views
0

서비스가 있으며이 서비스의 현재 사용자 권한으로 GUI 응용 프로그램을 실행해야합니다. 이것은 내 코드이며 1305 CreateProcessAsUser 함수로 항상 GetLastError를 반환합니다. 어떻게 해결할 수 있을지 또는 제 코드가 맞지 않을 수 있으며 조언이 유용 ​​할 수 있습니다. 고마워.CreateProcessAsUser - 오류 1305

void ConnectionManager::LaunchDialer() 
{ 
    HANDLE currentToken; 
    HANDLE primaryToken; 

    int dwSessionId = 0; 
    PHANDLE hUserToken = 0; 
    PHANDLE hTokenDup = 0; 

    PWTS_SESSION_INFO pSessionInfo = 0; 
    DWORD dwCount = 0; 

    // Get the list of all terminal sessions 
    WTSEnumerateSessions (WTS_CURRENT_SERVER_HANDLE, 0, 1, 
      &pSessionInfo, &dwCount); 

    int dataSize = sizeof (WTS_SESSION_INFO); 

    // look over obtained list in search of the active session 
    for (DWORD i = 0; i < dwCount; ++i) 
    { 
     WTS_SESSION_INFO si = pSessionInfo [i]; 
     if (WTSActive == si.State) 
     { 
      // If the current session is active – store its ID 
      dwSessionId = si.SessionId; 
      break; 
     } 
    } 

    WTSFreeMemory (pSessionInfo); 

    // Get token of the logged in user by the active session ID 
    BOOL bRet = WTSQueryUserToken (dwSessionId, &currentToken); 
    if (!bRet) 
    { 
     ModemDetectorService::instance()->logMessage (QString ("WTSQueryUserToken: %1") 
       .arg (GetLastError())); 
     return; 
    } 

    bRet = DuplicateTokenEx (currentToken, 
      TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, 
      0, 
      SecurityImpersonation, 
      TokenPrimary, 
      &primaryToken); 
    if (!bRet) 
    { 
     ModemDetectorService::instance()->logMessage (QString ("DuplicateTokenEx: %1") 
        .arg (GetLastError())); 
     return; 
    } 

    if (!primaryToken) 
    { 
     ModemDetectorService::instance()->logMessage ("Invalid user token"); 
     return; 
    } 

    STARTUPINFO StartupInfo; 
    PROCESS_INFORMATION processInfo; 
    ZeroMemory(&StartupInfo, sizeof(STARTUPINFO)); 
    StartupInfo.cb= sizeof(STARTUPINFO); 
    StartupInfo.lpDesktop = TEXT("winsta0\\default"); 

    SECURITY_ATTRIBUTES Security1; 
    SECURITY_ATTRIBUTES Security2; 

    QSettings settings ("HKEY_LOCAL_MACHINE\\Software\\Olive\\OliveDialer", 
       QSettings::NativeFormat); 
    const QString path = QDir::toNativeSeparators (settings.value ("InstallationDirectory").toString()); 
    QByteArray command = ("\"" + path + "\\" + 
      ApplicationInfo::Olive::ShortApplicationName + ".exe" + "\"").toUtf8(); 

    void* lpEnvironment = NULL; 
    // Get all necessary environment variables of logged in user 
    // to pass them to the process 
    BOOL resultEnv = CreateEnvironmentBlock (&lpEnvironment, 
      primaryToken, 
      FALSE); 
    if (!resultEnv) 
    { 
     long nError = GetLastError(); 
     ModemDetectorService::instance()->logMessage (QString ("CreateEnvironmentBlock failed with: %1") 
       .arg (nError)); 
    } 

    // Start the process on behalf of the current user 
    BOOL result = CreateProcessAsUser (primaryToken, 0, 
      (LPSTR)(command.data()), 
      &Security1, 
      &Security2, 
      FALSE, 
      NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, 
      lpEnvironment, 
      NULL, 
      &StartupInfo, 
      &processInfo); 
    if (!result) 
    { 
     DWORD errorCode = GetLastError(); 
     ModemDetectorService::instance()->logMessage (QString ("Application start failed: %1 %2") 
       .arg (errorCode) 
       .arg (command.data())); 
    } 
    else 
     ModemDetectorService::instance()->logMessage ("Application started successfully"); 
    DestroyEnvironmentBlock (lpEnvironment); 
    CloseHandle (primaryToken); 
} 
+1

실패를 감지 한 직후에 GetLastError를 호출해야합니다. 다른 기능 (예 : DestroyEnvironmentBlock)은 다른 상태 값으로 변경할 수 있습니다. –

+0

코드를 통해 디버그하고 오류 1305를 반환하는 정확한 함수를 찾으십시오. –

+0

GetLastError를 CreateProcessAsUser 함수로 옮기고 여전히 1305를 반환합니다. – Magog

답변

2

ERROR_UNKNOWN_REVISION이다와 사용자 프로파일 ("개정 수준을 알 수없는")를,로드 보안 개체. 실제로 초기화 된 적이없는 두 개의 SECURITY_ATTRIBUTES 구조체 (Security1Security2)를 전달 중입니다.

&Security1&Security2 대신 NULL을 전달하거나 구조를 제대로 초기화해야합니다.

+0

괜찮습니다. 고맙습니다. – Magog

0

C와 같은 뭔가 lpCurrentDirectory을 설정하십시오 : \ WINDOWS

또는 일반적으로 의미 오류 1305 LoadUserProfile