-
Здравствуйте ! Пишу сервис, который должен по нажатию определенного сочетания клавиш выполнять некоторые действия. Проблема в том, что классическое решение в виде дополнительной программы, работающей в пользовательском режиме с RegisterHotKey не подходит так как срабатывание должно происходить и при отсутствии залогиненного пользователя. Насколько я понял из MSDN, SERVICE_INTERACTIVE_PROCESS не желательно использовать в Windows Vista и выше. Да и достаточно NoInteractiveServices поставить в не ноль, чтобы отключить этот флаг.
Вопрос: Как сделать так, чтобы сервис реагировал на заданное сочетание клавиш не зависимо от наличия залогиненных пользователей ?
-
> Насколько я понял из MSDN, SERVICE_INTERACTIVE_PROCESS не > желательно использовать в Windows Vista и выше
не то чтобы не желательно, там просто этот флаг не имеет никакой силы.
> Взаимодействие сервиса с клавиатурой
задумка изначально ошибочная.
-
> Alexandro (05.09.10 01:41)
> Вопрос: Как сделать так, чтобы сервис реагировал на заданное > сочетание клавиш не зависимо от наличия залогиненных пользователей
А кто же клаву топтать будет, если юзеров не будет в наличии? Поручать обработку ввода надо клиенту, запустить который можно хоть в автозагрузке. See also: http://rsdn.ru/?forum/delphi/2187439.aspx-- Regards, LVT.
-
> Пишу сервис, который должен по нажатию определенного сочетания > клавиш выполнять некоторые действия.
Это уже не сервис.
> так как срабатывание должно происходить и при отсутствии > залогиненного пользователя
И кто же тогда будет нажимать клавиши?
-
Малъчико хочет тырить пароли...
-
> Плохиш (05.09.2010 15:22:04) [4]
Проказник.
-
> Eraser © (05.09.10 02:37) [1] > задумка изначально ошибочная.
Ну, другого способа реализации я пока не вижу - задача из серии boss-key по приходу нежелательных гостей уничтожить необходимую информацию в реестре всех пользователей компьютера. Доступ к реестрам всех пользователей возможен только с правами администратора или из сервиса. А пользователи, которые будут эту комбинацию нажимать таковыми правами не обладают.
> Leonid Troyanovsky © (05.09.10 10:01) [2] > А кто > же клаву топтать будет, если юзеров не будет в наличии?Поручать > обработку ввода надо клиенту, запустить который можнохоть > в автозагрузке.
Ситуация: компьютер загружен - висит экран выбора пользователя. Залогиненные пользователей нет, физически человек у компьютера есть. Клиент пользовательского режима не загружен еще, а обработать нажатие нужно. Соответственно нажимать комбинацию будет человек когда залогиненного пользователя нет. Процесс входа пользователя занимает время, которого может не быть.
> Anatoly Podgoretsky © (05.09.10 10:47) [3] > Это уже не сервис.
Давайте опустим слово "сервис" - задача описана в данном сообщении выше. Если есть другое решение с удовольствие выслушаю.
> Плохиш © (05.09.10 15:22) [4] > Малъчико хочет тырить пароли...
"Благородный дон телепат ?" (С) Ketmar
<OFFTOP> p.s. Мне залогинется с голубым значком, чтобы на вопрос попробовали ответить ? :))) Извините, пароля не помню своего - три года как не заходил. p.p.s. Анатолий, Вы не изменились :) </OFFTOP>
-
> Alexandro (05.09.2010 19:11:06) [6]
Ну у пользователей прав нет, а у тебя есть? Вот ты и нажмешь и кирдык. Решение в общем то неверное, такое решается через разрушение винчестера, скажем взрыв пакет и волшебная кнопка (физическая) или сервер в Зимбабве.
-
> Alexandro (05.09.10 19:11) [6]
Драйвер тебе поможет точно. Пусть твоя служба с драйвером и общается.
-
> Anatoly Podgoretsky © (05.09.10 19:33) [7] > > Alexandro (05.09.2010 19:11:06) [6]Ну у пользователей > прав нет, а у тебя есть? Вот ты и нажмешь и кирдык.
Я не могу стоять у каждого компа круглые сутки и не хочу ;)
> Решение в общем то неверное, такое решается через разрушение > винчестера, скажем взрыв пакет и волшебная кнопка (физическая) > или сервер в Зимбабве.
Заграничная терминалка там не прокатит - под такое количество пользователей с их задачами - нужен уже хороший кластер и толстый интернет-канал с обеих концов. Локальные-то сервера как раз защищены запалами. И физическая кнопка есть - она же кстати, стартует по сети сообщение, которое тоже ловит сервис и делает тоже самое. Удаление же данных с компьютера пользователя все равно делать придется - пусть даже это будут записи о терминальном доступе.
> DVM © (05.09.10 19:40) [8] > > Alexandro (05.09.10 19:11) [6]Драйвер тебе поможет точно. > Пусть твоя служба с драйвером и общается.
Да написал уже драйвер-фильтр - запнулся на 64 битной семерке, будь она не неладна... Думал есть другое решение, но похоже, что нет.
-
> [6] Alexandro (05.09.10 19:11)
> Ну, другого способа реализации я пока не вижу
способ известный, в каждой терм. сесии иметь по запущеной копии процесса, взаимодействующего с сервисом. > задача из серии boss-key по приходу нежелательных гостей > уничтожить необходимую информацию в реестре всех
спасёт только что-то вроде этого http://www.eraser.ru/
-
> [6] Alexandro (05.09.10 19:11)
> Залогиненные пользователей нет
есть - system.
-
> по приходу нежелательных гостей уничтожить необходимую информацию > в реестре всех пользователей компьютера.
может быть, ее там просто не хранить ?
-
> Alexandro (05.09.10 20:14) [9]
> запнулся на 64 битной семерке, будь она не неладна...
Подпись драйвера что ли требует?
-
> DVM © (05.09.10 19:40) [8] > Драйвер тебе поможет точно. Пусть твоя служба с драйвером > и общается.
Боюсь не поможет, помимо клавиатуры есть и терминальный режим. ИМХ надо развить идею. Если есть затык с программной стороны - ее нужно решать аппаратно. В качестве сочетания клавиш - педаль под стол, активизирующая небольшой заряд С4 на харде, быстро, надежно и квалификации программиста не нужно.
-
> 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 на харде, быстро, надежно и квалификации > программиста не нужно.
Лучше всего было бы небольшую атомную бомбу, но никак не могу достать плутоний ;)
-
Если с плутонием напряг - то поможет хранение данных в удаленном хранилище - сразу убиваешь две проблемы 1. данные для удаления, клиент не имеет 2. но зато они есть у тебя :)
-
> Rouse_ © (05.09.10 22:12) [16]
Не хватит интернет канала для удаленного хранилища, а если "удаленно" - это в офисе под навесным потолком, то с таким же успехом можно поставить на ресепшн ;) Кроме того, остаются следы от использования, которые тоже надо прибивать.
-
<OFFTOP> Я вернулся во плоти :) Кто-то мой аккаунт удалил - пришлось заного регистрироваться... </OFFTOP>
-
Чей-то тогда задачу понять не могу, сервер есть, канал к нему есть - как так получается что канал маленький? Ели ты по нему будешь секретных данных сохранять по несколько гектаров, то тогда да, маловат, но и при удалении с харда такая операция не на много быстрее проталкивания по инету будет, гектар с харда стереть - это не байт в NTFS поправить, типа стерт он, а реально тройным наложением по секторам в несколько проходов проходить придется, иначе как шредер изобразить-то?
-
ЗЫ: про удаленно - это я про машину где уже стоит оборудование для селфдестракта, есесн :)
-
Да и в конце концов, если ты дровину реализовал уже - так подпиши ее и всего делов. Там денех, то копейки под это дело...
-
Проблема в том, чтобы не столько удалить инфу на сервере - это крайний случай. А удалить все упоминания о сервере на локальных компах - пути к 1С базам, например. Оставить только пути к "белому" серверу. Так как взрывать сервер при каждом подозрении - несколько накладно ;) А это программа для "лайт" варианта. Когда сервер остается - так как найти его довольно сложно ;)
-
> Игорь, я обязательно задам этот философский вопрос клиенту > ;)
Непременно стоит задать. Так как я честно не понимаю, почему, если что-то именно нужно уничтожать (в реестре, да еще с его параноидальной системой поддержки целостности, с точками восстановления), то почему это нельзя просто не хранить. Тогда и уничтожать нечего...
-
> Игорь Шевченко © (05.09.10 23:46) [23]
Если не хранить - то работа сильно затрудниться - а в ряде случаев станет вообще невозможной. Как не хранить в реестре, например, пути к 1С базам коих штук 25 на пользователя ? (аутсорсинговая компания) Терминалку пока сделать не получается - слишком много пользователей, работающих одновременно с ресурсоемкими приложениями (более 200) - нужен слишком мощный сервер, скорее даже кластер.
-
> [15] Alexandro (05.09.10 22:00)
> Это да. Но это уже обсуждалось тут дважды и выяснилось, > что это решение, увы, непригодно.
только вот я из этого обсуждения не понял, почему же оно не пригодно, в чём проблема там?
-
> только вот я из этого обсуждения не понял, почему же оно > не пригодно, в чём проблема там?
Дано: компьютер, в "экране приветствия". Вопрос: как запустить процесс, взаимодействующий с сервисом, чтобы он обрабатывал нажатия, пока компьютер в этом состоянии ?
Насколько я понимаю - никак.
-
> [26] Almaz © (06.09.10 01:41)
> Насколько я понимаю - никак.
еще как можно ;-) просто запускайте процесс в текущей терм. сессии, но с токеном системы и всех делов то.
-
> Eraser © (06.09.10 02:02) [27] > > [26] Almaz © (06.09.10 01:41)> Насколько я понимаю - > никак.еще как можно ;-)просто запускайте процесс в текущей > терм. сессии, но с токеном системы и всех делов то.
Извините, наверно туплю - можно поподробнее способ запуска ?
-
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
|