Во-первых, я хочу поблагодарить всех людей, которые работают на этом сайте, очень полезно для разработчика. Это первый случай, когда я заблокирован в разработке за 3 дня. Я искал решения в Inte rnet, но я не нашел ничего, что решило бы эту проблему.
Итак, я разрабатываю службу, которая должна выполнять внешнюю программу на Vista / seven / xp, когда пользователь входит в систему. Некоторые характеристики этого сервиса:
Чтобы запустить внешнее приложение с графическим интерфейсом пользователя в качестве интерактивного пользователя:
после этого я запускаю приложение с этой функцией:
function RunInteractive (prog_filename: String; sessionID: Cardinal): boolean;
var hToken: THandle;
si: _STARTUPINFOA;
pi: _PROCESS_INFORMATION;
begin { {1}} ZeroMemory (@si, SizeOf (si));
si.cb: = SizeOf (si);
SI.lpDesktop: = nil;
если WTSQueryUserToken ( sessionID, hToken)
затем начинайте
, если CreateProcessAsUser (hToken, nil, PChar (prog_filename), nil, nil, False, 0, nil, PChar (ExtractFilePath (prog_filename)), si, pi)
then result: = true
else result: = false;
end
else Begin
result: = false;
End ;
CloseHandle (hToken);
end;
Этот код подходит в большинстве случаев, за исключением одного: когда я меняю пользователя. Позвольте мне объяснить это с двумя простыми пользователями (Domain \ user1 и Domain \ user2):
Если я сделаю это X раз, результат всегда будет один и тот же, очень хороший ...но если я сделаю это:
Что-то не так, но я не нахожу решения. Спасибо за ответы ...