Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Взаимодействие сервиса с клавиатурой [Win2k, WinXP]


Страницы:   1 2

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/


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо