Windows:获取非管理员用户的进程exec路径
这是针对Windows(XP,7或8)的相关问题。Windows:获取非管理员用户的进程exec路径
是否有可能获得没有管理员权限的进程的exec路径?
如果可能,你能建议吗?
UPDATE:
样品工作代码:
#RequireAdmin
#include <array.au3>
Dim $proc[1][3]
Dim $i = 0
$WMI = ObjGet("winmgmts:\\.\root\CIMV2")
$result = $WMI.ExecQuery("SELECT * FROM Win32_Process", "WQL",0x10 + 0x20)
If IsObj($result) Then
For $res In $result
$Proc[UBound($proc)-1][0] = $res.Name
$Proc[UBound($proc)-1][1] = $res.Handle
$Proc[UBound($proc)-1][2] = $res.ExecutablePath
ReDim $proc[UBound($proc) + 1][3]
Next
ReDim $proc[UBound($proc) - 1][3]
Else
Msgbox(0,'Result','No result found')
Endif
_ArrayDisplay($Proc,'Process List')][1]
输出:
如果你有一个进程ID,使用OpenProcess()
获取HANDLE
的进程,然后使用GetProcessImageFileName()
或QueryFullProcessImageName()
获取进程的文件名。
如果您需要传递给进程的命令行参数,那就更难了。您必须使用NtQueryInformationProcess()
来获取进程PEB
结构的地址,然后使用ReadProcessMemory()
来读取PEB的ProcessParameters.CommandLine
成员的内容,该成员是UNICODE_STRING
结构。请注意,如果尝试访问属于其他用户帐户的进程或使用更高权限运行,这将失败,除非您的进程具有SeDebugPrivilege
权限,例如通过使用AdjustTokenPrivileges()
启用它。
请检查我更新的问题。谢谢! –
您必须使用我提到的API函数,您将无法从WMI获取进程路径。除了你不能用OpenProcess()打开进程0(甚至任何管理器都不能显示那个路径)。 'OpenProcess()'适用于进程4,但查询路径失败。不过,如果您的应用程序以管理员身份运行,您可以获得'smss.exe'的路径。 –
我目前的解决方案是确定的,但客户希望非管理员也可以查看流程路径。那么,你确定这是不可能的吗? –
请提供您尝试过的例子。是否有您遇到问题的API函数? –
您是否在问如何从某个东西获取模块文件名?从何而来?一个PID?请详细说明问题。 –
@ david.pfx检查我更新的问题。 –