![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Взаимодействие сервиса с клавиатурой [Win2k, WinXP]
Alexandro © (2010-09-05 01:41:00)Здравствуйте ! Пишу сервис, который должен по нажатию определенного сочетания клавиш выполнять некоторые действия. Проблема в том, что классическое решение в виде дополнительной программы, работающей в пользовательском режиме с RegisterHotKey не подходит так как срабатывание должно происходить и при отсутствии залогиненного пользователя. Насколько я понял из MSDN, SERVICE_INTERACTIVE_PROCESS не желательно использовать в Windows Vista и выше. Да и достаточно NoInteractiveServices поставить в не ноль, чтобы отключить этот флаг.
Вопрос: Как сделать так, чтобы сервис реагировал на заданное сочетание клавиш не зависимо от наличия залогиненных пользователей ?
Eraser (2010-09-06 12:02:00) [1]
stSystemUserSession: // Текущая терминальная сессия с правами системы.
begin
try
if not OpenProcessToken(GetCurrentProcess,
TOKEN_QUERY or TOKEN_DUPLICATE or TOKEN_ASSIGN_PRIMARY, hToken) then
begin
AppendLog('Error #9 @' + IntToStr(GetLastError));
Exit;
end;
if not DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, nil,
SecurityIdentification, TokenPrimary, hNewToken) then
begin
AppendLog('Error #10 @' + IntToStr(GetLastError));
Exit;
end;
if not SetTokenInformation(hNewToken,
TokenSessionId, @SessionId, SizeOf(Cardinal)) then
begin
AppendLog('Error #11 @' + IntToStr(GetLastError));
Exit;
end;
// Запуск процесса.
si.lpDesktop := 'WinSta0\Default';
if CreateProcessAsUserW(hNewToken, PWideChar(APath), nil,
nil, nil, false, 0, nil, nil, si, pi) then
begin
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end
Almaz (2010-09-06 09:51:00) [2]
> Eraser © (06.09.10 02:02) [27]
> > [26] Almaz © (06.09.10 01:41)> Насколько я понимаю -
> никак.еще как можно ;-)просто запускайте процесс в текущей
> терм. сессии, но с токеном системы и всех делов то.
Извините, наверно туплю - можно поподробнее способ запуска ?
Eraser (2010-09-06 02:02:00) [3]> [26] Almaz © (06.09.10 01:41)
> Насколько я понимаю - никак.
еще как можно ;-)
просто запускайте процесс в текущей терм. сессии, но с токеном системы и всех делов то.
Almaz (2010-09-06 01:41:00) [4]
> только вот я из этого обсуждения не понял, почему же оно
> не пригодно, в чём проблема там?
Дано: компьютер, в "экране приветствия".
Вопрос: как запустить процесс, взаимодействующий с сервисом, чтобы он обрабатывал нажатия, пока компьютер в этом состоянии ?
Насколько я понимаю - никак.
Eraser (2010-09-06 00:52:00) [5]> [15] Alexandro (05.09.10 22:00)
> Это да. Но это уже обсуждалось тут дважды и выяснилось,
> что это решение, увы, непригодно.
только вот я из этого обсуждения не понял, почему же оно не пригодно, в чём проблема там?
Almaz (2010-09-06 00:33:00) [6]
> Игорь Шевченко © (05.09.10 23:46) [23]
Если не хранить - то работа сильно затрудниться - а в ряде случаев станет вообще невозможной. Как не хранить в реестре, например, пути к 1С базам коих штук 25 на пользователя ? (аутсорсинговая компания)
Терминалку пока сделать не получается - слишком много пользователей, работающих одновременно с ресурсоемкими приложениями (более 200) - нужен слишком мощный сервер, скорее даже кластер.
Игорь Шевченко (2010-09-05 23:46:00) [7]
> Игорь, я обязательно задам этот философский вопрос клиенту
> ;)
Непременно стоит задать. Так как я честно не понимаю, почему, если что-то именно нужно уничтожать (в реестре, да еще с его параноидальной системой поддержки целостности, с точками восстановления), то почему это нельзя просто не хранить. Тогда и уничтожать нечего...
Almaz (2010-09-05 23:38:00) [8]Проблема в том, чтобы не столько удалить инфу на сервере - это крайний случай. А удалить все упоминания о сервере на локальных компах - пути к 1С базам, например. Оставить только пути к "белому" серверу. Так как взрывать сервер при каждом подозрении - несколько накладно ;) А это программа для "лайт" варианта. Когда сервер остается - так как найти его довольно сложно ;)
Rouse_ (2010-09-05 23:25:00) [9]Да и в конце концов, если ты дровину реализовал уже - так подпиши ее и всего делов. Там денех, то копейки под это дело...
Rouse_ (2010-09-05 23:20:00) [10]ЗЫ: про удаленно - это я про машину где уже стоит оборудование для селфдестракта, есесн :)
Rouse_ (2010-09-05 23:18:00) [11]Чей-то тогда задачу понять не могу, сервер есть, канал к нему есть - как так получается что канал маленький?
Ели ты по нему будешь секретных данных сохранять по несколько гектаров, то тогда да, маловат, но и при удалении с харда такая операция не на много быстрее проталкивания по инету будет, гектар с харда стереть - это не байт в NTFS поправить, типа стерт он, а реально тройным наложением по секторам в несколько проходов проходить придется, иначе как шредер изобразить-то?
Almaz (2010-09-05 22:32:00) [12]<OFFTOP>
Я вернулся во плоти :) Кто-то мой аккаунт удалил - пришлось заного регистрироваться...
</OFFTOP>
Alexandro (2010-09-05 22:20:00) [13]
> Rouse_ © (05.09.10 22:12) [16]
Не хватит интернет канала для удаленного хранилища, а если "удаленно" - это в офисе под навесным потолком, то с таким же успехом можно поставить на ресепшн ;) Кроме того, остаются следы от использования, которые тоже надо прибивать.
Rouse_ (2010-09-05 22:12:00) [14]Если с плутонием напряг - то поможет хранение данных в удаленном хранилище - сразу убиваешь две проблемы
1. данные для удаления, клиент не имеет
2. но зато они есть у тебя :)
Alexandro (2010-09-05 22:00:00) [15]
> Eraser © (05.09.10 20:18) [10]
> способ известный, в каждой терм. сесии иметь по запущеной
> копии процесса, взаимодействующего с сервисом.
Это да. Но это уже обсуждалось тут дважды и выяснилось, что это решение, увы, непригодно.
> спасёт только что-то вроде этого http://www.eraser.ru/
А ноутбуки ? А SSD ? :)
> Игорь Шевченко © (05.09.10 20:21) [12]
> может быть, ее там просто не хранить ?
Игорь, я обязательно задам этот философский вопрос клиенту ;)
> DVM © (05.09.10 20:22) [13]
> Подпись драйвера что ли требует?
Ее самую. Приходится работать в "тестовом режиме", что на мой взгляд - не кошерно.
> Rouse_ © (05.09.10 20:59) [14]
> Боюсь не поможет, помимо клавиатуры есть и терминальный режим.
Речь идет о клиентских АРМ. В сервере, как я уже сказал, стоит оборудование для физического уничтожение дисков.
> В качестве сочетания клавиш - педаль под стол, активизирующая
> небольшой заряд С4 на харде, быстро, надежно и квалификации
> программиста не нужно.
Лучше всего было бы небольшую атомную бомбу, но никак не могу достать плутоний ;)
Rouse_ (2010-09-05 20:59:00) [16]
> DVM © (05.09.10 19:40) [8]
> Драйвер тебе поможет точно. Пусть твоя служба с драйвером
> и общается.
Боюсь не поможет, помимо клавиатуры есть и терминальный режим.
ИМХ надо развить идею. Если есть затык с программной стороны - ее нужно решать аппаратно.
В качестве сочетания клавиш - педаль под стол, активизирующая небольшой заряд С4 на харде, быстро, надежно и квалификации программиста не нужно.
DVM (2010-09-05 20:22:00) [17]
> Alexandro (05.09.10 20:14) [9]
> запнулся на 64 битной семерке, будь она не неладна...
Подпись драйвера что ли требует?
Игорь Шевченко (2010-09-05 20:21:00) [18]
> по приходу нежелательных гостей уничтожить необходимую информацию
> в реестре всех пользователей компьютера.
может быть, ее там просто не хранить ?
Eraser (2010-09-05 20:20:00) [19]> [6] Alexandro (05.09.10 19:11)
> Залогиненные пользователей нет
есть - system.
Eraser (2010-09-05 20:18:00) [20]> [6] Alexandro (05.09.10 19:11)
> Ну, другого способа реализации я пока не вижу
способ известный, в каждой терм. сесии иметь по запущеной копии процесса, взаимодействующего с сервисом.
> задача из серии boss-key по приходу нежелательных гостей
> уничтожить необходимую информацию в реестре всех
спасёт только что-то вроде этого http://www.eraser.ru/