EMDI는 지금도 개발중

C# : 공인인증서 NPKI 폴더 위치 찾기 및 콤보박스에 목록 보여주기 본문

언어/C#

C# : 공인인증서 NPKI 폴더 위치 찾기 및 콤보박스에 목록 보여주기

EMDI 2020. 4. 1. 11:00

이번 글에서는 yessign 폴더에 있는 공인인증서의 이름을 콤보박스에 넣는 방법에 대해 알아보도록 합시다.

// 전역변수
// 인증서 콤보박스에 쓸 DataTable
DataTable _dtCertInfo = new DataTable();


// 생성자
public Form1()
{
    InitializeComponent();
    // 콤보박스 초기
    setComboBox();
}

// 콤보박스 초기작업
private void setComboBox()
{
    _dtCertInfo = new DataTable();
    // NPKI를 컬럼에 추가
    if (!_dtCertInfo.Columns.Contains("NPKI")) _dtCertInfo.Columns.Add("NPKI");

    // _dtCertInfo을 콤보박스에 세팅
    cmbCert.DataSource = _dtCertInfo;
    cmbCert.DisplayMember = "NPKI";
    cmbCert.ValueMember = "NPKI";
}

// 가져오기 버튼 이벤트
private void btnCertInfo_Click(object sender, EventArgs e)
{
    appdataNPKI();
    programNPKI();
    ProgramX86NPKI();
}

private void appdataNPKI()
{
    string path = string.Empty;
    string strsub = string.Empty;

    DataTable dt = new DataTable();
    dt.Columns.Add("NPKI");

    DataRow dr = null;
    path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile).ToString();
    path += "\\AppData\\LocalLow\\NPKI\\yessign\\User\\";

    // 우선 해당 폴더가 있는지부터 체크
    DirectoryInfo dir = new DirectoryInfo(path);
    if(dir.Exists == true)
    {
        foreach (var item in dir.GetDirectories())
        {
            dr = dt.Rows.Add();
            dr["NPKI"] = item.Name.ToString();
        }
    }

    if(dt.Rows.Count>0)
    {
   		_dtCertInfo.Merge(dt);
    }

}


private void programNPKI()
{
    string path = string.Empty;
    string strsub = string.Empty;

    DataTable dt = new DataTable();
    dt.Columns.Add("NPKI");

    DataRow dr = null;
    path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles).ToString();
    path += "\\NPKI\\yessign\\User\\";

    // 우선 해당 폴더가 있는지부터 체크
    DirectoryInfo dir = new DirectoryInfo(path);
    if (dir.Exists == true)
    {
        foreach (var item in dir.GetDirectories())
        {
            dr = dt.Rows.Add();
            dr["NPKI"] = item.Name.ToString();
        }
    }

    if (dt.Rows.Count > 0)
    {
    	_dtCertInfo.Merge(dt);
    }

}

private void ProgramX86NPKI()
{
    string path = string.Empty;
    string strsub = string.Empty;

    DataTable dt = new DataTable();
    dt.Columns.Add("NPKI");

    DataRow dr = null;
    path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86).ToString();
    path += "\\NPKI\\yessign\\User\\";

    // 우선 해당 폴더가 있는지부터 체크
    DirectoryInfo dir = new DirectoryInfo(path);
    if (dir.Exists == true)
    {
        foreach (var item in dir.GetDirectories())
        {
        	dr = dt.Rows.Add();
        	dr["NPKI"] = item.Name.ToString();

        }
    }

    if (dt.Rows.Count > 0)
    {
    	_dtCertInfo.Merge(dt);
    }
}

어떤 블로그에서 정리한걸 토대로 만든 소스입니다. 메소드마다 보시면 알 수 있듯이 NPKI가 있는 3개의 경로를 string변수에 넣고 그걸 DirectoryInfo를 사용해서 User폴더가 있는지에 대한 유무와 해당 인증서 이름을 가져올 수 있었습니다.

 

// NPKI 경로를 따기 전 root
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile).ToString();
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86).ToString();
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles).ToString();

NPKI 경로는 Environment를 이용해서 조금 더 편하게 가져올 수 있었네요. 

단, 여기서 문제가 하나 있었으니 바로 Program Files입니다. 위의 소스대로 하면 제 컴퓨터에서는 ProgramFiles와 ProgramFilesX86이 구분되서 안나오고 둘다 ProgramFilesX86경로로 되더군요. 그러기에 살짝 수정하였습니다.

private string GetProgramFilesFolder()
{
    string szPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
    szPath = szPath.Substring(0, 3);
    return szPath + "Program Files";
}


private string GetProgramFilesX86Folder()
{
    string szPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
    szPath = szPath.Substring(0, 3);

    return szPath + "Program Files (x86)";
}

위와 같이 변경하시거나 아니면 ProgramFiles메소드만 이용해도 무관할 듯 하네요~

 

해당 내용은 디렉터리의 이름만 가져온 내용입니다.

다음 글에서는 인증서의 정보를 어디까지 뽑아서 정리할 수 있는지에 대해 공부해보도록 하겠습니다.

Comments