C# System.ComponentModel.Win32异常(0x80004005):访问被拒绝
我有一个带有GetParentProcess(IntPtr handle)方法的结构,用于通过传递句柄返回父进程C# System.ComponentModel.Win32异常(0x80004005):访问被拒绝,c#,process,C#,Process,我有一个带有GetParentProcess(IntPtr handle)方法的结构,用于通过传递句柄返回父进程 [StructLayout(LayoutKind.Sequential)] public struct ParentProcessUtilities { internal IntPtr Reserved1; internal IntPtr PebBaseAddress; internal IntPtr Reserved2_0; internal In
[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()
我正在以管理员权限运行应用程序。感谢您的帮助
smss.exe
是会话管理器子系统,有关详细信息,请参阅此。它是Windows内核启动的第一个用户模式进程,执行许多特权操作。因此,您的普通进程将无权管理此进程,因此“访问被拒绝”异常。好的,所以问题是我的应用程序无权访问此进程。有没有办法显式设置权限来授予正在运行的任何进程访问权限,或者我是否需要以某种方式设置我的用户配置文件?@ChristiánSzeman我建议在这种情况下处理异常,不要使用权限。您正在处理的进程是操作系统的一部分,因此请避免接触它。但是,如果您有正当理由这样做,那么就有“作为操作系统的一部分”权限。如果您只想查询有关进程的基本信息,您可以将WMI视为备选方案。我已经这样做了,但是WMI比这种方法慢得多。在这种特殊情况下,我希望尽快得到结果