var hasElevated = false;
var processName = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(processName);
foreach (var process in processes)
{
Console.WriteLine($"进程名称: {process.ProcessName}");
hasElevated = ProcessHasElevatedPrivileges(process);
Console.WriteLine($"特权: {hasElevated}");
if (hasElevated) break;
}
static bool ProcessHasElevatedPrivileges(Process process)
{
if (Environment.OSVersion.Version.Major >= 6)
{
IntPtr hObject = process.Handle;
return IsProcessElevated(hObject);
}
return false;
}
static bool IsProcessElevated(IntPtr hProcess)
{
if (!NativeMethods.OpenProcessToken(hProcess, 0x20 | 0x0008, out IntPtr hToken))
{
throw new System.ComponentModel.Win32Exception();
}
var elevation = default(NativeMethods.TOKEN_ELEVATION); // 初始化 elevation
try
{
if (!NativeMethods.GetTokenInformation(hToken, NativeMethods.TOKEN_INFORMATION_CLASS.TokenElevation, ref elevation, Marshal.SizeOf(typeof(NativeMethods.TOKEN_ELEVATION)), out var returnLength))
{
throw new System.ComponentModel.Win32Exception();
}
return elevation.TokenIsElevated != 0;
}
finally
{
NativeMethods.CloseHandle(hToken);
}
}
internal static class NativeMethods
{
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool OpenProcessToken(IntPtr processHandle, uint desiredAccess, out IntPtr tokenHandle);
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool GetTokenInformation(IntPtr tokenHandle, TOKEN_INFORMATION_CLASS tokenInformationClass, ref TOKEN_ELEVATION TokenInformation, int tokenInformationLength, out int returnLength);
public enum TOKEN_INFORMATION_CLASS
{
TokenElevation = 20,
TokenElevationType
}
[StructLayout(LayoutKind.Sequential)]
public struct TOKEN_ELEVATION
{
public int TokenIsElevated;
}
}
C# 查询一个进程是否有管理员权限
最新推荐文章于 2025-03-10 20:17:27 发布