스마트한 개발 공부/WinForm

[WinForm] 레지스트리 / app.config / user.config 에 값 저장하기

스마트한지노 2021. 10. 18. 16:07
728x90
반응형

1. 레지스트리 영역에 값을 저장 (관리자 권한이 아닐때는 실행이 안될수도 있다)

1.1 저장될 경로 찾아보기

  • 실행 - regedit
  • HKEY_LOCAL_MACHINE or  HKEY_CURRENT_USER => SOFTWARE => WOW6432Node (다른 영역은 건드리지 말자....삭제도 조심히 하세요 ㅠㅠ 새로만든 레지스트리 삭제하려다가 폴더하나 날려서 백업도 안해서 윈도우 복원했네요...)

1.2 winform 코딩 

  1. form 추가 (class가 이미 정의되어 있다. 참조 추가할 필요도 없다!)
  2. namespace 추가 using Microsoft.Win32;
  3. 코드 작성
// 레지스트리 생성
RegistryKey reg = Registry.LocalMachine.OpenSubKey("SOFTWARE", true); // true를 안 주면 읽기전용으로 만들어짐!
reg.CreateSubKey("RegistryApp");
reg.Close();

 

// 레지스트리 안에 Key : Value 형태로 값저장
RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\RegistryApp", true);
reg.SetValue("name", "ABC123홍길동");
reg.SetValue("version", 0.1);
reg.Close();
// key값으로 value 값 가져오기 및 값 재설정
// 업데이트 버전체크도 이런 식으로 할 수 있다
RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\RegistryApp", true);
float ver = Convert.ToSingle(reg.GetValue("version", 0.1));
if (ver < 4.5)
{
       //서버에서 파일 다운로드하고 업데이트 한다.(가정)
       //업데이트 성공시 현재 버전을 다시 저장한다.
       reg.SetValue("version", 4.5);
}
reg.Close();
// 레지스트리 삭제
RegistryKey reg = Registry.LocalMachine.OpenSubKey("SOFTWARE\WOW6432Node\RegistryApp", true);
reg.DeleteSubKey("RegistryApp");
reg.Close();

1.3 로그인 화면으로 응용

 

  • 읽고 쓰기용 메소드 만들기
    static string key = "SOFTWARE\WOW6432Node\RegistryApp";
    
    public bool WriteRegKey(string valueName, object value)
    {
        try
        {
            Registry.CurrentUser.CreateSubKey(key).SetValue(valueName, value);
            Registry.CurrentUser.Close();
            return true;
        }
        catch
        {
            return false;
        }
    }
    
    public object ReadRegKey(string valueName, object defaultValue)
    {
        try
        {
            //서브키를 오픈한 후 데이터를 조회한다.
            object readVal = Registry.CurrentUser.CreateSubKey(key).GetValue(valueName);
    
            if (readVal == null)
            {
                //서브키나 데이터가 없는 경우(최초1번)에는 기본값으로 저장한다. 
                Registry.CurrentUser.CreateSubKey(key).SetValue(valueName, defaultValue);
                
                readVal = defaultValue;
            }
            //서브키를 닫는다.
            Registry.CurrentUser.Close();
            return readVal;
        }
        catch
        {
            return defaultValue;
        }
    }​
  • 제일 처음 실행할때는 레지스트리에 저장된 값이 없다 => 저장된 값이 없는 경우에도 오류가 나지 않도록 기본설정값을 셋팅해야한다.
    • Form_load : 레지스트리에 저장된 폼의 크기, 폼의 위치 값을 읽어와서 폼에 적용.
      private void Form1_Load(object sender, EventArgs e)
      {
          this.Left = Convert.ToInt32(RegistryHelp.ReadRegKey("Left", 0));
          this.Top = Convert.ToInt32(RegistryHelp.ReadRegKey("Top", 0));
          this.Width = Convert.ToInt32(RegistryHelp.ReadRegKey("Width", this.Width));
          this.Height = Convert.ToInt32(RegistryHelp.ReadRegKey("Height", this.Height));
      
          textBox1.Text = RegistryHelp.ReadRegKey("userID", "").ToString();
          checkBox1.Checked = Convert.ToBoolean(RegistryHelp.ReadRegKey("userIDSaveCheck", 0));
      }​
    • Form_closing : 레지스트리에 현재 폼의 크기, 폼의 위치 값을 저장해놓고, 폼이 닫힌다.
      private void Form1_FormClosing(object sender, FormClosingEventArgs e)
      {
          RegistryHelp.WriteRegKey("Left", this.Left);
          RegistryHelp.WriteRegKey("Top", this.Top);
          RegistryHelp.WriteRegKey("Width", this.Width);
          RegistryHelp.WriteRegKey("Height", this.Height);
      }
       
  • 로그인ID 저장 버튼을 체크하고 "로그인" 버튼을 눌렀을 때
    private void button1_Click(object sender, EventArgs e)
    {
        //유효성검사
        //DB에서 로그인 체크
        //로그인이 성공했다면
        //사용자정보를 LoginUser 프로퍼티에 저장
        //체크가 되었을때, 레지스트리에 사용자아이디값을 저장
    
        if (textBox1.Text == "root" && textBox2.Text == "1234")
        {
            if (checkBox1.Checked)
            {
                RegistryHelp.WriteRegKey("userID", textBox1.Text);
                RegistryHelp.WriteRegKey("userIDSaveCheck", 1);
            }
            else
            {
                RegistryHelp.WriteRegKey("userID", textBox1.Text);
                RegistryHelp.WriteRegKey("userIDSaveCheck", 0);
            }
    
            MessageBox.Show("로그인성공");
            this.Close();
        }
    }

