Запретить запуск приложения в C # - PullRequest
4 голосов
/ 17 ноября 2009

Хорошо, я провел дневные исследования, и мне не повезло найти ответ на этот вопрос. Я пытаюсь предотвратить запуск приложения через какое-то dll или фоновое приложение. Он должен использоваться для мониторинга использования приложений и лицензий в моем учреждении. Я нашел здесь информацию о WqlEventQuery, а также FileSystemWatcher. Ни одно из этих решений не работает для меня, потому что:

С WqlEventQuery я смог обработать событие только после того, как процесс был создан. Используя блокнот в качестве теста, блокнот был виден и доступен мне до того, как моя логика закрыла его. Я попытался приостановить / возобновить поток (я знаю, что это небезопасно, но я тестировал / играл), но это просто повесило окно, пока моя логика не закончилась.

С FileSystemWatcher я не смог получить никаких событий от запуска .exe, только создания, переименования и удаления файлов.

Цель в том, чтобы вообще не запускать приложение, если моя логика не позволяет ему запускаться. Это возможно? Следующее лучшее решение, которое я придумала, - это принудительный модальный диалог, который не позволяет пользователю взаимодействовать с чем-либо, после закрытия диалога приложение убивается. Моя задача здесь - красиво убить приложение и обрабатывать приложения с большими накладными расходами, когда они загружаются, такие как Photoshop или что-то в этом роде. Это также помешало бы функции, которую я надеялся иметь, где пользователь мог бы войти в очередь, пока не будет доступна лицензия. Это мой лучший маршрут? Любые другие предложения?

Спасибо

редактировать: чтобы уточнить, это не вирус или что-либо вредоносное. Речь не идет о запрете доступа к черному списку или разрешении доступа через белый список. Идея состоит в том, чтобы проверять базу данных в каждом конкретном случае для определенных приложений и видеть, есть ли лицензия для использования. Если есть, дайте приложению запуститься, если не отобразите диалоговое окно, сообщающее пользователю. Мы также будем использовать это для мониторинга и отслеживания, если у нас будет достаточно лицензий для удовлетворения спроса и т. Д. Примером одного из этих приложений является SPSS, у которого очень дорогие лицензии, но очень ограниченный круг людей, использующих его.

Ответы [ 10 ]

1 голос
/ 18 ноября 2009

Вы могли бы на самом деле редактировать реестр, поэтому, когда вы нажимаете psd, вместо Photoshop вызывается ваша программа запуска. Затем ваш модуль запуска проверяет наличие лицензий и, если он есть, запускает Photoshop с путем к файлу.

1 голос
/ 18 ноября 2009

Вы действительно близко, посмотрите на События управления WMI. http://msdn.microsoft.com/en-us/library/ms186151%28VS.80%29.aspx

Пример кода от Microsoft: http://msdn.microsoft.com/en-us/library/ms257355(VS.80).aspx

Подписка на соответствующее событие предоставит вашей заявке соответствующую информацию для выполнения того, что вы описали.

1 голос
/ 18 ноября 2009

Не могли бы вы использовать

System.Diagnostics.Process.GetProcessesByName

в цикле для поиска процесса?

Это может сработать, если вы не используете слишком агрессивную скорость опроса.

0 голосов
/ 18 ноября 2009

Это длинный выстрел, но вы можете найти его полезным.

Воспринимаемые типы и регистрация приложений http://msdn.microsoft.com/en-us/library/cc144150(VS.85).aspx

0 голосов
/ 18 ноября 2009

Возможно, вы захотите взглянуть на этот продукт: http://www.sassafras.com/licensing.html Лично я терпеть не могу, но это потому, что он делает то, что вы описываете. Может сэкономить немного кодирования.

0 голосов
/ 18 ноября 2009

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

Если это так, отслеживать список процессов (в цикле while), используя System.Diagnostics.Process (метод GetProcesses выдает список всех запущенных)

Просто убейте процесс, когда он начнется.

Или, если на ваших машинах установлена ​​Windows 7 (Windows 2008 ??), вы можете использовать AppLocker. http://www.microsoft.com/windows/enterprise/products/windows-7/features.aspx#applocker Просто позвольте Windows предотвратить запуск.

0 голосов
/ 18 ноября 2009

Я бы ожидал, что есть какой-то способ зацепить запуск приложения, но не могу помочь прямо на этом фронте.

Вы можете улучшить свой текущий подход, обнаружив открытие окна приложения и скрыв его (переместив его за экран), чтобы пользователь не мог попытаться взаимодействовать с ним, пока вы пытаетесь закрыть его.

Однако другой подход, который может быть возможен (в зависимости от ваших обстоятельств), заключается в написании модуля запуска приложений. Это просто замена ярлыка для приложения, которое проверяет ваши условия лицензирования, а затем выполняет Process.Start для запуска реального .exe в этот момент. Это будет хорошо работать для любого приложения. (Я использовал такую ​​систему для запуска приложений со специализированными настройками среды, и она прекрасно работает)

Вы можете комбинировать это с вашим текущим подходом в качестве запасного варианта для "умных" пользователей, которым удается обойти ваш лаунчер.

0 голосов
/ 18 ноября 2009

Интересно, вы ошибаетесь? В свое время существовало приложение для Mac, которое препятствовало бы доступу к рабочему столу, и имело кнопки для запуска набора приложений.

IDEA

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

0 голосов
/ 18 ноября 2009

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

Рассматривали ли вы использование системной политики? Это был бы наилучший поддерживаемый способ предотвратить запуск программы пользователем.

У вас может быть запущена служба, которая принудительно убивает любое приложение, которое не занесено в «белый список», но я не могу сказать, насколько хорошо это будет работать.

0 голосов
/ 18 ноября 2009

Не уверен, что это ХОРОШЕЕ решение, но вы могли бы сделать что-то вроде передачи ключа в main, чтобы, если ключ отсутствует или действителен, приложение закрывалось. Затем, когда вы откроете приложение в своем коде, просто введите ключ. Кто-то должен будет знать ключ, чтобы запустить приложение.

Предполагается, что у вас есть доступ к исходному коду рассматриваемого приложения, в котором, прочитав ваш вопрос еще раз, я не уверен в этом.

...