我想检索与特定名称模式匹配的所有正在运行的进程的信息。我通过使用我在网上找到的以下代码来做到这一点,显然它应该可以帮助解决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