我们的产品是C#控制台应用。是否可以将其限制为仅从命令行运行?换句话说,用户将无法从脚本或其他应用程序中调用它。
如果是,那么一些示例代码将非常受欢迎。感谢。
答案 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艺术)。