воскресенье, 21 марта 2010 г.

Как запустить процесс с правами текущего пользователя из сервиса

Если вы пишете сервис для Windows, то он будет выполняться с системными привелегиями. Но что если необходимо запускать из него обычные программы без повышенных привелегий?

Вот этот код решает такую задачу:

//get Active UI session
ulSessionId = WTSGetActiveConsoleSessionId();

WTSQueryUserToken (ulSessionId, &hTokenthis);

DuplicateTokenEx(hTokenthis, TOKEN_ALL_ACCESS|TOKEN_EXECUTE,
NULL, SecurityIdentification, TokenPrimary, &hToken);

// Start the child process.

if ( CreateEnvironmentBlock(&lpEnvironment, hToken, TRUE) )
{
char * path = "C:\\program.exe --run";
// Start the child process.
if( !CreateProcessAsUser( hToken,
NULL,
path, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
NORMAL_PRIORITY_CLASS |CREATE_UNICODE_ENVIRONMENT,
lpEnvironment, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
OutputDebugString( "CreateProcess failed" );
}
}

Комментариев нет:

Отправить комментарий