利用C#存取Registry註冊檔(登錄檔)

在發展Console程式的時候,我們有時會需要註冊檔(登錄檔)來輔助我們儲存一些資訊與狀態,這篇要示範的就是如何利用C#來存取Windows Registry的方式。

我們都知道,在一般工作站級的Windows作業系統中,Windows Registry的機碼總共分為五大類,分別為:

  1. (HKCR)HKEY_CLASSES_ROOT
  2. (HKCU)HKEY_CURRENT_USER
  3. (HKLM)HKEY_LOCAL_MACHINE
  4. (HKU)HKEY_USERS
  5. (HKCC)HKEY_CURRENT_CONFIG

那麼你可以利用下列的方法去存取這些根機碼:

  1. (HKCR)Microsoft.Win32.Registry.ClassesRoot
  2. (HKCU)Microsoft.Win32.Registry.CurrentUser
  3. (HKLM)Microsoft.Win32.Registry.LocalMachine
  4. (HKU)Microsoft.Win32.Registry.Users
  5. (HKCC)Microsoft.Win32.Registry.CurrentConfig

在這邊也順道提醒,機碼是具有權限性的,如果你今天想要存取例如HKEY_LOCAL_MACHINE等級的機碼,那麼你可能要多付出好幾十行的程式碼去實作Windows ACLs,這將會動用到「System.Security; System.Security.AccessControl; System.Security.Principal;」等namespace下面的類別。

因此,基於偷懶的原因。我們今天要進行存取的是HKEY_USERS這個機碼下面的目錄,比較簡單、可以專注於程式碼上。我們要動用到的namespace是「Microsoft.Win32」。

C#存取Registry的程式碼

假設我們要存取.DEFAULT\SOFTWARE\SlashLook\下面的機碼,但是基本上,SOFTWARE下面根本沒有SlashLook,所以我們的程式碼就要假定它可能不存在,然後試圖去解決它。也就是,如果不存在的話,那就建立;如果存在,那就讀取值。

static void Main(string[] args)
{
	string cRegKeyState = "bIsAccessOK";	//登錄檔的更新狀態KeyName
	string cRegKeyDate = "dLastAccessDate";		//登錄檔的更新日期KeyName

	bool bLastUpdateState;
	DateTime dLastUpdateDate;

	//準備讀取Registry前的動作
	string cRegistryPath = @".DEFAULT\SOFTWARE\SlashLook";
	Microsoft.Win32.RegistryKey oRK = Microsoft.Win32.Registry.Users.CreateSubKey(cRegistryPath);
	oRK = Microsoft.Win32.Registry.Users.OpenSubKey(cRegistryPath, true);

	//到Registry讀取現存參數
	if (
		string.IsNullOrWhiteSpace(System.Convert.ToString(oRK.GetValue(cRegKeyState))) ||
		string.IsNullOrWhiteSpace(System.Convert.ToString(oRK.GetValue(cRegKeyDate))))
	{
		//如果是第一次連註冊檔都讀不到,那就寫完一些必要資訊後就直接跳出
		oRK.SetValue(cRegKeyState, "false", Microsoft.Win32.RegistryValueKind.String);
		oRK.SetValue(cRegKeyDate, System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), Microsoft.Win32.RegistryValueKind.String);
		Console.WriteLine("已建立必要之機碼。");
	}
	else
	{
		bLastUpdateState = System.Convert.ToBoolean(oRK.GetValue(cRegKeyState));
		dLastUpdateDate = System.Convert.ToDateTime(oRK.GetValue(cRegKeyDate));
		Console.WriteLine(bLastUpdateState.ToString());
		Console.WriteLine(dLastUpdateDate.ToString());
	}
	Console.Read();			
}
C# WindowsRegedit WindowsRegistry Access Write Read