确定应用程序的启动方式 - 通过用户或自动启动
我的Windows应用程序可以由用户或自动启动(注册表,'Software \ Microsoft \ Windows \ CurrentVersion \ Run')启动。确定应用程序的启动方式 - 通过用户或自动启动
是否可以确定我的应用程序启动的方式?
我发现的唯一方法 - 添加命令行参数。类似myapp.exe -auto
和myapp.exe -user
。是否有可能避免命令行参数?
最干净方法是使用您在Run
注册表项中指定的路径中包含的命令行参数。当然,没有什么可以阻止用户使用相同的命令行参数手动运行应用程序。
另一种选择是创建运行主应用程序的启动器。无论是创建一个运行注册表的启动程序,还是一个自动启动Windows的启动程序服务,并在用户登录时启动主应用程序。然后,您可以执行各种操作,让主应用程序检测其运行时间发射:
使两者使用管道,窗口消息相互通信等
是否调用
CreateProcess()
当启动器通过在STARTUPINFO::lpReserved
或STARTUPINFO::lpReserved2
字段秘密值(见this article了解更多详情)。使主应用程序检查其父进程ID是否是启动程序可执行文件(是的,在Windows中有父进程的概念)。请参阅
CreateToolhelp32Snapshot()
和Process32First()
/Process32Next()
。PROCESSENTRY32
结构有一个th32ParentProcessID
字段。您可以提取与该进程ID关联的文件名。使启动程序创建一个内核对象即launched process can inherit。
等,等,等
但同样,没有什么可以只从手动运行启动,或杀死一个发射服务,写一个新的启动应用程序,以模仿原停止用户行为。
最好只使用命令行参数,不要担心用户试图伪装它。基本用户可能甚至不知道注册表或命令行,而知识丰富的用户可能会忽略它们。恶意用户可能会想出如何绕过检测,或者完全禁用/替换它们。
很遗憾,我们没有“Windows通过注册表中的字符串启动”标志...... –
将信息直接传递给任意启动的进程的唯一方法是命令行参数和“STARTUPINFO”结构。你不想使用命令行。我想,微软可以在'STARTUPINFO.dwFlags'中定义一个新的标志,但目前没有。如果启动的进程知道在哪里查找,自定义启动器可以在[STARTUPINFO]中[隐藏秘密数据](http://www.catch22.net/tuts/undocumented-createprocess)。 –
我同意*在这个 - 命令行标志似乎是做你正在做的最简单,最可扩展的方式。但是,我有另一个想法(只是为了好玩,我仍然是为了cmd参数):你可以在注册表中注册一个不同的程序,它执行任何你希望做的不同的事情,只有它会执行原始节目。就像注册表引导程序一样。
请注意,这两种解决方案都不能保证按预期工作。用户可以启动通过*“自动启动”*命令行或启动器应用程序的应用程序,并使其表现得好像不是用户启动的启动。 – IInspectable
那么,如果用户想成为恶魔,那么他欢迎你这样做 –
CreateProcess不是基于文件内容启动东西,而shellexecute是基于扩展名执行的吗?所以如果注册的运行应用程序没有可执行的扩展名,它会自动启动,但用户无法运行它.. –
任何特定的原因,为什么你想避免命令行参数?我想不出一个更干净的方式去做你所要求的。 –
你应该有启动你的应用程序的设施*告诉你*它的完成;命令行是最好的选择。你可能不会打扰'-user',并假设如果没有命令行,它是从shell手动启动的。 –
使用命令行参数。什么是不喜欢已知工作的系统? –