2014-12-03 5 views
1

У меня есть тестовый код:CreateProcessWithLogonW Ошибка 1783: Заглушка получила плохие данные

int main(int argc, char *argv[]) 
{ 
    setlocale(LC_ALL, ""); 

    std::string user; 
    std::string pass; 
    std::cout << "user: "; 
    getline(std::cin, user); 
    std::cout << "\npass: "; 
    getline(std::cin, pass); 
    std::cout << std::endl; 

    std::wstring suser = std::wstring(user.begin(), user.end()); 
    LPCWSTR su = suser.c_str(); 
    std::wstring spass = std::wstring(pass.begin(), pass.end()); 
    LPCWSTR sp = spass.c_str(); 

    DWORD  dwSize = 0; 
    HANDLE hToken ; 
    LPVOID lpvEnv = 0; 
    PROCESS_INFORMATION pi = {0}; 
    STARTUPINFO   si = {0}; 
    WCHAR    szUserProfile[256] = L""; 

    si.cb = sizeof(STARTUPINFO); 

    if (!LogonUser(su, L".", sp, LOGON32_LOGON_INTERACTIVE, 
      LOGON32_PROVIDER_DEFAULT, &hToken)) 
     qDebug() << "LogonUser"; 

    if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE)) 
     qDebug() << "CreateEnvironmentBlock"; 

    dwSize = sizeof(szUserProfile)/sizeof(WCHAR); 

    if (!GetUserProfileDirectory(hToken, szUserProfile, &dwSize)) 
     qDebug() << "GetUserProfileDirectory"; 

    WCHAR app[] = L"\"C:\\Program Files (x86)\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe\" \"C:\\Users\\UD\\Desktop\\insect immunity.pdf\""; 
    if (!CreateProcessWithLogonW(su, L".", sp, 
      LOGON_WITH_PROFILE, NULL, app, 
      CREATE_UNICODE_ENVIRONMENT, lpvEnv, szUserProfile, 
      &si, &pi)) { 
      LPVOID lpMsgBuf; 
      LPVOID lpDisplayBuf; 
      DWORD dw = GetLastError(); 

      FormatMessage(
       FORMAT_MESSAGE_ALLOCATE_BUFFER | 
       FORMAT_MESSAGE_FROM_SYSTEM | 
       FORMAT_MESSAGE_IGNORE_INSERTS, 
       NULL, 
       dw, 
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
       (LPTSTR) &lpMsgBuf, 
       0, NULL); 

      // Display the error message and exit the process 

      lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
       (lstrlen((LPCTSTR)lpMsgBuf) + 40) * sizeof(TCHAR)); 
      StringCchPrintf((LPTSTR)lpDisplayBuf, 
       LocalSize(lpDisplayBuf)/sizeof(TCHAR), 
       TEXT("failed with error %d: %s"), dw, lpMsgBuf); 
      qDebug() << QString::fromWCharArray((LPTSTR)lpDisplayBuf); 
    } 

    if (!DestroyEnvironmentBlock(lpvEnv)) 
     qDebug() << "DestroyEnvironmentBlock"; 

    CloseHandle(hToken); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 

    system("pause"); 
    return 0; 
} 

На компьютере моего друга он работает всегда хорошо. На моем ПК это работает иногда! Лишь иногда, чаще всего, он производит ошибку 1783. Я попытался удалить некоторые службы на своем ПК, но это не помогло. Мне нужен этот код для многих других ПК, поэтому мне нужно понять, почему эта ошибка появляется и как ее исправить.

+0

Почему вы используете 'LogonUser()' и 'CreateProcessWithLogonW()' вместе? Используя 'LogonUser()', у вас уже есть токен пользователя, поэтому вместо этого вы должны использовать 'CreateProcessAsUser()'. –

+0

Его MS examaple, а не основной – UndeadDragon

+0

Привет, Я столкнулся с этой же проблемой. Если вы решили эту проблему, как вы решили? –

ответ

0

Помогает установить в NULL состояния происходит в CreateProcessWithLogonW/

0

обходной путь, который работал для меня:

Раньше я звала это из гостевой учетной записи для запуска процесса в системе account.I была поп приложений (если необходимо), и использовать его в функции CreateProcessWithLogonW, и он потерпел неудачу с кодом ошибки 1783.

Решение: теперь, получив код ошибки, я всплываю диалог UAC, в котором пользователь должен ввести учетные данные (вместо обработки приложения t он верительные грамоты), и после этого он работает.

Похоже, проблема разрешения. В любом случае, это сработало для моего прецедента и может помочь, если кто-то тоже по одной линии.