精確定管理員及權限提升
提供的程式碼片段準確地識別了管理員狀態,但缺乏區分標準管理員權限和提升權限的能力。 此增強功能解決了該限制。
此解決方案涉及一種確定海拔狀態的精細方法:
改良的IsProcessElevated
方法:
此增強方法利用 GetTokenInformation
函數直接確定進程提升級別,並考慮使用者帳戶控制 (UAC) 設定:
<code class="language-csharp">public static bool IsProcessElevated { get { // Check UAC status if (UacHelper.IsUacEnabled) { // Obtain process token IntPtr tokenHandle; if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle)) { throw new ApplicationException($"Failed to retrieve process token. Win32 Error Code: {Marshal.GetLastWin32Error()}"); } // Retrieve elevation type TOKEN_ELEVATION_TYPE elevationResult = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault; int elevationResultSize = Marshal.SizeOf((int)elevationResult); uint returnedSize = 0; IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize); bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType, elevationTypePtr, (uint)elevationResultSize, out returnedSize); if (success) { elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr); return elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull; } else { throw new ApplicationException("Elevation status determination failed."); } } else { // Fallback to standard administrator check if UAC is disabled WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } }</code>
此方法可以穩健地處理啟用 UAC 和停用 UAC 的場景,從而可靠地決定提升的權限。
以上是如何可靠地確定進程是否正在以提升的權限運行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!