C#:限制如何调用控制台应用程序

时间:2010-11-24 11:40:28

标签: c# console-application

我们的产品是C#控制台应用。是否可以将其限制为仅从命令行运行?换句话说,用户将无法从脚本或其他应用程序中调用它。

如果是,那么一些示例代码将非常受欢迎。感谢。

4 个答案:

答案 0 :(得分:3)

您可以使用此处给出的代码检查创建应用程序的过程:http://msdn.microsoft.com/en-us/netframework/aa569609.aspx#Question3。要在DOS命令行启动,父进程应该是cmd.exe。但是请注意,正如Colin所指出的,可以使用批处理脚本轻松绕过它。您也可以通过确保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 :(得分: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上获取表格的方法?)

答案 2 :(得分:1)

@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并且必须关闭控制台;)

答案 3 :(得分:0)

我不同意你想要做的事情,但这是一个可行的想法:在程序开始时需要某种用户输入,可能是某种类型的CAPTCHA(在命令中很难做到)线,但理论上可行。想想ASCII艺术)。