2013-02-15 93 views
0

我正在編寫一個應用程序,它在Windows上作爲一些權限較低的用戶 運行第三方可執行文件。我用下面的Win32 API函數此:Win32 API:與其他用戶一樣運行進程的用戶模擬技術?

LogonUser(L"UserName", L"Domain", NULL, LOGON32_LOGON_SERVICE, LOGON32_PROVIDER_DEFAULT, &hToken) 

然後使用hToken我得走了過程調用

CreateProcessAsUser() 

。我啓動此可執行文件的實際程序以管理員身份運行。我的疑惑是:

  1. 如果UAC(用戶帳戶控制)已啓用。這會工作嗎?

  2. 我需要多次創建這些進程。我可以通過 將hToken保存在某處。

  3. 是否 CreateProcessAsUser()作品與 域\用戶即不同的組合。\ Administrator或\ Administrator或 域\用戶名等..?

+0

請自行試用。 LogonUser確實會爲交互式會話返回受限制的令牌,但不清楚它有多少限制。至於#2,每當你產生一個進程時,你都可以複製令牌。 – JosephH 2013-02-15 08:29:24

回答

1

的MSDN says「通常,最好使用CreateProcessWithLogonW創建具有備用憑證的過程」以下example演示如何調用此函數。

#include <windows.h> 
#include <stdio.h> 
#include <userenv.h> 

void DisplayError(LPWSTR pszAPI) 
{ 
    LPVOID lpvMessageBuffer; 

    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
     FORMAT_MESSAGE_FROM_SYSTEM, 
     NULL, GetLastError(), 
     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
     (LPWSTR)&lpvMessageBuffer, 0, NULL); 

    // 
    //... now display this string 
    // 
    wprintf(L"ERROR: API  = %s.\n", pszAPI); 
    wprintf(L"  error code = %d.\n", GetLastError()); 
    wprintf(L"  message = %s.\n", (LPWSTR)lpvMessageBuffer); 

    // 
    // Free the buffer allocated by the system 
    // 
    LocalFree(lpvMessageBuffer); 

    ExitProcess(GetLastError()); 
} 

void wmain(int argc, WCHAR *argv[]) 
{ 
    DWORD  dwSize; 
    HANDLE hToken; 
    LPVOID lpvEnv; 
    PROCESS_INFORMATION pi = {0}; 
    STARTUPINFO   si = {0}; 
    WCHAR    szUserProfile[256] = L""; 

    si.cb = sizeof(STARTUPINFO); 

    if (argc != 4) 
    { 
     wprintf(L"Usage: %s [[email protected]] [password] [cmd]", argv[0]); 
     wprintf(L"\n\n"); 
     return; 
    } 

    // 
    // TO DO: change NULL to '.' to use local account database 
    // 
    if (!LogonUser(argv[1], NULL, argv[2], LOGON32_LOGON_INTERACTIVE, 
      LOGON32_PROVIDER_DEFAULT, &hToken)) 
     DisplayError(L"LogonUser"); 

    if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE)) 
     DisplayError(L"CreateEnvironmentBlock"); 

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

    if (!GetUserProfileDirectory(hToken, szUserProfile, &dwSize)) 
     DisplayError(L"GetUserProfileDirectory"); 

    // 
    // TO DO: change NULL to '.' to use local account database 
    // 
    if (!CreateProcessWithLogonW(argv[1], NULL, argv[2], 
      LOGON_WITH_PROFILE, NULL, argv[3], 
      CREATE_UNICODE_ENVIRONMENT, lpvEnv, szUserProfile, 
      &si, &pi)) 
     DisplayError(L"CreateProcessWithLogonW"); 

    if (!DestroyEnvironmentBlock(lpvEnv)) 
     DisplayError(L"DestroyEnvironmentBlock"); 

    CloseHandle(hToken); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 
相關問題