개발자 블로그
C# Windows 방화벽에 의한 차단여부 확인 본문
일단 "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 방식의 프로그램을 좋아하는데.. 어떻게 처리해야 될지 고민이네.
'프로그래밍 > Windows' 카테고리의 다른 글
Visual Studio "값은 null일 수 없습니다." 해결 방법 (0) | 2017.10.21 |
---|---|
Visual Studio에서 아이콘을 제대로 변경했는데도 안바뀐다면? (2) | 2016.04.29 |
C# 윈폼 - 소스코드를 통한 콤보박스 변경시 이벤트 안받게하려면 (0) | 2016.04.13 |
C# TextBox BackgroundImage 적용하기 (0) | 2016.03.25 |
카카오톡PC에서 사용하는 오픈소스 라이브러리 (0) | 2016.03.18 |
Comments