Конференция "Начинающим" » Взаимодействие сервиса с клавиатурой [Win2k, WinXP]
 
  • Alexandro (05.09.10 01:41) [0]
    Здравствуйте ! Пишу сервис, который должен по нажатию определенного сочетания клавиш выполнять некоторые действия. Проблема в том, что классическое решение в виде дополнительной программы, работающей в пользовательском режиме с RegisterHotKey не подходит так как срабатывание должно происходить и при отсутствии залогиненного пользователя. Насколько я понял из MSDN, SERVICE_INTERACTIVE_PROCESS не желательно использовать в Windows Vista и выше. Да и достаточно NoInteractiveServices поставить в не ноль, чтобы отключить этот флаг.

    Вопрос: Как сделать так, чтобы сервис реагировал на заданное сочетание клавиш не зависимо от наличия залогиненных пользователей ?
  • Eraser © (05.09.10 02:37) [1]
    > Насколько я понял из MSDN, SERVICE_INTERACTIVE_PROCESS не
    > желательно использовать в Windows Vista и выше

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

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

    задумка изначально ошибочная.
  • Leonid Troyanovsky © (05.09.10 10:01) [2]

    > Alexandro   (05.09.10 01:41)  

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

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

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

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

    --
    Regards, LVT.
  • Anatoly Podgoretsky © (05.09.10 10:47) [3]

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

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


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

    И кто же тогда будет нажимать клавиши?
  • Плохиш © (05.09.10 15:22) [4]
    Малъчико хочет тырить пароли...
  • Anatoly Podgoretsky © (05.09.10 16:01) [5]
    > Плохиш  (05.09.2010 15:22:04)  [4]

    Проказник.
  • Alexandro (05.09.10 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 © (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]

    Драйвер тебе поможет точно. Пусть твоя служба с драйвером и общается.
  • Alexandro (05.09.10 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 © (05.09.10 20:18) [10]
    > [6] Alexandro   (05.09.10 19:11)


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

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

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

    спасёт только что-то вроде этого http://www.eraser.ru/
  • Eraser © (05.09.10 20:20) [11]
    > [6] Alexandro   (05.09.10 19:11)


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

    есть - system.
  • Игорь Шевченко © (05.09.10 20:21) [12]

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


    может быть, ее там просто не хранить ?
  • DVM © (05.09.10 20:22) [13]

    > Alexandro   (05.09.10 20:14) [9]


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

    Подпись драйвера что ли требует?
  • Rouse_ © (05.09.10 20:59) [14]

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

    Боюсь не поможет, помимо клавиатуры есть и терминальный режим.
    ИМХ надо развить идею. Если есть затык с программной стороны - ее нужно решать аппаратно.
    В качестве сочетания клавиш - педаль под стол, активизирующая небольшой заряд С4 на харде, быстро, надежно и квалификации программиста не нужно.
  • Alexandro (05.09.10 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_ © (05.09.10 22:12) [16]
    Если с плутонием напряг - то поможет хранение данных в удаленном хранилище - сразу убиваешь две проблемы
    1. данные для удаления, клиент не имеет
    2. но зато они есть у тебя :)
  • Alexandro (05.09.10 22:20) [17]

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

    Не хватит интернет канала для удаленного хранилища, а если "удаленно" - это в офисе под навесным потолком, то с таким же успехом можно поставить на ресепшн ;) Кроме того, остаются следы от использования, которые тоже надо прибивать.
  • Almaz © (05.09.10 22:32) [18]
    <OFFTOP>
    Я вернулся во плоти :) Кто-то мой аккаунт удалил - пришлось заного регистрироваться...
    </OFFTOP>
  • Rouse_ © (05.09.10 23:18) [19]
    Чей-то тогда задачу понять не могу, сервер есть, канал к нему есть - как так получается что канал маленький?
    Ели ты по нему будешь секретных данных сохранять по несколько гектаров, то тогда да, маловат, но и при удалении с харда такая операция не на много быстрее проталкивания по инету будет, гектар с харда стереть - это не байт в NTFS поправить, типа стерт он, а реально тройным наложением по секторам в несколько проходов проходить придется, иначе как шредер изобразить-то?
  • Rouse_ © (05.09.10 23:20) [20]
    ЗЫ: про удаленно - это я про машину где уже стоит оборудование для селфдестракта, есесн :)
  • Rouse_ © (05.09.10 23:25) [21]
    Да и в конце концов, если ты дровину реализовал уже - так подпиши ее и всего делов. Там денех, то копейки под это дело...
  • Almaz © (05.09.10 23:38) [22]
    Проблема в том, чтобы не столько удалить инфу на сервере - это крайний случай. А удалить все упоминания о сервере на локальных компах - пути к 1С базам, например. Оставить только пути к "белому" серверу. Так как взрывать сервер при каждом подозрении - несколько накладно ;) А это программа для "лайт" варианта. Когда сервер остается - так как найти его довольно сложно ;)
  • Игорь Шевченко © (05.09.10 23:46) [23]

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


    Непременно стоит задать. Так как я честно не понимаю, почему, если что-то именно нужно уничтожать (в реестре, да еще с его параноидальной системой поддержки целостности, с точками восстановления), то почему это нельзя просто не хранить. Тогда и уничтожать нечего...
  • Almaz © (06.09.10 00:33) [24]

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

    Если не хранить - то работа сильно затрудниться - а в ряде случаев станет вообще невозможной. Как не хранить в реестре, например, пути к 1С базам коих штук 25 на пользователя ? (аутсорсинговая компания)
    Терминалку пока сделать не получается - слишком много пользователей, работающих одновременно с ресурсоемкими приложениями (более 200) - нужен слишком мощный сервер, скорее даже кластер.
  • Eraser © (06.09.10 00:52) [25]
    > [15] Alexandro   (05.09.10 22:00)


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

    только вот я из этого обсуждения не понял, почему же оно не пригодно, в чём проблема там?
  • Almaz © (06.09.10 01:41) [26]

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

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

    Насколько я понимаю - никак.
  • Eraser © (06.09.10 02:02) [27]
    > [26] Almaz ©   (06.09.10 01:41)


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

    еще как можно ;-)
    просто запускайте процесс в текущей терм. сессии, но с токеном системы и всех делов то.
  • Almaz © (06.09.10 09:51) [28]

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

    Извините, наверно туплю - можно поподробнее способ запуска ?
  • Eraser © (06.09.10 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

 
Конференция "Начинающим" » Взаимодействие сервиса с клавиатурой [Win2k, WinXP]
Есть новые Нет новых   [134431   +13][b:0][p:0.002]