[C#] レジストリ操作まとめ(読み込み・書き込み・削除・存在チェックなど)


はじめに

今回は、C#を利用したレジストリ操作に関する備忘録です。

レジストリ操作はよく利用するため、忘れたら調べての繰り返しをなくすために、基本的に利用するものをまとめておきます。

 

アクセス先ルートを設定

レジストリルートをそれぞれ取得します。

32bitの場合、「RegistryView.Registry64」を指定します。

RegistryKey root = null;

// HKEY_LOCAL_MACHINE
root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);

// HKEY_CURRENT_USER
root = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);

// HKEY_CLASSES_ROOT
root = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry32);

// HKEY_CURRENT_CONFIG
root = RegistryKey.OpenBaseKey(RegistryHive.CurrentConfig, RegistryView.Registry32);

// HKEY_USERS
root = RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Registry32);

 

64bitの場合、「RegistryView.Registry64」を指定します。

RegistryKey root = null;

// HKEY_LOCAL_MACHINE
root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);

// HKEY_CURRENT_USER
root = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);

// HKEY_CLASSES_ROOT
root = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64);

// HKEY_CURRENT_CONFIG
root = RegistryKey.OpenBaseKey(RegistryHive.CurrentConfig, RegistryView.Registry64);

// HKEY_USERS
root = RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Registry64);

 

存在チェック

返り値:bool(True・・・存在する)

public bool IsExist(RegistryKey root, string regPath, string regName)
{
    RegistryKey regKey = null;
    try
    {
        regKey = root.OpenSubKey(regPath);
        if(regKey != null)
        {
            if(string.IsNullOrEmpty(regName) == false)
            {
                if(regKey.GetValue(regName) != null)
                {
                    return true;   
                }
            }
            else
            {
                return true;   
            }
        }
    }
    catch(Exception)
    {
    }
    finally
    {
        if(regKey != null)
        {
            regKey.Close();   
        }
    }
    return false;
}

 

レジストリの値を取得する

返り値:object

public object GetValue(RegistryKey root, string regPath, string regName)
{
    object regVaue = null;
    RegistryKey regKey = null;

    try
    {
        regKey = root.OpenSubKey(regPath);
        if(regKey != null)
        {
            if(string.IsNullOrEmpty(regName) == false)
            {
                return regKey.GetValue(regName);
            }
        }
    }
    catch(Exception)
    {
    }
    finally
    {
        if(regKey != null)
        {
            regKey.Close();   
        }
    }
    return null;
}

 

文字列型で書き込み

返り値:bool(True・・・成功)

public bool WriteRegString(RegistryKey root, string regPath, string regName, string regValue)
{
    RegistryKey regKey = null;

    try
    {
        regKey = root.OpenSubKey(regPath);
        if(regKey != null)
        {
            if(string.IsNullOrEmpty(regName) == false)
            {
                regKey.SetValue(regName, regValue);
                return true
            }
        }

    }
    catch(Exception)
    {
    }
    finally
    {
        if(regKey != null)
        {
            regKey.Close();   
        }
    }
    return false;

}

 

数値型で書き込み

返り値:bool(True・・・成功)

public bool WriteRegInteger(RegistryKey root, string regPath, string regName, int regValue)
{
    RegistryKey regKey = null;

    try
    {
        regKey = root.OpenSubKey(regPath);
        if(regKey != null)
        {
            if(string.IsNullOrEmpty(regName) == false)
            {
                regKey.SetValue(regName, regValue);
                return true
            }
        }

    }
    catch(Exception)
    {
    }
    finally
    {
        if(regKey != null)
        {
            regKey.Close();   
        }
    }
    return false;

}

 

レジストリキーを削除する

返り値:bool(True・・・成功)

public bool DeleteValue(RegistryKey root, string regPath, string regName)
{
    RegistryKey regKey = null;

    try
    {
        regKey = root.OpenSubKey(regPath);
        if(regKey != null)
        {
            regKey.DeleteSubKey(regPath, false);
        }

    }
    catch(Exception)
    {
    }
    finally
    {
        if(regKey != null)
        {
            regKey.Close();   
        }
    }
    return false;

}

 

レジストリ値を削除する

返り値:bool(True・・・成功)

public bool DeleteValue(RegistryKey root, string regPath, string regName)
{
    RegistryKey regKey = null;

    try
    {
        regKey = root.OpenSubKey(regPath);
        if(regKey != null)
        {
            if(string.IsNullOrEmpty(regName) == false)
            {
                regKey.DeleteValue(regName, false);
                return true
            }
        }

    }
    catch(Exception)
    {
    }
    finally
    {
        if(regKey != null)
        {
            regKey.Close();   
        }
    }
    return false;

}

 

レジストリ値の種類を調べる

返り値:Type(レジストリの種類)

public Type DeleteValue(RegistryKey root, string regPath, string regName)
{
    RegistryKey regKey = null;

    try
    {
        regKey = root.OpenSubKey(regPath);
        if(regKey != null)
        {
            if(string.IsNullOrEmpty(regName) == false)
            {
                object regValue = regKey.GetValue(regName);
                return regValue.GetType();
            }
        }

    }
    catch(Exception)
    {
    }
    finally
    {
        if(regKey != null)
        {
            regKey.Close();   
        }
    }
    return null;

}

 

最後に

よく使う簡単なレジストリ操作をメソッドごとにまとめてみました。

そのままコピペもOKです。

結構 RegistryKey.LocalMachine.OpenSubKey を利用する記事は見かけますが、HKEY_LOCAL_MACHINE意外のレジストリも操作したいことが多いと思いますので、選別できる様にしました。

また、32bit用のレジストリと64bit用のレジストリのルートも選択できる様にしておけば、ほぼ問題はなさそう。。

書き込み時に、REG_SZ/REG_DWORD意外で書き込みたい場合は、

regkey.SetValue("QWord", regValue, Microsoft.Win32.RegistryValueKind.QWord);

のように指定するとその型で書き込みができますので参考までに。