2013-02-15 96 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); 
} 
相关问题