Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.28;
Скачать: CL | DM;

Вниз

Взаимодействие сервиса с клавиатурой   Найти похожие ветки 

 
Alexandro   (2010-09-05 01:41) [0]

Здравствуйте ! Пишу сервис, который должен по нажатию определенного сочетания клавиш выполнять некоторые действия. Проблема в том, что классическое решение в виде дополнительной программы, работающей в пользовательском режиме с RegisterHotKey не подходит так как срабатывание должно происходить и при отсутствии залогиненного пользователя. Насколько я понял из MSDN, SERVICE_INTERACTIVE_PROCESS не желательно использовать в Windows Vista и выше. Да и достаточно NoInteractiveServices поставить в не ноль, чтобы отключить этот флаг.

Вопрос: Как сделать так, чтобы сервис реагировал на заданное сочетание клавиш не зависимо от наличия залогиненных пользователей ?


 
Eraser ©   (2010-09-05 02:37) [1]

> Насколько я понял из MSDN, SERVICE_INTERACTIVE_PROCESS не
> желательно использовать в Windows Vista и выше

не то чтобы не желательно, там просто этот флаг не имеет никакой силы.

> Взаимодействие сервиса с клавиатурой

задумка изначально ошибочная.


 
Leonid Troyanovsky ©   (2010-09-05 10:01) [2]


> Alexandro   (05.09.10 01:41)  

> Вопрос: Как сделать так, чтобы сервис реагировал на заданное
> сочетание клавиш не зависимо от наличия залогиненных пользователей

А кто же клаву топтать будет, если юзеров не будет в наличии?

Поручать обработку ввода надо клиенту, запустить который можно
хоть в автозагрузке.

See also: http://rsdn.ru/?forum/delphi/2187439.aspx

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2010-09-05 10:47) [3]


> Пишу сервис, который должен по нажатию определенного сочетания
> клавиш выполнять некоторые действия.

Это уже не сервис.


> так как срабатывание должно происходить и при отсутствии
> залогиненного пользователя

И кто же тогда будет нажимать клавиши?


 
Плохиш ©   (2010-09-05 15:22) [4]

Малъчико хочет тырить пароли...


 
Anatoly Podgoretsky ©   (2010-09-05 16:01) [5]

> Плохиш  (05.09.2010 15:22:04)  [4]

Проказник.


 
Alexandro   (2010-09-05 19:11) [6]


> 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>


 
Anatoly Podgoretsky ©   (2010-09-05 19:33) [7]

> Alexandro  (05.09.2010 19:11:06)  [6]

Ну у пользователей прав нет, а у тебя есть? Вот ты и нажмешь и кирдык.
Решение в общем то неверное, такое решается через разрушение винчестера,
скажем взрыв пакет и волшебная кнопка (физическая) или сервер в Зимбабве.


 
DVM ©   (2010-09-05 19:40) [8]


> Alexandro   (05.09.10 19:11) [6]

Драйвер тебе поможет точно. Пусть твоя служба с драйвером и общается.


 
Alexandro   (2010-09-05 20:14) [9]


> 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 битной семерке, будь она не неладна... Думал есть другое решение, но похоже, что нет.


 
Eraser ©   (2010-09-05 20:18) [10]

> [6] Alexandro   (05.09.10 19:11)


> Ну, другого способа реализации я пока не вижу

способ известный, в каждой терм. сесии иметь по запущеной копии процесса, взаимодействующего с сервисом.

> задача из серии boss-key по приходу нежелательных гостей
> уничтожить необходимую информацию в реестре всех

спасёт только что-то вроде этого http://www.eraser.ru/


 
Eraser ©   (2010-09-05 20:20) [11]

> [6] Alexandro   (05.09.10 19:11)


> Залогиненные пользователей нет

есть - system.


 
Игорь Шевченко ©   (2010-09-05 20:21) [12]


> по приходу нежелательных гостей уничтожить необходимую информацию
> в реестре всех пользователей компьютера.


может быть, ее там просто не хранить ?


 
DVM ©   (2010-09-05 20:22) [13]


> Alexandro   (05.09.10 20:14) [9]


> запнулся на 64 битной семерке, будь она не неладна...

Подпись драйвера что ли требует?


 
Rouse_ ©   (2010-09-05 20:59) [14]


> DVM ©   (05.09.10 19:40) [8]
> Драйвер тебе поможет точно. Пусть твоя служба с драйвером
> и общается.

Боюсь не поможет, помимо клавиатуры есть и терминальный режим.
ИМХ надо развить идею. Если есть затык с программной стороны - ее нужно решать аппаратно.
В качестве сочетания клавиш - педаль под стол, активизирующая небольшой заряд С4 на харде, быстро, надежно и квалификации программиста не нужно.


 
Alexandro   (2010-09-05 22: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 22:12) [16]

Если с плутонием напряг - то поможет хранение данных в удаленном хранилище - сразу убиваешь две проблемы
1. данные для удаления, клиент не имеет
2. но зато они есть у тебя :)


 
Alexandro   (2010-09-05 22:20) [17]


