목차

IT

C# Windows 방화벽 정책 추가/삭제

쏘펀 2024. 3. 4.

목차

C#으로 특정 통신을 받아주는 어플리케이션을 만든 경우, Window OS상에서 제공되는 방화벽에 정책 추가가 필요할 수 있습니다.

 

제어판에서 직접 방화벽 기능에 들어가서 정책을 추가해줘도 되지만, 어플리케이션이 실행될 때 방화벽 정책을 자동으로 추가하도록 코드를 구성할 수 있습니다.

 

구현할 수 있는 방법은 2가지로 아래와 같습니다.

 

1. NetFwTypeLib 사용

2. cmd 명령줄 사용

 

여기서는 cmd 명령줄을 사용하는 방법으로 구현하겠습니다.

public static void WindowsFWRoleAdd()
{
    ProcessStartInfo processStartInfo = new ProcessStartInfo();
    Process process = new Process();

    processStartInfo.FileName = "cmd";
    processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; // 프로세스 실행창 숨기기
    processStartInfo.CreateNoWindow = true;
    processStartInfo.UseShellExecute = false;
    processStartInfo.RedirectStandardOutput = true;
    processStartInfo.RedirectStandardInput = true;          // cmd창으로 데이터 보내기
    processStartInfo.RedirectStandardError = true;          // cmd창에서 오류 내용 가져오기

    process.EnableRaisingEvents = false;
    process.StartInfo = processStartInfo;
    process.Start();
    
    process.StandardInput.Write("netsh advfirewall firewall add rule name = 방화벽룰이름 dir =in action = allow protocol = tcp localport = 8054" + Environment.NewLine);
    
    process.StandardInput.Close();
    process.WaitForExit();
    process.Close();
}

 

위 메소드를 어플리케이션이 시작되는 위치에서 실행해주면 방화벽 정책이 자동으로 추가되게 됩니다.

C# Windows 방화벽 정책 추가/삭제

 

 

 

라고 끝난줄 알았으나!! 이렇게만 하면 프로그램이 실행될때마다 방화벽에 동일한 정책이 계속 추가되는 문제가 있었네요 ㄷㄷㄷ

그래서 룰을 추가하기 전에 아예 해당 이름의 룰을 삭제하는 코드를 추가해줬습니다.

public static void WindowsFWRoleAdd()
{
    ProcessStartInfo processStartInfo = new ProcessStartInfo();
    Process process = new Process();

    processStartInfo.FileName = "cmd";
    processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; // 프로세스 실행창 숨기기
    processStartInfo.CreateNoWindow = true;
    processStartInfo.UseShellExecute = false;
    processStartInfo.RedirectStandardOutput = true;
    processStartInfo.RedirectStandardInput = true;          // cmd창으로 데이터 보내기
    processStartInfo.RedirectStandardError = true;          // cmd창에서 오류 내용 가져오기

    process.EnableRaisingEvents = false;
    process.StartInfo = processStartInfo;
    process.Start();
    
    //방화벽 정책 삭제. 동일한 정책이 계속 추가되는 것을 방지하기 위함.
    process.StandardInput.Write("netsh advfirewall firewall delete rule name= 방화벽룰이름" + Environment.NewLine);
    //방화벽 정책 추가
    process.StandardInput.Write("netsh advfirewall firewall add rule name = 방화벽룰이름 dir =in action = allow protocol = tcp localport = 8054" + Environment.NewLine); 
    
    process.StandardInput.Close();
    process.WaitForExit();
    process.Close();
}

 

이제 진짜 끝!!

댓글