2. .ini 파일 (파일이므로 탐색기에서 일반사용자에게 노출)

  • 탐색기에 *.ini 를 검색하면 확인해볼 수 있기 때문에 보안에 취약하다. 
public bool WriteRegKey(string valueName, object value)
{
    try
    {
        Registry.CurrentUser.CreateSubKey(key).SetValue(valueName, value);
        Registry.CurrentUser.Close();
        return true;
    }
    catch
    {
        return false;
    }
}

public object ReadRegKey(string valueName, object defaultValue)
{
    try
    {
        //서브키를 오픈한 후 데이터를 조회한다.
        object readVal = Registry.CurrentUser.CreateSubKey(key).GetValue(valueName);

        if (readVal == null)
        {
            //서브키나 데이터가 없는 경우(최초1번)에는 기본값으로 저장한다. 
            Registry.CurrentUser.CreateSubKey(key).SetValue(valueName, defaultValue);
            
            readVal = defaultValue;
        }
        //서브키를 닫는다.
        Registry.CurrentUser.Close();
        return readVal;
    }
    catch
    {
        return defaultValue;
    }
}
//로그인 버튼 클릭시
private void button1_Click(object sender, EventArgs e)
{
    // 유효성검사
    //DB에서 로그인 체크
    //로그인이 성공했다면
    //사용자정보를 LoginUser 프로퍼티에 저장
    //체크가 되었을때, 레지스트리에 사용자아이디값을 저장

    if (textBox1.Text == "root" && textBox2.Text == "1234")
    {
        //로그인id 저장하기를 체크했을때
        if (checkBox1.Checked)
        {
            IniFileHelp ini = new IniFileHelp("C:\\Registry.ini");
            ini.WriteIniFile("Info", "Uid", textBox1.Text);
            ini.WriteIniFile("Info", "CheckYN", checkBox1.Checked ? "1":"0"); //string 형식으로 변수를 주어야한다
        }
        MessageBox.Show("저장성공");
    }
}

private void Form3_Load(object sender, EventArgs e)
{
    //파일이 있는경우에만 실행하기
    if (System.IO.File.Exists("C:\\Registry.ini"))
    {
        IniFileHelp ini = new IniFileHelp("C:\\Registry.ini");
        textBox1.Text = ini.ReadIniFile("Info", "Uid", "");
        if (ini.ReadIniFile("Info", "CheckYN", "0") == "1")
            checkBox1.Checked = true;
        else
            checkBox1.Checked = false;
    }

}

3. Confiig 파일 => App.config / Settings 

3.1 app.config => 컴퓨터의 모든 사용자에게 공통적으로 사용되는값

프로젝트의 Properties 아래에 Setting,settings를 들어가면 이름, 형식, 범위 ,값을 입력할 수 있다. 값을 입력하고 빌드를 하면 app.config파일에 아래 처럼 코드들이 추가된다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
  <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e054" >
   <section name="WindowsFormsRegistry.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
  </sectionGroup>
 </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <userSettings>
        <WindowsFormsRegistry.Properties.Settings>
            <setting name="Email" serializeAs="String">
                <value>xxxxx@gmail.com</value>
            </setting>
        </WindowsFormsRegistry.Properties.Settings>
    </userSettings>
</configuration>

3.2 User Setting /user config=> 컴퓨터의 사용자별로 각자의 값을 저장,읽을 수 있다.

app.config와 다르게 user config는 현재 로그인된 계정의 사용자에 따라서 각자 값을 저장해준다,

Properties.Settings.Default.Email = "aaa@gmail.com";
Properties.Settings.Default.Save();

// 값을 불러올 때도 Properties.Settings.Default.Email 로 호출하면 된다

위의 코드를 실행하면

"C:\Users\계정\AppData\Local\WindowsFormsRegistry\WindowsFormsRegistry.exe_Url_jper2atmirkgdf1e1rftfbmrhyb5dncw\1.0.0.0"
해당 경로로 user.config 파일이 생성된다.

//user.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <WindowsFormsRegistry.Properties.Settings>
            <setting name="Email" serializeAs="String">
                <value>aaa@google.com</value>
            </setting>
        </WindowsFormsRegistry.Properties.Settings>
    </userSettings>
</configuration>

 

728x90
반응형