개발자 블로그

C# Windows 방화벽에 의한 차단여부 확인 본문

프로그래밍/Windows

C# Windows 방화벽에 의한 차단여부 확인

로이드.Roid 2017. 2. 21. 03:03

일단 "FirewallAPI.dll" 파일을 참조로 추가해 줘야 된다. "FirewallAPI.dll" 파일은 "C:\Windows\System32" 폴더 밑에서 찾을 수 있다.


일단 FirewallManager 관련 클래스

using NetFwTypeLib;
using System;

namespace Test.Utils {
    class FirewallAppInfo {
        public bool mListAdded; // 방화벽 앱 목록에 추가되어있는지 여부
        public bool mEnabled;   // 방화벽 앱 목록에 '허용'으로 되어있는지 여부
    }

    class MyFirewallManager {
        private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}";
        private INetFwMgr mFirewallMng = null;

        public MyFirewallManager() {
            // firewall manager 객체 생성
            Type objectType = Type.GetTypeFromCLSID(new Guid(CLSID_FIREWALL_MANAGER));
            mFirewallMng = Activator.CreateInstance(objectType) as INetFwMgr;
        }

        public FirewallAppInfo getAppInfo(string appPathName) {
            INetFwAuthorizedApplication authoredApp = findApp(appPathName);

            FirewallAppInfo appInfo = new FirewallAppInfo();
            
            if(authoredApp == null) {
                appInfo.mListAdded = false;
                appInfo.mEnabled = false;
            } else {
                appInfo.mListAdded = true;
                appInfo.mEnabled = authoredApp.Enabled;
            }

            return appInfo;
        }

        private INetFwAuthorizedApplication findApp(string appPathName) {
            foreach (INetFwAuthorizedApplication app in mFirewallMng.LocalPolicy.CurrentProfile.AuthorizedApplications) {

                // 일치하는 앱을 찾음
                if (app.ProcessImageFileName.ToLower().Equals(appPathName.ToLower())) {
                    return app;
                }
            }

            return null;
        }
    }
}

위 클래스를 사용하는 예제 코드

MyFirewallManager firewallMng = new MyFirewallManager();
FirewallAppInfo appInfo = firewallMng.getAppInfo(Application.ExecutablePath);

// 방화벽 앱 목록에 없음 - 프로그램을 최초로 실행시키는 경우
if(appInfo.mListAdded == false) {
    // TODO : 필요한 처리 추가
} 
// 방화벽에 허용된 앱으로 등록되지 않았음 - "액세스" 허용 하지 않은 경우
else if(appInfo.mEnabled == false) {
    // TODO : 필요한 처리 추가
}


굳이 목록에 없는 경우를 별도로 체크하는건 처음 프로그램을 실행했을 때 아래 이미지처럼 방화벽 관련 대화상자가 뜨게 되는데 이 때 엑세스를 허용하라고 안내메시지를 보여주기 위함이다.


여기서 만약 "취소"를 선택하게 되면 방화벽 앱 목록에는 추가되지만 "허용"이 아닌 상태가 된다. 위 코드에서는 "else if(appInfo.mEnabled == false)"인 상태. 이 때는 방화벽에서 통신을 허용하라고 필요한 메시지를 보여주고 프로그램을 종료한다.


프로그램 코드를 통해서 방화벽에 등록 할 수도 있지만 관리자 권한으로 프로그램을 실행해야 된다. 만약 별도의 setup 프로그램이 있다면 설치과정에서 이러한 처리들을 해주면 될 것 같은데 portable 프로그램이라서 조금 애매하다. 

당연히 "액세스 허용"을 선택할거라고 생각했는데 그렇지 않는 사람들도 좀 있는 것 같다. 개인적으로 portable 방식의 프로그램을 좋아하는데.. 어떻게 처리해야 될지 고민이네. 

Comments