Heim >Backend-Entwicklung >C++ >Wie kann ich genau feststellen, ob ein Prozess in Windows über erhöhte Berechtigungen verfügt?
Über die Administratorrolle hinaus: Bestimmen Sie den Status der Berechtigungserhöhung
Der Code, der ursprünglich zum Erkennen des Administratorstatus verwendet wurde, war in seiner Fähigkeit, eine Eskalation von Berechtigungen zu erkennen, eingeschränkt, da er Situationen wie die Ausführung als Administrator, aber keine Erhöhung von Berechtigungen nicht berücksichtigte. Dies erleichtert Administratoren die Durchführung sensibler Vorgänge ohne entsprechende Autorisierung.
Um dieses Problem zu lösen, ist ein umfassenderer Ansatz zur Bestimmung des Administratorstatus und der tatsächlichen Höhenstufe erforderlich. Das folgende Codebeispiel bietet eine Lösung:
<code class="language-csharp">using Microsoft.Win32; using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Security.Principal; public static class UacHelper { // 用于确定UAC状态的UAC注册表项和值 private const string uacRegistryKey = "Software\Microsoft\Windows\CurrentVersion\Policies\System"; private const string uacRegistryValue = "EnableLUA"; // 令牌访问和查询常量 private static uint STANDARD_RIGHTS_READ = 0x00020000; private static uint TOKEN_QUERY = 0x0008; private static uint TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY); // 用于打开具有所需访问权限的进程令牌的函数 [DllImport("advapi32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle); // 用于获取令牌信息(例如提升级别)的函数 [DllImport("advapi32.dll", SetLastError = true)] public static extern bool GetTokenInformation(IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, uint TokenInformationLength, out uint ReturnLength); // 用于检索提升类型的令牌信息类 public enum TOKEN_INFORMATION_CLASS { TokenElevationType = 9 } // 可能的提升级别 public enum TOKEN_ELEVATION_TYPE { TokenElevationTypeDefault = 1, TokenElevationTypeFull, TokenElevationTypeLimited } // 检查UAC是否启用 public static bool IsUacEnabled { get { using (var uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false)) { return uacKey.GetValue(uacRegistryValue).Equals(1); } } } // 检查当前进程是否已提升 public static bool IsProcessElevated { get { if (IsUacEnabled) { // 当前进程令牌的句柄 IntPtr tokenHandle; // 尝试以读取访问权限打开进程令牌 if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle)) { throw new ApplicationException("无法获取进程令牌。Win32错误代码:" + Marshal.GetLastWin32Error()); } // 分配内存以存储提升信息 int elevationResultSize = Marshal.SizeOf((int)TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault); IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize); // 从令牌中检索提升类型 uint returnedSize; bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType, elevationTypePtr, (uint)elevationResultSize, out returnedSize); // 检查操作是否成功 if (success) { // 从已分配的内存中读取提升类型 var elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr); // 判断进程是否具有完全提升权限 return elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull; } else { throw new ApplicationException("无法确定当前提升级别。"); } } else { // UAC未启用,依靠WindowsPrincipal检查管理员角色 WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } } }</code>
Verwendung:
Um diesen Code zu verwenden, rufen Sie einfach das IsProcessElevated
-Attribut auf:
<code class="language-csharp">bool isElevated = UacHelper.IsProcessElevated;</code>
Gibt true
zurück, wenn der Prozess mit vollen Berechtigungen erhöht wurde, false
andernfalls. Darüber hinaus können Sie mithilfe des Attributs IsUacEnabled
überprüfen, ob UAC auf Ihrem System aktiviert ist.
Das obige ist der detaillierte Inhalt vonWie kann ich genau feststellen, ob ein Prozess in Windows über erhöhte Berechtigungen verfügt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!