c++ - 确定应用程序的启动方式 - 由用户启动或自动启动

标签 c++ windows winapi

我的 Windows 应用程序可以由用户或自动启动(注册表,“Software\Microsoft\Windows\CurrentVersion\Run”)启动。

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

我找到的唯一方法 - 添加命令行参数。类似于 myapp.exe -automyapp.exe -user。是否可以避免命令行参数?

最佳答案

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

另一种选择是创建一个运行主应用程序的启动器。要么创建注册表运行的启动器应用程序,要么创建随 Windows 自动启动并在用户登录时启动主应用程序的启动器服务。然后你可以做各种事情让主应用程序检测它何时运行启动器:

  1. 让两者通过管道、窗口消息等方式相互通信

  2. 让启动器在调用 时在 STARTUPINFO::lpReservedSTARTUPINFO::lpReserved2 字段中传递一个secret 值>CreateProcess()(有关详细信息,请参阅 this article)。

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

  4. 让启动器创建一个内核对象,launched process can inherit .

  5. 等等等等

但同样,没有什么可以阻止用户仅手动运行启动器,或终止启动器服务并编写新的启动器应用来模仿原始行为。

最好坚持使用命令行参数,不要担心用户试图伪造它。基本用户可能甚至不知道注册表或命令行,知识渊博的用户可能会忽略它们。恶意用户可能会弄​​清楚如何绕过您的检测,或者完全禁用/替换它们。

关于c++ - 确定应用程序的启动方式 - 由用户启动或自动启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37746283/

相关文章:

windows - 如何挂接到 Windows 中的应用程序和进程启动?

c - 如何在 Visual C 中对视频进行编码?

c++ - 获取所有 Windows 内核对象及其安全权限

c++ - 如果我删除了 const,为什么这个使用 boost::shared_ptr 的调用不能在 C++ 中编译?

c++ - 散落着断言的代码

c++ - 只允许传递指向新对象的指针

python - 为什么不相关的代码会产生影响?

c++ - 从函数绘制图形

windows - 在 Powershell 中检测 Windows 8

c - 命名共享内存 Windows api c++