-
Данный код используется для запуска exe из-под сервиса в сессиях пользователей. Exe запустится под учеткой SYSTEM. А как сделать так, чтобы он запустился под юзером данной сессии? Я б например взял токен окна program manager, но не могу его найти в другой сессии...
function RunProcessInSession(FileName: String; SessionId: DWord): Boolean;
var
hToken, hNewToken: Cardinal;
si: TStartupInfo;
pi: TProcessInformation;
error: integer;
begin
Result := False;
if (SessionId = 0) and IsVistaOrLonghorn then
begin
Exit;
end;
if not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY or TOKEN_DUPLICATE, hToken) then
begin
WriteLog8('not OpenProcessToken');
Exit;
end;
if not DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, nil, SecurityIdentification,
TokenPrimary, hNewToken) then
begin
WriteLog8('not DuplicateTokenEx');
Exit;
end;
if not SetTokenInformation(hNewToken,
TTokenInformationClass(12), @SessionId, SizeOf(Cardinal)) then
Exit;
try
FillChar(si,SizeOf(si),0);
with Si do begin
cb := SizeOf(Si);
dwFlags := startf_UseShowWindow;
wShowWindow := SW_NORMAL;
lpDesktop := PChar('winsta0\default');
end;
Result := CreateProcessAsUser(hNewToken, PChar(FileName), nil, nil, nil,
false, CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pi);
finally
CloseHandle(hToken);
CloseHandle(hNewToken);
end;
end;
-
> для запуска exe из-под сервиса в сессиях пользователей
то есть как? сервис работает в своей сессии, пользователи - в своих. Какой именно пользователь интересует? Консольный, терминальный?
-
> Какой именно пользователь интересует? Консольный, терминальный?
тот под кем в данной сессии запущен рабочий стол, я так понимаю, что он может быть и консольным и терминальным и это значения не имеет, т.к. в рамках сессии он один. сорри если не так термины понял..
-
пока только есть идея запустить в сессии свой exe под system, который уже в свою очередь увидит рабочий стол, возьмет его токен и запустит программу под user. а попрямее есть варианты?
-
> istok20 © (01.07.09 14:59) [3]
> варианты?
Включить требуемую программу в автозагрузку, планировщик и т.п. Ну, или юзера попросить.
-- Regards, LVT.
|