2016-06-10 85 views
0

我的Windows应用程序可以由用户或自动启动(注册表,'Software \ Microsoft \ Windows \ CurrentVersion \ Run')启动。确定应用程序的启动方式 - 通过用户或自动启动

是否可以确定我的应用程序启动的方式?

我发现的唯一方法 - 添加命令行参数。类似myapp.exe -automyapp.exe -user。是否有可能避免命令行参数?

+1

任何特定的原因,为什么你想避免命令行参数?我想不出一个更干净的方式去做你所要求的。 –

+0

你应该有启动你的应用程序的设施*告诉你*它的完成;命令行是最好的选择。你可能不会打扰'-user',并假设如果没有命令行,它是从shell手动启动的。 –

+1

使用命令行参数。什么是不喜欢已知工作的系统? –

回答

1

最干净方法是使用您在Run注册表项中指定的路径中包含的命令行参数。当然,没有什么可以阻止用户使用相同的命令行参数手动运行应用程序。

另一种选择是创建运行主应用程序的启动器。无论是创建一个运行注册表的启动程序,还是一个自动启动Windows的启动程序服务,并在用户登录时启动主应用程序。然后,您可以执行各种操作,让主应用程序检测其运行时间发射:

  1. 使两者使用管道,窗口消息相互通信等

  2. 是否调用CreateProcess()当启动器通过在STARTUPINFO::lpReservedSTARTUPINFO::lpReserved2字段秘密值(见this article了解更多详情)。

  3. 使主应用程序检查其父进程ID是否是启动程序可执行文件(是的,在Windows中有父进程的概念)。请参阅CreateToolhelp32Snapshot()Process32First()/Process32Next()PROCESSENTRY32结构有一个th32ParentProcessID字段。您可以提取与该进程ID关联的文件名。

  4. 使启动程序创建一个内核对象即launched process can inherit

  5. 等,等,等

但同样,没有什么可以只从手动运行启动,或杀死一个发射服务,写一个新的启动应用程序,以模仿原停止用户行为。

最好只使用命令行参数,不要担心用户试图伪装它。基本用户可能甚至不知道注册表或命令行,而知识丰富的用户可能会忽略它们。恶意用户可能会想出如何绕过检测,或者完全禁用/替换它们。

+0

很遗憾,我们没有“Windows通过注册表中的字符串启动”标志...... –

+1

将信息直接传递给任意启动的进程的唯一方法是命令行参数和“STARTUPINFO”结构。你不想使用命令行。我想,微软可以在'STARTUPINFO.dwFlags'中定义一个新的标志,但目前没有。如果启动的进程知道在哪里查找,自定义启动器可以在[STARTUPINFO]中[隐藏秘密数据](http://www.catch22.net/tuts/undocumented-createprocess)。 –

0

我同意穆罕默德在这个 - 命令行标志似乎是做你正在做的最简单,最可扩展的方式。但是,我有另一个想法(只是为了好玩,我仍然是为了cmd参数):你可以在注册表中注册一个不同的程序,它执行任何你希望做的不同的事情,只有它会执行原始节目。就像注册表引导程序一样。

+0

请注意,这两种解决方案都不能保证按预期工作。用户可以启动通过*“自动启动”*命令行或启动器应用程序的应用程序,并使其表现得好像不是用户启动的启动。 – IInspectable

+1

那么,如果用户想成为恶魔,那么他欢迎你这样做 –

+0

CreateProcess不是基于文件内容启动东西,而shellexecute是基于扩展名执行的吗?所以如果注册的运行应用程序没有可执行的扩展名,它会自动启动,但用户无法运行它.. –