본문 바로가기

운동하는 개발자/c++

C++ 윈도우 방화벽 설정 / C++ windows firewall

728x90

복잡하게 윈도우 DLL을 이용하지 않고 간단하게 커맨드 명령으로 방화벽 설정이 가능하다
(당연히 관리자 권한 필요)

Netsh 라는 명령어를 사용하는데 이게 윈도우 xp를 이후 버전과 이하버전의 명령어가 다르다

1. 윈도우 버전이 XP 이하인지 확인

bool IsWindowsMajor()
{
	OSVERSIONINFO info;
	ZeroMemory(&info, sizeof(OSVERSIONINFO));
	info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

	GetVersionEx(&info);

	return (info.dwMajorVersion >= 6); //윈XP보다 높은버전일 경우 True
}​

 

* GetVersionEx는 윈8이상부터 정확히 판단하지 못하고 더 이상 쓰이지 않는 함수라고 IsWindows* 함수를 사용하라고 가이드가 뜨지만 어짜피 XP보다 높은지만 알면 되기에 해당 함수 사용

 

2. 해당 윈도우에 맞게 명령

void AddFirewall(string file_path_name)
	{
		int name_posion = file_path_name.rfind("\\") + 1;
		string file_name = file_path_name.substr(name_posion, file_path_name.length() - name_posion);
		string firewall_cmd;

		if (IsWindowsMajor) { //윈XP보다 상위버전
			firewall_cmd = fmt::format("netsh ad firewall show rule name=\"{0}\" || netsh ad firewall add rule name = \"{0}\" dir=in action=allow program=\"{1}\" enable=yes",
				file_name, file_path_name);
		}
		else					//윈 XP이하버전
		{
			firewall_cmd = fmt::format(" netsh firewall add allowedprogram \"{1}\" \"{0}\" ENABLE",
				file_path_name, file_name);
		}
		system(firewall_cmd.c_str());
	}​

 

※ 방화벽 조정시 관리자 권한은 당연히 필수입니다

728x90