2013-01-22 1 views
1

Donc, je voudrais exécuter un processus du service en utilisant ces fonctions ci-dessous.WTSQueryUserToken avec FALSE retourné

  • CreateProcessAsUserW
  • WTSGetActiveConsoleSessionId
  • WTSQueryUserToken

Mais il semble que je ne peux pas tirer CreateProcessAsUserW() depuis WTSQueryUserToken se retourne FALSE et ERROR_PRIVILEGE_NOT_HELD est mise sur écoute.

J'ai trouvé quelques fils sur Internet, mais ces solutions sont avant Windows 7 et Server 2008.

Mon code va ici ....

STARTUPINFOW  si = {0,}; 
PROCESS_INFORMATION pi = {0,}; 

HANDLE hTokenNew = nullptr; 
HANDLE hTokenDup = nullptr; 

HMODULE hModKernel32 = LoadLibrary(TEXT("kernel32.dll")); 
HMODULE hModWtsapi32 = LoadLibrary(TEXT("Wtsapi32.dll")); 
HMODULE hModUserEnv  = LoadLibrary(TEXT("Userenv.dll")); 

auto lpfnWTSGetActiveConsoleSessionId = reinterpret_cast<DWORD(*)(void)>(GetProcAddress(hModKernel32, "WTSGetActiveConsoleSessionId")); 
auto lpfnWTSQueryUserToken    = reinterpret_cast<bool(*)(ULONG, PHANDLE)>(GetProcAddress(hModWtsapi32, "WTSQueryUserToken")); 
auto lpfnCreateEnvironmentBlock   = reinterpret_cast<bool(*)(LPVOID*, HANDLE, bool)>(GetProcAddress(hModUserEnv, "CreateEnvironmentBlock")); 
auto lpfnDestroyEnvironmentBlock  = reinterpret_cast<bool(*)(LPVOID)>(GetProcAddress(hModUserEnv, "DestroyEnvironmentBlock")); 

LPVOID pEnvironment = nullptr; 
DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS; 

DWORD dwSessionId = lpfnWTSGetActiveConsoleSessionId(); 

// FALSE Returned. 
lpfnWTSQueryUserToken(dwSessionId, &hTokenNew); 

// 1314 : ERROR_PRIVILEGE_NOT_HELD 
DWORD d = GetLastError(); 

// Since WTSQueryUserToken gives me FALSE and no token, the code below is meaningless. 
DuplicateTokenEx(hTokenNew, MAXIMUM_ALLOWED, nullptr, SecurityIdentification, TokenPrimary, &hTokenDup); 

si.cb   = sizeof(STARTUPINFO); 
si.lpReserved = nullptr; 
si.lpReserved2 = nullptr; 
si.cbReserved2 = 0; 
si.dwFlags  = STARTF_USESHOWWINDOW; 
si.wShowWindow = SW_SHOW; 
si.lpDesktop = TEXT("winsta0\\default"); 

if(lpfnCreateEnvironmentBlock != nullptr) 
{ 
    if (lpfnCreateEnvironmentBlock(&pEnvironment, hTokenDup, false)) 
    { 
     dwCreationFlag |= CREATE_UNICODE_ENVIRONMENT; 
    } 
    else 
    { 
     pEnvironment = nullptr; 
    } 
} 

if (!CreateProcessAsUserW(
     hTokenDup, 
     nullptr, 
     TEXT("D:\\MyProgram.exe"), 
     nullptr, 
     nullptr, 
     false, 
     dwCreationFlag, 
     pEnvironment, 
     nullptr, 
     &si, 
     &pi)) 
{ 
    return 0; 
} 

if(hTokenDup) 
{ 
    CloseHandle(hTokenDup); 
} 

if (hTokenNew) 
{ 
    CloseHandle(hTokenNew); 
} 

if (pi.hProcess) 
{ 
    CloseHandle(pi.hProcess); 
} 

if (pi.hThread) 
{ 
    CloseHandle(pi.hThread); 
} 

if (nullptr != pEnvironment) 
{ 
    lpfnDestroyEnvironmentBlock(pEnvironment); 
} 

Tout conseil sera vraiment apprécié. Merci d'avance.

Répondre

1

Selon MSDN: "ERROR_PRIVILEGE_NOT_HELD - L'appelant n'a pas le privilège SE_TCB_NAME."

Avez-vous vérifié si votre processus a le privilège SE_TCB_NAME?

+0

Je vais vérifier à nouveau quand je vais à mon ordinateur portable au travail tmrw. Merci beaucoup. –

+3

Si ce n'est pas le cas, exécutez le service dans un compte utilisateur qui fonctionne, comme 'LocalSystem', ou utilisez' AdjustTokenPrivileges() 'pour l'activer manuellement dans votre code. –

+0

M'a donné un bon indice pour le comprendre. Problème résolu. Si quelqu'un demande, je posterai le code complet ici. –

Questions connexes