> Rouse_ ©   (05.09.10 22:12) [16]

Не хватит интернет канала для удаленного хранилища, а если "удаленно" - это в офисе под навесным потолком, то с таким же успехом можно поставить на ресепшн ;) Кроме того, остаются следы от использования, которые тоже надо прибивать.


 
Almaz ©   (2010-09-05 22:32) [18]

<OFFTOP>
Я вернулся во плоти :) Кто-то мой аккаунт удалил - пришлось заного регистрироваться...
</OFFTOP>


 
Rouse_ ©   (2010-09-05 23:18) [19]

Чей-то тогда задачу понять не могу, сервер есть, канал к нему есть - как так получается что канал маленький?
Ели ты по нему будешь секретных данных сохранять по несколько гектаров, то тогда да, маловат, но и при удалении с харда такая операция не на много быстрее проталкивания по инету будет, гектар с харда стереть - это не байт в NTFS поправить, типа стерт он, а реально тройным наложением по секторам в несколько проходов проходить придется, иначе как шредер изобразить-то?


 
Rouse_ ©   (2010-09-05 23:20) [20]

ЗЫ: про удаленно - это я про машину где уже стоит оборудование для селфдестракта, есесн :)


 
Rouse_ ©   (2010-09-05 23:25) [21]

Да и в конце концов, если ты дровину реализовал уже - так подпиши ее и всего делов. Там денех, то копейки под это дело...


 
Almaz ©   (2010-09-05 23:38) [22]

Проблема в том, чтобы не столько удалить инфу на сервере - это крайний случай. А удалить все упоминания о сервере на локальных компах - пути к 1С базам, например. Оставить только пути к "белому" серверу. Так как взрывать сервер при каждом подозрении - несколько накладно ;) А это программа для "лайт" варианта. Когда сервер остается - так как найти его довольно сложно ;)


 
Игорь Шевченко ©   (2010-09-05 23:46) [23]


> Игорь, я обязательно задам этот философский вопрос клиенту
> ;)


Непременно стоит задать. Так как я честно не понимаю, почему, если что-то именно нужно уничтожать (в реестре, да еще с его параноидальной системой поддержки целостности, с точками восстановления), то почему это нельзя просто не хранить. Тогда и уничтожать нечего...


 
Almaz ©   (2010-09-06 00:33) [24]


> Игорь Шевченко ©   (05.09.10 23:46) [23]

Если не хранить - то работа сильно затрудниться - а в ряде случаев станет вообще невозможной. Как не хранить в реестре, например, пути к 1С базам коих штук 25 на пользователя ? (аутсорсинговая компания)
Терминалку пока сделать не получается - слишком много пользователей, работающих одновременно с ресурсоемкими приложениями (более 200) - нужен слишком мощный сервер, скорее даже кластер.


 
Eraser ©   (2010-09-06 00:52) [25]

> [15] Alexandro   (05.09.10 22:00)


> Это да. Но это уже обсуждалось тут дважды и выяснилось,
> что это решение, увы, непригодно.

только вот я из этого обсуждения не понял, почему же оно не пригодно, в чём проблема там?


 
Almaz ©   (2010-09-06 01:41) [26]


> только вот я из этого обсуждения не понял, почему же оно
> не пригодно, в чём проблема там?

Дано: компьютер, в "экране приветствия".
Вопрос: как запустить процесс, взаимодействующий с сервисом, чтобы он обрабатывал нажатия, пока компьютер в этом состоянии ?

Насколько я понимаю - никак.


 
Eraser ©   (2010-09-06 02:02) [27]

> [26] Almaz ©   (06.09.10 01:41)


> Насколько я понимаю - никак.

еще как можно ;-)
просто запускайте процесс в текущей терм. сессии, но с токеном системы и всех делов то.


 
Almaz ©   (2010-09-06 09:51) [28]


> Eraser ©   (06.09.10 02:02) [27]
> > [26] Almaz ©   (06.09.10 01:41)> Насколько я понимаю -
>  никак.еще как можно ;-)просто запускайте процесс в текущей
> терм. сессии, но с токеном системы и всех делов то.

Извините, наверно туплю - можно поподробнее способ запуска ?


 
Eraser ©   (2010-09-06 12:02) [29]

   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



Страницы: 1 вся ветка

Текущий архив: 2010.11.28;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.012 c
15-1282249788
Юрий
2010-08-20 00:29
2010.11.28
С днем рождения ! 20 августа 2010 пятница


2-1283487912
Semen
2010-09-03 08:25
2010.11.28
Как сделать нормальный буффер


15-1281994189
Юрий
2010-08-17 01:29
2010.11.28
С днем рождения ! 17 августа 2010 вторник


2-1283144728
azamatufa
2010-08-30 09:05
2010.11.28
использование uses


2-1284144181
flasher
2010-09-10 22:43
2010.11.28
Проблема с дочерними mdi окнами