我想檢索與特定名稱模式匹配的所有正在運行的進程的信息。我通過使用我在網上找到的以下代碼來做到這一點,顯然它應該可以幫助解決Windows Vista及更高版本上的一些特權問題。可悲的是,這並不適合我。我以管理員身份執行以下代碼。僅僅運行一次就可以正常運行正在運行的進程
的Natives.OpenProcess工作正常,在第一次被調用,但沒有對每次調用後,通過返回IntPtr.Zero和GetLastWin32Error()返回「拒絕訪問」。
public static string GetExecutablePathAboveVista(int ProcessId)
{
var buffer = new StringBuilder(1024);
IntPtr hprocess = Natives.OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION, false, ProcessId);
if (hprocess != IntPtr.Zero)
{
try
{
int size = buffer.Capacity;
if (Natives.QueryFullProcessImageName(hprocess, 0, buffer, out size))
{
return buffer.ToString();
}
}
finally
{
Natives.CloseHandle(hprocess);
}
}
throw new Win32Exception(Marshal.GetLastWin32Error());
}
我不知道我完全理解了你的整個評論,但我想我明白了。它仍然沒有解釋爲什麼第一個電話工作,只有第二個電話失敗。如果我第一次擁有這個特權,我應該第二次擁有它,因爲我沒有改變線程或任何想象。 – a20eac1d
@ a20eac1d - 你們兩個都試着打開相同的進程ID嗎? *最好使用'ZwQuerySystemInformation(SystemProcessIdInformation,..)'獲取可執行文件的完整路徑。如果您不想使用未公開的API - 您必須在調用'GetExecutablePathAboveVista'前**在您的令牌中啓用** SE_DEBUG_PRIVILEGE。可能是第一次和第二次調用之間的某些代碼在您的令牌中禁用此特權。 – RbMm