【问题标题】:System.ComponentModel.Win32Exception (0x80004005): Access is deniedSystem.ComponentModel.Win32Exception (0x80004005):访问被拒绝
【发布时间】:2019-03-06 23:26:09
【问题描述】:

我有一个带有方法 GetParentProcess(IntPtr handle) 的结构,用于通过传递句柄返回父进程。

[StructLayout(LayoutKind.Sequential)]
public struct ParentProcessUtilities
{

    internal IntPtr Reserved1;
    internal IntPtr PebBaseAddress;
    internal IntPtr Reserved2_0;
    internal IntPtr Reserved2_1;
    internal IntPtr UniqueProcessId;
    internal IntPtr InheritedFromUniqueProcessId;

    [DllImport("ntdll.dll")]
    public static extern int NtQueryInformationProcess(IntPtr processHandle, int processInformationClass, ref ParentProcessUtilities processInformation, int processInformationLength, out int returnLength);


    public static Process GetParentProcess()
    {
        return GetParentProcess(Process.GetCurrentProcess().Handle);
    }


    public Process GetParentProcess(int id)
    {
        Process process = Process.GetProcessById(id);
        return GetParentProcess(process.Handle);
    }


    public static Process GetParentProcess(IntPtr handle)
    {
        ParentProcessUtilities pbi = new ParentProcessUtilities();
        int returnLength;
        int status = NtQueryInformationProcess(handle, 0, ref pbi, Marshal.SizeOf(pbi), out returnLength);
        if (status != 0)
            throw new Win32Exception(status);

        try
        {
            return Process.GetProcessById(pbi.InheritedFromUniqueProcessId.ToInt32());
        }
        catch (ArgumentException)
        {

            return null;
        }
    }
}

一切正常,直到我进入进程“smss.exe”。当我想获得该进程的父进程时,它会抛出这个异常

 Unexpected exception : System.ComponentModel.Win32Exception (0x80004005): Access is denied
   at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
   at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
   at System.Diagnostics.Process.OpenProcessHandle(Int32 access)
   at System.Diagnostics.Process.get_Handle()

我正在以管理员权限运行应用程序。感谢帮助

【问题讨论】:

  • 如果只是想查询流程的基本信息,可以考虑WMI作为替代方案。
  • 我已经这样做了,但是 WMI 比这种方法慢得多。在这种特殊情况下,我想尽快得到结果

标签: c# process


【解决方案1】:

smss.exe 是会话管理器子系统,有关详细信息,请参阅此Wikipedia article。它是 Windows 内核启动的第一个用户模式进程,并执行许多特权操作。因此,您的普通进程将无权管理此进程,因此“访问被拒绝”异常。

【讨论】:

  • 好的,问题是我的应用程序无权访问此进程。有没有办法明确设置权限以授予任何正在运行的进程的访问权限,或者我是否需要以某种方式设置我的用户配置文件?
  • @ChristiánSzeman 我建议在这种情况下处理异常而不是使用权限。您正在处理作为操作系统一部分的进程,因此请避免接触它。但是,如果您对此有正当理由,则可以使用 “作为操作系统的一部分” 权限。看到这个article
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 2014-10-04
  • 2016-08-15
相关资源
最近更新 更多