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] 

输出:

http://i.stack.imgur.com/0guuG.png

+1

请提供您尝试过的例子。是否有您遇到问题的API函数? –

+1

您是否在问如何从某个东西获取模块文件名?从何而来?一个PID?请详细说明问题。 –

+0

@ david.pfx检查我更新的问题。 –

如果你有一个进程ID,使用OpenProcess()获取HANDLE的进程,然后使用GetProcessImageFileName()QueryFullProcessImageName()获取进程的文件名。

如果您需要传递给进程的命令行参数,那就更难了。您必须使用NtQueryInformationProcess()来获取进程PEB结构的地址,然后使用ReadProcessMemory()来读取PEB的ProcessParameters.CommandLine成员的内容,该成员是UNICODE_STRING结构。请注意,如果尝试访问属于其他用户帐户的进程或使用更高权限运行,这将失败,除非您的进程具有SeDebugPrivilege权限,例如通过使用AdjustTokenPrivileges()启用它。

+0

请检查我更新的问题。谢谢! –

+0

您必须使用我提到的API函数,您将无法从WMI获取进程路径。除了你不能用OpenProcess()打开进程0(甚至任何管理器都不能显示那个路径)。 'OpenProcess()'适用于进程4,但查询路径失败。不过,如果您的应用程序以管理员身份运行,您可以获得'smss.exe'的路径。 –

+0

我目前的解决方案是确定的,但客户希望非管理员也可以查看流程路径。那么,你确定这是不可能的吗? –