如何偵測具有或不具有提升權限的管理員權限
您目前的程式碼成功識別了管理員狀態,但在確定提升的權限時失敗了。為了全面解決此問題,我們將探討另一種方法。
檢查 UAC 是否啟用
首先,讓我們確定使用者帳戶控制 (UAC) 是否已啟用。 UAC 是一種安全功能,可限制對作業系統的未經授權的變更。如果啟用了 UAC,我們將需要採用不同的方法來檢查提升權限。
<code>RegistryKey uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false); bool isUacEnabled = uacKey.GetValue(uacRegistryValue).Equals(1);</code>
確定進程提升權限
接下來,讓我們檢查目前進程的提升權限狀態。如果啟用了 UAC,我們將使用 GetTokenInformation
函數來擷取令牌提升類型。
<code>IntPtr tokenHandle; if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle)) {throw new ApplicationException("无法获取进程令牌。Win32 错误代码: " + Marshal.GetLastWin32Error());} 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); bool isProcessAdmin = elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull; return isProcessAdmin; }</code>
如果未啟用 UAC,我們可以依靠 WindowsPrincipal.IsInRole
來檢查提升狀態。
<code>WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); bool result = principal.IsInRole(WindowsBuiltInRole.Administrator); return result;</code>
完整解
透過結合這兩種方法,我們可以全面檢測應用程式是否以提升的權限運行,而不管 UAC 狀態如何。
以上是如何可靠地偵測 Windows 中的管理員和提升的權限?的詳細內容。更多資訊請關注PHP中文網其他相關文章!