VCPP6 Определить имя текущего пользователя, запуск от его имени.

Тема в разделе "WASM.WIN32", создана пользователем GHook, 28 май 2010.

  1. GHook

    GHook New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    9
    VCPP6 SE7EN

    Подскажите как можно определить имя текущего интерактивного пользователя?
    Дело в том что програ отрабатывает с правами SYSTEM во время логона пользователя, в XP можно было определить имя через реестр:
    Код (Text):
    1. HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName
    А как определить имя интерактивного пользователя и запустить от его имени процесс средствами WinAPI?

    Ткните пальцем, куда капать?
     
  2. ice9

    ice9 New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2009
    Сообщения:
    14
    Скажи точнее, тебе обязательно нужно знать имя пользователя, или ты просто хочешь запустить процесс от его имени?
     
  3. ice9

    ice9 New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2009
    Сообщения:
    14
    Последовательность функций сделает то что тебе нужно:
    WTSQueryUserToken
    DuplicateTokenEx
    CreateEnvironmentBlock
    CreateProcessAsUser
     
  4. GHook

    GHook New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    9
    2ice9
    Спасибо огромное, вот что откoпал в инете:

    Оригинал http://chabster.blogspot.com/2008_01_01_archive.html
    Код (Text):
    1. #include <WtsApi32.h>
    2. #pragma comment(lib, "WtsApi32.lib")
    3. #include <Userenv.h>
    4. #pragma comment(lib, "Userenv.lib")
    5. HRESULT BeginInteractiveUserProcess(LPCTSTR ProcessName, LPTSTR CommandLine, LPCTSTR CurrentDirectory)
    6. {
    7.     BOOL bRet;
    8.     HRESULT hr;
    9.     HANDLE processToken = NULL;
    10.     TOKEN_PRIVILEGES oldTokenPrivileges = { 0 };
    11.     HANDLE impersonationToken = NULL;
    12.     HANDLE userToken = NULL;
    13.     LPVOID pEnvironment = NULL;
    14.     PROCESS_INFORMATION processInformation = { 0 };
    15.  
    16.     __try {
    17.         bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &processToken);
    18.         if (!bRet) {
    19.             hr = GetLastError();
    20.             return hr;
    21.         }
    22.        
    23.         // This step might not be necessary because SeTcbPrivilege is enabled by default for Local System
    24.         LUID luid;
    25.         bRet = LookupPrivilegeValue(NULL, _T("SeTcbPrivilege"), &luid);
    26.         if (!bRet) {
    27.             hr = GetLastError();
    28.             return hr;
    29.         }
    30.        
    31.         TOKEN_PRIVILEGES adjTokenPrivileges = { 0 };
    32.         adjTokenPrivileges.PrivilegeCount = 1;
    33.         adjTokenPrivileges.Privileges[0].Luid = luid;
    34.         adjTokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    35.        
    36.         DWORD dwOldTPLen;
    37.         bRet = AdjustTokenPrivileges(processToken, FALSE, &adjTokenPrivileges, sizeof(TOKEN_PRIVILEGES), &oldTokenPrivileges, &dwOldTPLen);
    38.         if (bRet) {
    39.             hr = GetLastError();
    40.             if (hr == ERROR_SUCCESS);
    41.             else if (hr == ERROR_NOT_ALL_ASSIGNED) {
    42.                 // Enabled by default
    43.             }
    44.         }
    45.         else {
    46.             hr = GetLastError();
    47.             return hr;
    48.         }
    49.  
    50.         DWORD conSessId = WTSGetActiveConsoleSessionId();
    51.         if (conSessId == 0xFFFFFFFF) {
    52.             // There is no session attached to the console
    53.             return ERROR_SUCCESS;
    54.         }
    55.        
    56.         bRet = WTSQueryUserToken(conSessId, &impersonationToken);
    57.         if (!bRet) {
    58.             hr = GetLastError();
    59.             return hr;
    60.         }
    61.        
    62.         bRet = DuplicateTokenEx(impersonationToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &userToken);
    63.         if (!bRet) {
    64.             hr = GetLastError();
    65.             return hr;
    66.         }
    67.        
    68.         STARTUPINFO si = { 0 };
    69.         si.cb = sizeof(STARTUPINFO);
    70.         si.lpDesktop = _T("winsta0\\default");
    71.        
    72.         bRet = CreateEnvironmentBlock(&pEnvironment, userToken, TRUE);
    73.         if (!bRet) {
    74.             hr = GetLastError();
    75.             return hr;
    76.         }
    77.        
    78.         bRet = CreateProcessAsUserW(userToken, ProcessName, CommandLine, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, pEnvironment, CurrentDirectory, &si, &processInformation);
    79.         if (!bRet) {
    80.             hr = GetLastError();
    81.             return hr;
    82.         }
    83.     }
    84.     __finally {
    85.         if (processInformation.hThread) {
    86.             CloseHandle(processInformation.hThread);
    87.         }
    88.         if (processInformation.hProcess) {
    89.             CloseHandle(processInformation.hProcess);
    90.         }
    91.         if (pEnvironment) {
    92.             bRet = DestroyEnvironmentBlock(pEnvironment);
    93.         }
    94.         if (userToken) {
    95.             CloseHandle(userToken);
    96.         }
    97.         if (impersonationToken) {
    98.             CloseHandle(impersonationToken);
    99.         }
    100.         if (processToken) {
    101.             bRet = AdjustTokenPrivileges(processToken, FALSE, &oldTokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
    102.             CloseHandle(processToken);
    103.         }
    104.     }
    105.     return 0;
    106. }