事实上,Windows提供了接口供我们配置防火墙。我们只需要调用接口的方法,在防火墙的配置中加入将我们的程序发布的相关信息就可以了。
这一接口要求用户系统版本至不得xp sp2用户。权限为管理员权限(这个几乎可以忽略,但还是要提醒一下)
设置Windows防火墙的接口比较多,在这个Demo中主要用了以下几种:
INetFwMgr:从字面意思上也可以看出这个接口提供了防火墙管理的方法,比如取得配
置信息。继承自IUnknow,IDispatch
INetFwProfile:通过这个接口可以取得防火墙的配置文件,比如有那些应该程序是被援
权了的。
INetFwPolicy:继承自IUnknow,IDispatch。通过这个接口我可以得到当前防火墙的访
问策略。
好了,不多说了,还是上代码先:
关于代码的说明:
1。以下代码在Visual Studio 2005 3级警告下通过编译,0 warning,0 error
2,用户可能会提示找不到文件netfw.h,用户可以从这里下载,下载后请放到你的VS安装目录下的Include下,比如我的就是:C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\netfw.h,可以放到你的工程目录下,但不建议。
用户可以从这里下载原代码:下载
工程中有以下全局变量:
1
//
Global Data
2 INetFwMgr * g_pFwMgr = NULL;
3 INetFwProfile * g_pFwProfile = NULL;
4 INetFwPolicy * g_pFwProlicy = NULL;
2 INetFwMgr * g_pFwMgr = NULL;
3 INetFwProfile * g_pFwProfile = NULL;
4 INetFwPolicy * g_pFwProlicy = NULL;
首先是初始化的代码:
1
bool
Initial()
2 {
3 CoInitializeEx(NULL,COINIT_MULTITHREADED);
4
5 HRESULT hr = CoCreateInstance(__uuidof(NetFwMgr), 0, CLSCTX_INPROC_SERVER,__uuidof(INetFwMgr),reinterpret_cast<void **>(&g_pFwMgr));
6
7 if (SUCCEEDED(hr) && (g_pFwMgr != NULL))
8 {
9 hr = g_pFwMgr->get_LocalPolicy( &g_pFwProlicy );
10 if (SUCCEEDED(hr) && (g_pFwProlicy != NULL))
11 {
12 hr = g_pFwProlicy->get_CurrentProfile( &g_pFwProfile );
13 }
14 }
15 return SUCCEEDED(hr) && (g_pFwProfile != NULL);
16}
2 {
3 CoInitializeEx(NULL,COINIT_MULTITHREADED);
4
5 HRESULT hr = CoCreateInstance(__uuidof(NetFwMgr), 0, CLSCTX_INPROC_SERVER,__uuidof(INetFwMgr),reinterpret_cast<void **>(&g_pFwMgr));
6
7 if (SUCCEEDED(hr) && (g_pFwMgr != NULL))
8 {
9 hr = g_pFwMgr->get_LocalPolicy( &g_pFwProlicy );
10 if (SUCCEEDED(hr) && (g_pFwProlicy != NULL))
11 {
12 hr = g_pFwProlicy->get_CurrentProfile( &g_pFwProfile );
13 }
14 }
15 return SUCCEEDED(hr) && (g_pFwProfile != NULL);
16}
然后是遍历所有援权程序的代码,
1
void
GetAuthorizedApp()
2 {
3 if (g_pFwProfile)
4 {
5 HRESULT hr = S_FALSE;
6 INetFwAuthorizedApplications *pAuthrizedApp = NULL;
7 hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
8 if ( SUCCEEDED(hr) )
9 {
10 long nAuthCount = 0;
11 hr = pAuthrizedApp->get_Count(&nAuthCount);
12 if (SUCCEEDED(hr))
13 {
14 //取得AppName
15 USES_CONVERSION;
16 cout << "安全程序个数:" << nAuthCount << endl << endl;
17
18 IEnumVARIANT *pEnum = NULL;
19 hr = pAuthrizedApp->get__NewEnum((IUnknown**)&pEnum);
20 if ( SUCCEEDED(hr) )
21 {
22 VARIANT varCurrPosi;
23 VariantInit(&varCurrPosi);
24 int nGet;
25 while( 1 )
26 {
27 hr = pEnum->Next(1,(VARIANT *)&varCurrPosi,(ULONG*)&nGet);
28 if (SUCCEEDED(hr))
29 {
30 if (nGet > 0)
31 {
32 IDispatch *pDisp = V_DISPATCH(&varCurrPosi);
33 INetFwAuthorizedApplication *app = NULL;
34
35 if (SUCCEEDED(pDisp->QueryInterface(__uuidof(INetFwAuthorizedApplication), (void**)&app)))
36 {
37 BSTR appName;
38 BSTR appPath;
39 VARIANT_BOOL bIsEnable = VARIANT_FALSE;
40
41 app->get_Name(&appName);
42 app->get_ProcessImageFileName(&appPath);
43 app->get_Enabled(&bIsEnable);
44 cout << "应用程序:" << W2A((LPTSTR)appName) << endl;
45 cout << "路径:" << W2A((LPTSTR)appPath) << endl;
46 cout << "当前是否可用:" << (VARIANT_TRUE == bIsEnable ? "可用" : "不可用") << endl << endl;
47
48 app->Release();
49 app = NULL;
50
51 SysFreeString(appName);
52 SysFreeString(appPath);
53 }
54 }
55 }
56 else
57 {
58 //异常退出
59 cout << "枚举过程中失败,程序异常退出!" << endl;
60 }
61 }
62 }
63 pEnum->Release();
64
65 pAuthrizedApp->Release();
66 pAuthrizedApp = NULL;
67 }
68 }
69 }
70}
71
2 {
3 if (g_pFwProfile)
4 {
5 HRESULT hr = S_FALSE;
6 INetFwAuthorizedApplications *pAuthrizedApp = NULL;
7 hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
8 if ( SUCCEEDED(hr) )
9 {
10 long nAuthCount = 0;
11 hr = pAuthrizedApp->get_Count(&nAuthCount);
12 if (SUCCEEDED(hr))
13 {
14 //取得AppName
15 USES_CONVERSION;
16 cout << "安全程序个数:" << nAuthCount << endl << endl;
17
18 IEnumVARIANT *pEnum = NULL;
19 hr = pAuthrizedApp->get__NewEnum((IUnknown**)&pEnum);
20 if ( SUCCEEDED(hr) )
21 {
22 VARIANT varCurrPosi;
23 VariantInit(&varCurrPosi);
24 int nGet;
25 while( 1 )
26 {
27 hr = pEnum->Next(1,(VARIANT *)&varCurrPosi,(ULONG*)&nGet);
28 if (SUCCEEDED(hr))
29 {
30 if (nGet > 0)
31 {
32 IDispatch *pDisp = V_DISPATCH(&varCurrPosi);
33 INetFwAuthorizedApplication *app = NULL;
34
35 if (SUCCEEDED(pDisp->QueryInterface(__uuidof(INetFwAuthorizedApplication), (void**)&app)))
36 {
37 BSTR appName;
38 BSTR appPath;
39 VARIANT_BOOL bIsEnable = VARIANT_FALSE;
40
41 app->get_Name(&appName);
42 app->get_ProcessImageFileName(&appPath);
43 app->get_Enabled(&bIsEnable);
44 cout << "应用程序:" << W2A((LPTSTR)appName) << endl;
45 cout << "路径:" << W2A((LPTSTR)appPath) << endl;
46 cout << "当前是否可用:" << (VARIANT_TRUE == bIsEnable ? "可用" : "不可用") << endl << endl;
47
48 app->Release();
49 app = NULL;
50
51 SysFreeString(appName);
52 SysFreeString(appPath);
53 }
54 }
55 }
56 else
57 {
58 //异常退出
59 cout << "枚举过程中失败,程序异常退出!" << endl;
60 }
61 }
62 }
63 pEnum->Release();
64
65 pAuthrizedApp->Release();
66 pAuthrizedApp = NULL;
67 }
68 }
69 }
70}
71
最后最重要的一点,我们要设置我们自己的程序,使其成为授权程序:
需要说明的一点是不要用一个文件不存在的名字来调试程序,比如乱写一个字符串,Windows防火墙会检查文件名是否存在!
1
HRESULT AddApplication(
const
CString
&
appName,
const
CString
&
appPath)
2 {
3 HRESULT hr = S_FALSE;
4 if (g_pFwProfile)
5 {
6 INetFwAuthorizedApplications *pAuthrizedApp = NULL;
7 hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
8 if ( SUCCEEDED(hr) )
9 {
10 INetFwAuthorizedApplication *pFwAuthApp = NULL;
11 BSTR bstrAppName = SysAllocString(appName);
12 BSTR bstrAppPath = SysAllocString(appPath);
13 hr = pAuthrizedApp->Item(bstrAppPath,&pFwAuthApp);
14 if ( SUCCEEDED(hr) )
15 {
16 if (pFwAuthApp)
17 {
18 VARIANT_BOOL bIsEnable = VARIANT_FALSE;
19 if ( SUCCEEDED(pFwAuthApp->get_Enabled(&bIsEnable)) )
20 {
21 if ( VARIANT_TRUE != bIsEnable)
22 {
23 pFwAuthApp->put_Enabled(VARIANT_TRUE);
24 }
25 }
26 }
27 }
28
29 if (!pFwAuthApp)
30 {
31 //没有找到,加入
32 hr = CoCreateInstance( __uuidof(NetFwAuthorizedApplication), NULL, CLSCTX_INPROC_SERVER,
33 __uuidof(INetFwAuthorizedApplication), (void**)&pFwAuthApp);
34 if ( SUCCEEDED(hr) )
35 {
36
37 pFwAuthApp->put_Name(bstrAppName);
38 pFwAuthApp->put_ProcessImageFileName(bstrAppPath);
39
40 if ( pAuthrizedApp )
41 {
42 hr = pAuthrizedApp->Add( pFwAuthApp );
43 }
44 }
45 }
46
47 if (pFwAuthApp)
48 {
49 pFwAuthApp->Release();
50 pFwAuthApp = NULL;
51 }
52
53 SysFreeString(bstrAppName);
54 SysFreeString(bstrAppPath);
55 }
56
57 if (pAuthrizedApp)
58 {
59 pAuthrizedApp->Release();
60 pAuthrizedApp = NULL;
61 }
62 }
63
64 return hr;
65}
2 {
3 HRESULT hr = S_FALSE;
4 if (g_pFwProfile)
5 {
6 INetFwAuthorizedApplications *pAuthrizedApp = NULL;
7 hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
8 if ( SUCCEEDED(hr) )
9 {
10 INetFwAuthorizedApplication *pFwAuthApp = NULL;
11 BSTR bstrAppName = SysAllocString(appName);
12 BSTR bstrAppPath = SysAllocString(appPath);
13 hr = pAuthrizedApp->Item(bstrAppPath,&pFwAuthApp);
14 if ( SUCCEEDED(hr) )
15 {
16 if (pFwAuthApp)
17 {
18 VARIANT_BOOL bIsEnable = VARIANT_FALSE;
19 if ( SUCCEEDED(pFwAuthApp->get_Enabled(&bIsEnable)) )
20 {
21 if ( VARIANT_TRUE != bIsEnable)
22 {
23 pFwAuthApp->put_Enabled(VARIANT_TRUE);
24 }
25 }
26 }
27 }
28
29 if (!pFwAuthApp)
30 {
31 //没有找到,加入
32 hr = CoCreateInstance( __uuidof(NetFwAuthorizedApplication), NULL, CLSCTX_INPROC_SERVER,
33 __uuidof(INetFwAuthorizedApplication), (void**)&pFwAuthApp);
34 if ( SUCCEEDED(hr) )
35 {
36
37 pFwAuthApp->put_Name(bstrAppName);
38 pFwAuthApp->put_ProcessImageFileName(bstrAppPath);
39
40 if ( pAuthrizedApp )
41 {
42 hr = pAuthrizedApp->Add( pFwAuthApp );
43 }
44 }
45 }
46
47 if (pFwAuthApp)
48 {
49 pFwAuthApp->Release();
50 pFwAuthApp = NULL;
51 }
52
53 SysFreeString(bstrAppName);
54 SysFreeString(bstrAppPath);
55 }
56
57 if (pAuthrizedApp)
58 {
59 pAuthrizedApp->Release();
60 pAuthrizedApp = NULL;
61 }
62 }
63
64 return hr;
65}
由于我不知道如设置让别人下载代码。 有需要代码者请给我留言或是发邮件