确定进程是否从快捷方式开始

是否可以确定是否使用快捷方式启动了另一个进程/窗口? 目的是然后读取获取启动设置的快捷方式:启动文件夹,以管理员身份运行等。也许有办法找出程序的催化剂/调用者(用户/应用程序w管理员权限/快捷方式) ?

我知道使用Windows驱动程序工具包来确定它 。 虽然这在其他方面发展是相当棘手的。

是否可以确定是否使用快捷方式启动了另一个进程/窗口?

是的,但不容易。

正如在回答 类似问题时所提到的 ,进程可以通过调用GetStartupInfo()并检查STARTF_TITLEISLINKNAME标志来查明自身是否由快捷方式启动。 这在MSDN上有记录:

GetStartupInfo函数

检索创建调用进程时指定的STARTUPINFO结构的内容。

STARTUPINFO结构

dwFlags中
一个位域,用于确定在进程创建窗口时是否使用某些STARTUPINFO成员。 该成员可以是以下一个或多个值。


STARTF_TITLEISLINKNAME
0x00000800
lpTitle成员包含用户为启动此进程而调用的快捷方式文件(.lnk)的路径 。 当调用指向已启动应用程序的.lnk文件时,通常由shell设置。 大多数应用程序不需要设置此值。

获得.lnk文件的路径后,可以根据需要使用IShellLink接口对其进行解析(有关详细信息,请参阅Shell链接 )。

现在,话虽如此,您无法直接检索另一个进程STARTUPINFO结构。 但是,您可以通过将代码注入目标进程(使用CreateRemoteThread()SetWindowsHookEx() )来间接检索它,然后让该代码调用GetStartupInfo()并使用您的IPC机制将所需信息传递回您的进程。选择( WM_COPYDATA ,命名管道,邮件槽,套接字,COM,RPC等)。

或者,有一种非官方的方式(受操作系统版本限制)来获取许多相同的STARTUPINFO字段值,包括.lnk文件名,而不会将任何代码注入目标进程。 使用NtQueryInformationProcess()获取指向目标进程的PEB 1结构的指针,该结构具有ProcessParameters字段,该字段是指向RTL_USER_PROCESS_PARAMETERS 1结构的指针,该结构具有WindowTitle字段(包含来自STARTUPINFO值的其他字段)。 您可以使用OpenProcess()来获取目标进程的HANDLE (您可以使用GetWindowThreadProcessId()获取HWND的进程ID),然后根据需要使用ReadProcessMemory()来读取PEBRTL_USER_PROCESS_PARAMETERS结构的内容。

1 :MSDN没有记录PEBRTL_USER_PROCESS_PARAMETERS结构的大部分内容,但是在http://undocumented.ntinternals.net ( 此处和此处 )中有记录。