2017-05-21 67 views
1

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

回答

0

OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, ..)给你ERROR_ACCESS_DENIED当且仅当你没有SE_DEBUG_PRIVILEGE启用。因此只能有2种情况:或者在第一次调用GetExecutablePathAboveVista之前,您已在线程(如果有令牌)或进程令牌中启用SE_DEBUG_PRIVILEGE。并且在第二次/下一次调用您直接或间接调用所有间接禁用此特权或使用另一个令牌模拟线程。或者说你可能会说混淆进程 - 第一次打开一个进程(id),第二次尝试打开另一个进程(id) - 不清楚你的代码。

我以管理员身份执行以下代码。

这还不够。这意味着只有在你的进程中令牌存在SE_DEBUG_PRIVILEGE。 (与默认窗口设置,但是这可以改变),但你需要这个特权将启用令牌,不只是存在。

匹配某个名字模式

,如果你只需要处理没有完整路径 - 你已经拥有了它,当你列举所有正在运行的进程。

也存在无证SystemProcessIdInformation信息类ZwQuerySystemInformation函数 - 有了它,你可以得到过程的完整路径,而不打开它,有任何特权。

+0

我不知道我完全理解了你的整个评论,但我想我明白了。它仍然没有解释为什么第一个电话工作,只有第二个电话失败。如果我第一次拥有这个特权,我应该第二次拥有它,因为我没有改变线程或任何想象。 – a20eac1d

+0

@ a20eac1d - 你们两个都试着打开相同的进程ID吗? *最好使用'ZwQuerySystemInformation(SystemProcessIdInformation,..)'获取可执行文件的完整路径。如果您不想使用未公开的API - 您必须在调用'GetExecutablePathAboveVista'前**在您的令牌中启用** SE_DEBUG_PRIVILEGE。可能是第一次和第二次调用之间的某些代码在您的令牌中禁用此特权。 – RbMm