65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows XP SP2 防火墙控制器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (36投票s)

2005年7月6日

2分钟阅读

viewsIcon

221015

downloadIcon

5938

如何使用 COM 控制 Windows XP SP2 中包含的基础防火墙。

Sample Image - WinXPSP2Firewall.jpg

引言

Windows XP SP2 基本上有一个小型的防火墙。它很容易控制,但有时会让你感到困扰。当你的应用程序尝试连接到互联网时,Windows 会显示一个警告消息框,这会让用户觉得你的应用程序是一个广告软件。

为了防止这种情况,我建议你将你的程序添加到防火墙集合列表中。(此列表包含允许的程序。)

这个封装类非常简单、实用。你不再需要看到“安全警报”消息框了。

Sample Image - Windows Firewall Security Alert Message Box

实现 - C++

这很简单。只需将 Windows XP 防火墙作为 COM 连接起来,然后执行你想要的操作即可。

FW_ERROR_CODE WinXPSP2FireWall::Initialize()
{
 HRESULT hr = S_FALSE;
 INetFwMgr* fwMgr = NULL;
 INetFwPolicy* fwPolicy = NULL;

 FW_ERROR_CODE ret = FW_NOERROR;
 try
 {
  if( m_pFireWallProfile )
   throw FW_ERR_INITIALIZED;
  /* Create an instance of the firewall settings manager. */
  hr = CoCreateInstance( __uuidof(NetFwMgr), NULL, 
         CLSCTX_INPROC_SERVER, __uuidof( INetFwMgr), (void**)&fwMgr );
  if( FAILED( hr ))
   throw FW_ERR_CREATE_SETTING_MANAGER;
  /* Retrieve the local firewall policy. */
  hr = fwMgr->get_LocalPolicy( &fwPolicy );
  if( FAILED( hr ))
   throw FW_ERR_LOCAL_POLICY;
  /* Retrieve the firewall profile currently in effect */

  hr = fwPolicy->get_CurrentProfile( &m_pFireWallProfile );
  if( FAILED( hr ))
   throw FW_ERR_PROFILE;
 }
 catch( FW_ERROR_CODE nError)
 {
  ret = nError;
 }
 if( fwPolicy )
  fwPolicy->Release();
 if( fwMgr )
  fwMgr->Release();
 return ret;
}

C++ 中的使用方法

使用起来非常简单。只需创建一个实例,然后调用 Initialize()。确保在调用 CoInitialize() 之后调用 Initialize() 函数。你可以自己调用 Uninitialize(),但析构函数也会调用该函数。另外,你应该知道,在调用 CoUninitialize() 之前,必须先调用 Uninitialize()

{
 WinXPSP2FireWall fw;
 fw.Initialize();
 wchar_t szApplication[MAX_PATH];
 GetCurrentDirectoryW( MAX_PATH, szApplication );

#ifdef _DEBUG

  wcscat(szApplication, L"file://Debug//WindowsFirewall.exe");
#else
 wcscat( szApplication, L"file://Release//WindowsFirewall.exe");
#endif

 fw.AddApplication( szApplication, L"FireWallTest");
 fw.RemoveApplication( szApplication );
 fw.AddPort( 4321, NET_FW_IP_PROTOCOL_TCP, L"FireWallPortTest" );
 fw.RemovePort( 4321, NET_FW_IP_PROTOCOL_TCP );
 fw.Uninitialize();
}

C# 中的使用方法

C# 中的用法与 C++ 非常相似。但它不需要 COM 接口的 API,这使得在 C# 中实现它比在 C++ 中更容易。分配 WinXPSP2FireWall 的一个实例,并首先调用 Initialize()。然后使用你想要的方法。就这些了!:)

Moah.WinXPSP2FireWall fw = new Moah.WinXPSP2FireWall();
fw.Initialize();

string strApplication = System.Environment.CurrentDirectory + 
                        "\\WindowsFirewall.exe";
fw.AddApplication(strApplication, "FireWallTest");
fw.RemoveApplication(strApplication);

fw.AddPort(4321, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP, 
           "FireWallPortTest");
fw.RemovePort(4321, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP);

C++ 感谢

要编译此项目,你需要四个文件:netfw.hnetfw.idlicftypes.hicftypes.idl。你可以从 Windows XP SP2 PSDK 获取这些文件。或者,我已经将这些文件包含在下载中。你可以直接使用它们,而无需下载和安装 SDK。

C# 感谢

如果在使用 NetFwTypeLib 时出现错误,请添加对 hnetcfg.dll 的引用。你可以在 Visual Studio 中通过“项目 -> 添加引用... -> 浏览”来执行此操作,并且 DLL 文件通常位于“C:\Windows\System32\hnetcfg.dll”。

历史

  • 2005年7月6日
    • 首次发布。
  • 2006年7月10日
    • 添加了 Windows XP SP2 防火墙控制器的 C# 版本。
© . All rights reserved.