设置防火墙,让你的程序畅通无阻
在我们的程序运行过程中,如果要访问网络,经常会遇到Windows的防火墙提示(如果用户打开Windows防火墙),让用户选择是否阻止,如果我们是良民,何不直接通知Windows系统,好言相劝,我想,Windows应该还是认得好人的,比如,像我这样的青年。
事实上,Windows提供了接口供我们配置防火墙。我们只需要调用接口的方法,在防火墙的配置中加入将我们的程序发布的相关信息就可以了。
这一接口要求用户系统版本至不得xp sp2用户。权限为管理员权限(这个几乎可以忽略,但还是要提醒一下)
设置Windows防火墙的接口比较多,在这个Demo中主要用了以下几种:
INetFwMgr:从字面意思上也可以看出这个接口提供了防火墙管理的方法,比如取得配
置信息。继承自IUnknow,IDispatch
INetFwProfile:通过这个接口可以取得防火墙的配置文件,比如有那些应该程序是被援
权了的。
INetFwPolicy:继承自IUnknow,IDispatch。通过这个接口我可以得到当前防火墙的访
问策略。
事实上,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;
//Global Data2
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
}
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
}然后是遍历所有援权程序的代码,
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
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
//取得AppName15
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
else57
{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
}
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
}
由于我不知道如设置让别人下载代码。 有需要代码者请给我留言或是发邮件



浙公网安备 33010602011771号