我用 C# 写了一个主程序,我也用 C# 写了一个小工具程序。
我希望工具程序能够在某些条件下执行:
- 从我的主程序调用时。
- 从打开某些文件后缀调用时(例如“*.abc”)
但是如果用户打开我的程序目录他可以运行工具程序,我不希望他能够这样做。我希望他能够在上述条件下运行程序。如果他手动运行程序,程序会自动关闭。
有没有办法做到这一点?
我用 C# 写了一个主程序,我也用 C# 写了一个小工具程序。
我希望工具程序能够在某些条件下执行:
但是如果用户打开我的程序目录他可以运行工具程序,我不希望他能够这样做。我希望他能够在上述条件下运行程序。如果他手动运行程序,程序会自动关闭。
有没有办法做到这一点?
没有任何东西暴露给进程/执行环境来告诉它它是如何被调用的,所以没有万无一失的方法可以做到这一点。
您可以让您的主程序在命令行上传递一个标志 - 这和后缀是您可以检查的东西,如果其中任何一个不存在,您会立即终止。
但是,如果用户猜到了标志,他们仍然可以直接调用应用程序。
其他机制可能涉及在调用第二个程序之前将值从主程序写入文件并从第二个程序检查该文件(并在执行后将其删除),作为消息传递机制。还有其他消息传递机制可以做类似的事情(例如私有 MSMQ 队列)。
要检查您的主程序是否调用了它,您可以将主程序的ProcessID
作为命令行参数传递,然后在您的小程序中,检查它是否ProcessID
存在以及它的进程名称是否是您的主程序的名称。这不是防欺骗的,但可能比仅传递静态数字/字符串更难伪造。
此外,您可以加密并传递该数字,然后对其进行解密并检查上述内容。阻止一个坚定的黑客自己运行你的程序几乎是不可能的,但你可以提高它的难度。您还想混淆您的代码,否则快速反射器调用将准确显示正在传递的字符。
或者,如果可能的话,您可以将小程序制作为 DLL,然后从您的主程序中调用它。这需要一些重构,但会强制您的程序打开。至于打开*.abc
文件,您的程序可以检查命令行参数以查看是否传递了文件名。这可以由您的应用程序自动处理,并且可以进行 DLL 调用。
您可以使用带有一些难以猜测的名称的命名互斥锁,以确保主程序调用了“小工具”程序。因此,您在父程序中创建了一个互斥锁:
bool requestInitialOwnership = true;
bool mutexWasCreated;
Mutex m = new Mutex(requestInitialOwnership,
"MyMutex",
out mutexWasCreated);
然后在您的子程序中编写完全相同的代码来检查父程序是否执行了它。如果mutexWasCreated==true
,则它没有被父程序调用。否则,它是。检查传递给程序的参数将有助于确定文件名的扩展名是否是.abs
。