2014-03-07 81 views
-1

這是針對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檢查我更新的問題。 –

回答

2

如果你有一個進程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

我目前的解決方案是確定的,但客戶希望非管理員也可以查看流程路徑。那麼,你確定這是不可能的嗎? –

相關問題