ホームページ >バックエンド開発 >C++ >Windows で管理者特権と昇格された特権を確実に検出する方法は?

Windows で管理者特権と昇格された特権を確実に検出する方法は?

DDD
DDDオリジナル
2025-01-13 08:44:42609ブラウズ

How to Reliably Detect Administrator and Elevated Privileges in Windows?

昇格された特権の有無にかかわらず管理者権限を検出する方法

現在のコードは管理者ステータスを正常に識別しますが、昇格された特権を決定するときに失敗します。この問題に包括的に対処するために、別のアプローチを検討します。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。