昇格された特権の有無にかかわらず管理者権限を検出する方法
現在のコードは管理者ステータスを正常に識別しますが、昇格された特権を決定するときに失敗します。この問題に包括的に対処するために、別のアプローチを検討します。
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>
完全な解決策
これら 2 つの方法を組み合わせることで、UAC ステータスに関係なく、アプリケーションが昇格された特権で実行されているかどうかを包括的に検出できます。
以上がWindows で管理者特権と昇格された特権を確実に検出する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。