2010-11-24 6 views
5

У нас есть продукт, который является консольным приложением C#. Можно ли ограничить его запуском только из командной строки? Другими словами, пользователи не смогут назвать это из сценария или другого приложения.C#: Ограничить использование консольного приложения

Если есть, некоторый пример кода был бы очень признателен. Благодарю.

+0

Вы действительно имеете в виду командную строку DOS (command.com) или командную строку NT (cmd.exe)? Или любое консольное приложение отлично? – CodesInChaos 2010-11-24 12:15:31

+0

А чего вы пытаетесь достичь? Почему вы хотите, чтобы другие программы не запускали вашу программу? – CodesInChaos 2010-11-24 12:16:32

+0

@CodeInChaos: Хорошие очки. Любое консольное приложение в порядке. Я бы хотел, чтобы приложение не использовалось как часть другого продукта или услуги. – FunLovinCoder 2010-11-24 12:28:41

ответ

3

Вы можете проверить процесс создания приложения с помощью приведенного здесь кода: http://msdn.microsoft.com/en-us/netframework/aa569609.aspx#Question3. Для запуска в командной строке DOS родительский процесс должен быть cmd.exe. Обратите внимание, однако, как указал Колин, это можно легко обойти, используя пакетный скрипт. Вы также можете отключить это, убедившись, что аргументы командной строки cmd.exe равны нулю. Для этого вам нужно будет использовать WMI:
http://skysanders.net/subtext/archive/2010/04/11/using-wmi-to-fetch-the-command-line-that-started-all.aspx
Вы должны также проверить, что изображение cmd.exe относится к папке system32.

3

Я не думаю, что можно сказать разницу.

Конечно, родительский процесс не является полезным индикатором. Это то, что вы получаете в родительском процессе:

1. type app name into Command Prompt:  cmd.exe 
2. call app from batch script:   cmd.exe 
3. Double click on app or shortcut:  explorer.exe 
4. type app name into Run dialog box:  explorer.exe 

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

(кстати, кто-нибудь знает способ получить таблицу на StackOverflow?)

1

@ swisston, если вы запускаете консольное приложение из другого собственного приложения, чем я хочу рекомендовать вам «именованные объекты ядра». Например, мьютекс. Вы можете создать именованный mutex в своем родительском приложении. Затем в главном потоке приложения вашей дочерней консоли попытайтесь открыть этот мьютекс. Если мьютекс не открыт (не найдено): консоль приложение имеет никаких разрешений для продолжения и должны быть закрыты;) ждать, я сварю код для вас;)

Edit: Так что это очень легко тактики. В родительском приложении создать именованный мьютекс:

Mutex mutex = new Mutex(true, "MyPermissions"); 

Затем в детской консоли проверки приложений, если ваш мьютекс существует:

static bool CheckPermissions() 
    { 
     try 
     { 
      Mutex mutex = Mutex.OpenExisting("MyPermissions"); 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 

     return true; 
    } 

Если консольное приложение было работать без вашего родительского метода CheckPermissions приложения будет возвращать ложь и консоль должна быть закрыта;)

0

Я не согласен с тем, что вы пытаетесь сделать, но вот идея, которая могла бы работать: потребовать какой-то пользовательский ввод в начале программы, возможно, какой-то CAPTCHA (трудно сделать в командной строке, но теоретически возможно. Думайте об ASCII-искусстве).

Смежные вопросы