C #: ограничить способ вызова консольного приложения - PullRequest
5 голосов
/ 24 ноября 2010

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

Если это так, некоторый пример кода будет очень полезен.Спасибо.

Ответы [ 4 ]

3 голосов
/ 24 ноября 2010

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

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

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

3 голосов
/ 24 ноября 2010

Вы можете проверить процесс, который создал ваше приложение, используя приведенный здесь код: 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.

1 голос
/ 24 ноября 2010

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

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

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

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

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

        return true;
    }

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

0 голосов
/ 24 ноября 2010

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

...