迭代运行的进程只运行一次

时间:2017-05-21 15:28:57

标签: c# winapi

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

1 个答案:

答案 0 :(得分:0)

当且仅当您没有启用OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, ..)时,

ERROR_ACCESS_DENIED会向您SE_DEBUG_PRIVILEGE提供。所以只能是两种情况:或者在第一次调用GetExecutablePathAboveVista之前,你已经在线程中启用了SE_DEBUG_PRIVILEGE(如果它有令牌)或进程令牌。在第二个/下一个调用之前,您直接或更快地调用所有间接禁用此权限或使用另一个令牌模拟线程。或者你可能会说混淆过程 - 第一次打开一个进程(id),第二次尝试打开另一个进程(id) - 不清楚你的代码。

  

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

这还不够。这仅表示您的流程中存在令牌SE_DEBUG_PRIVILEGE。 (使用默认的Windows设置,但可以更改)但您需要在令牌中启用,而不仅仅是存在。

  

匹配某个名称模式

如果您只需要处理名称而没有完整路径 - 您在枚举所有正在运行的进程时已经拥有它。

还存在 ZwQuerySystemInformation 的未记录的 SystemProcessIdInformation 信息类 - 通过它,您可以获得完整的流程路径而无需打开它并拥有任何权限。