DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

UACが有効か調べる

コンピュータの設定でUACが有効になっているかを調べる方法を紹介します。

レジストリを調べる

UACの設定は、レジストリの「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System」に保存されています。このキーにある「EnableLUA」の値が存在しないか0の時はUACが無効で、0以外(大抵は1)の時はUACが有効です。

この方法でUACが有効になっているか調べるメソッドの例を示します。

VB.NET
コードを隠すコードを選択
''' <summary>
''' UACが有効になっているかを調べる
''' </summary>
''' <returns>UACが有効になっている時はtrue。</returns>
Public Shared Function IsUacEnabled() As Boolean
    'キーを開く
    Dim regKey As Microsoft.Win32.RegistryKey = _
        Microsoft.Win32.Registry.LocalMachine.OpenSubKey( _
            "SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System")
    'キーが見つからない時はUACが有効ではない
    If regKey Is Nothing Then
        Return False
    End If
    '値を読み取る
    Dim val As Integer = CInt(regKey.GetValue("EnableLUA", 0))
    '0以外の時はUACが有効
    Return val <> 0
End Function
C#
コードを隠すコードを選択
/// <summary>
/// UACが有効になっているかを調べる
/// </summary>
/// <returns>UACが有効になっている時はtrue。</returns>
public static bool IsUacEnabled()
{
    //キーを開く
    Microsoft.Win32.RegistryKey regKey =
        Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
            @"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System");
    //キーが見つからない時はUACが有効ではない
    if (regKey == null)
        return false;
    //値を読み取る
    int val = (int)regKey.GetValue("EnableLUA", 0);
    //0以外の時はUACが有効
    return val != 0;
}

GetTokenInformationで昇格の情報を調べる

レジストリの設定と現在のUACの状態が完全に一致するとは断定できません。例えば、設定を変更しても、再起動前でその設定が反映されていない状況もあり得ます。

現在UACが有効になっているかを調べるには、GetTokenInformation関数を使って現在のユーザーの昇格の状態を調べる方法があります。GetTokenInformationで取得したTOKEN_ELEVATION_TYPEがTokenElevationTypeFullかTokenElevationTypeLimitedであれば、ユーザーは分割されたトークンを使っているので、UACは有効になっています。TokenElevationTypeDefaultであれば、分割されたトークンは使われていないため、UACが無効になっているか、標準ユーザーかのどちらか(あるいは両方)です。

GetTokenInformationでTOKEN_ELEVATION_TYPEを取得するコードは「現在のユーザーが管理者か調べる」で紹介していますので、そちらをご覧ください。

以下に、「現在のユーザーが管理者か調べる」で紹介しているGetTokenElevationTypeメソッドを使ってUACが有効になっているか調べる例を示します。

VB.NET
コードを隠すコードを選択
Dim tet As TOKEN_ELEVATION_TYPE = GetTokenElevationType()
If tet = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault Then
    Console.WriteLine("UACが無効になっているか、標準ユーザーです")
Else
    Console.WriteLine("UACが有効になっています")
End If
C#
コードを隠すコードを選択
TOKEN_ELEVATION_TYPE tet = GetTokenElevationType();
if (tet == TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault)
{
    Console.WriteLine("UACが無効になっているか、標準ユーザーです");
}
else
{
    Console.WriteLine("UACが有効になっています");
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。