Web & Development

웹과 개발 관련 정보 페이지 입니다.

[Visual Studio] 매체 제어 솔루션 개발 소스작성자 연성민2016-09-09조회수 629

프레임워크 환경 : .Net Framework 2.0

언어 : C#

IDE : Visual Studio 2015

 

<Main UI>

 

<Main Source>

 

using System;
using System.Diagnostics;
using System.Reflection;
using System.Windows.Forms;
using Microsoft.Win32;
using USBStorage.Properties;
 
namespace USBStorage
{
    public partial class FrmUsbControl : Form
    {
        public FrmUsbControl()
        {
            InitializeComponent();
 
            if (CheckHklmValue("SYSTEM\\CurrentControlSet\\Services\\UsbStor""Start", 4) ||
                CheckHklmValue("SOFTWARE\\Policies\\Microsoft\\Windows\\RemovableStorageDevices""Deny_All", 1))
                // 액세스 차단 레지스트리 값과 비교하여 일치
                lbStatus.Text = "액세스 차단";
            else if (CheckHklmValue("SYSTEM\\CurrentControlSet\\Control\\StorageDevicePolicies""WriteProtect", 1))
                // 읽기 전용 레지스트리 값과 비교하여 일치
                lbStatus.Text = "읽기 전용";
            else
                // 그 이외의 경우 읽기 / 쓰기 허용 (기본)
                lbStatus.Text = "읽기 / 쓰기 허용";
        }
 
        /// <summary>
        ///     HKEY_LOCAL_MACHINE 에 해당되는 레지스트리의 값을 수정한다.
        /// </summary>
        /// <param name="regSubKey">HKEY_LOCAL_MACHINE 하위 키</param>
        /// <param name="valueName">수정할 레지스트리의 이름</param>
        /// <param name="value">수정할 값</param>
        private void SetHklmRegisterValue(string regSubKey, string valueName, int value)
        {
            // 서브키를 얻어온다. 없으면 null
            var rk = Registry.LocalMachine.OpenSubKey(regSubKey, true);
            // 없으면 서브키를 만든다.
            if (rk == null)
                rk = Registry.LocalMachine.CreateSubKey(regSubKey);
            rk.SetValue(valueName, value, RegistryValueKind.DWord);
        }
 
        /// <summary>
        /// HKEY_LOCAL_MACHINE 에 해당되는 레지스트리의 값을 비교 값과 검사한다.
        /// </summary>
        /// <param name="regSubKey">HKEY_LOCAL_MACHINE 하위 키</param>
        /// <param name="valueName">값 검사할 레지스트리의 이름</param>
        /// <param name="value">비교할 값</param>
        /// <returns>일치하면 true, 아니면 false</returns>
        private bool CheckHklmValue(string regSubKey, string valueName, int value)
        {
            var rk = Registry.LocalMachine.OpenSubKey(regSubKey, true);
            if (rk == null)
                return false;
            return int.Parse(rk.GetValue(valueName).ToString()) == value;
        }
 
        /// <summary>
        /// 재부팅하겠냐는 메세지를 띄우고 응답 여부에 따라 재부팅을 하거나 하지 않는다.
        /// </summary>
        private static void Reboot()
        {
            if (MessageBox.Show("현재 결과를 적용시키려면 재부팅을 하셔야 합니다.\n재부팅을 하시겠습니까?",
                    "재부팅",
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Exclamation,
                    MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                Process.Start("shutdown.exe""-r -t 0");
        }
 
        /// <summary>
        /// 액세스 차단 레지스트리 값을 설정한다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDenyAll_Click(object sender, EventArgs e)
        {
            SetHklmRegisterValue("SYSTEM\\CurrentControlSet\\Services\\UsbStor""Start", 4);
            SetHklmRegisterValue("SOFTWARE\\Policies\\Microsoft\\Windows\\RemovableStorageDevices""Deny_All", 1);
            lbStatus.Text = "엑세스 차단";
            Reboot();
        }
 
        /// <summary>
        /// 액세스 차단을 해제하고 쓰기가 불가능하도록 레지스트리 값을 수정하여 읽기 전용으로 설정한다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReadOnly_Click(object sender, EventArgs e)
        {
            SetHklmRegisterValue("SYSTEM\\CurrentControlSet\\Services\\UsbStor""Start", 3);
            SetHklmRegisterValue("SOFTWARE\\Policies\\Microsoft\\Windows\\RemovableStorageDevices""Deny_All", 0);
            SetHklmRegisterValue("SYSTEM\\CurrentControlSet\\Control\\StorageDevicePolicies""WriteProtect", 1);
            lbStatus.Text = "읽기 전용";
            Reboot();
        }
 
        /// <summary>
        /// 액세스 차단을 해제하고 쓰기도 허용하도록 복원한다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReadWrtie_Click(object sender, EventArgs e)
        {
            SetHklmRegisterValue("SYSTEM\\CurrentControlSet\\Services\\UsbStor""Start", 3);
            SetHklmRegisterValue("SOFTWARE\\Policies\\Microsoft\\Windows\\RemovableStorageDevices""Deny_All", 0);
            SetHklmRegisterValue("SYSTEM\\CurrentControlSet\\Control\\StorageDevicePolicies""WriteProtect", 0);
            lbStatus.Text = "읽기 / 쓰기 허용";
            Reboot();
        } 
    }

 

 

<관리자 권한으로 실행>

프로젝트 설정 -> 보안 -> ClickOnce 보안 설정 사용 체크 -> app.manifest 파일 생성 확인 -> ClickOnce 보안 설정 사용 체크 해제

  • App.manifest

    <requestedExecutionLevel level="asInvoker" uiAccess="false" /> ->

        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

 

생성된 app.manifest 파일의 코드를 위와 같이 변경합니다.

 

빌드 후 위와 같이 실행 시 관리자 권한으로 필요하다는 아이콘이 생성됩니다.