设置防火墙,让你的程序畅通无阻

在我们的程序运行过程中,如果要访问网络,经常会遇到Windows的防火墙提示(如果用户打开Windows防火墙),让用户选择是否阻止,如果我们是良民,何不直接通知Windows系统,好言相劝,我想,Windows应该还是认得好人的,比如,像我这样的青年。

事实上,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;


首先是初始化的代码:

 1 bool  Initial()
 2 ExpandedBlockStart.gifContractedBlock.gif {
 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))
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 9        hr = g_pFwMgr->get_LocalPolicy( &g_pFwProlicy );
10        if (SUCCEEDED(hr) && (g_pFwProlicy != NULL))
11ExpandedSubBlockStart.gifContractedSubBlock.gif        {
12            hr = g_pFwProlicy->get_CurrentProfile( &g_pFwProfile );
13        }

14    }

15    return SUCCEEDED(hr) && (g_pFwProfile != NULL);
16}


然后是遍历所有援权程序的代码,

 1 void  GetAuthorizedApp()
 2 ExpandedBlockStart.gifContractedBlock.gif {
 3    if (g_pFwProfile)
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 5        HRESULT hr = S_FALSE;
 6        INetFwAuthorizedApplications *pAuthrizedApp = NULL;
 7        hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
 8        if ( SUCCEEDED(hr) )
 9ExpandedSubBlockStart.gifContractedSubBlock.gif        {
10            long nAuthCount = 0;
11            hr = pAuthrizedApp->get_Count(&nAuthCount);
12            if (SUCCEEDED(hr))
13ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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) )
21ExpandedSubBlockStart.gifContractedSubBlock.gif                {
22                    VARIANT varCurrPosi;
23                    VariantInit(&varCurrPosi);
24                    int nGet;
25                    while1 )
26ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
27                        hr = pEnum->Next(1,(VARIANT *)&varCurrPosi,(ULONG*)&nGet);
28                        if (SUCCEEDED(hr))
29ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
30                            if (nGet > 0)
31ExpandedSubBlockStart.gifContractedSubBlock.gif                            {
32                                IDispatch *pDisp = V_DISPATCH(&varCurrPosi);
33                                INetFwAuthorizedApplication *app = NULL;
34
35                                if (SUCCEEDED(pDisp->QueryInterface(__uuidof(INetFwAuthorizedApplication), (void**)&app)))
36ExpandedSubBlockStart.gifContractedSubBlock.gif                                {
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
57ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
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 ExpandedBlockStart.gifContractedBlock.gif {
 3    HRESULT hr = S_FALSE;
 4    if (g_pFwProfile)
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 6        INetFwAuthorizedApplications *pAuthrizedApp = NULL;
 7        hr = g_pFwProfile->get_AuthorizedApplications( &pAuthrizedApp );
 8        if ( SUCCEEDED(hr) )
 9ExpandedSubBlockStart.gifContractedSubBlock.gif        {
10            INetFwAuthorizedApplication *pFwAuthApp = NULL;
11            BSTR bstrAppName = SysAllocString(appName);
12            BSTR bstrAppPath = SysAllocString(appPath);
13            hr = pAuthrizedApp->Item(bstrAppPath,&pFwAuthApp);
14            if ( SUCCEEDED(hr) )
15ExpandedSubBlockStart.gifContractedSubBlock.gif            {
16                if (pFwAuthApp)
17ExpandedSubBlockStart.gifContractedSubBlock.gif                {
18                    VARIANT_BOOL bIsEnable = VARIANT_FALSE;
19                    if ( SUCCEEDED(pFwAuthApp->get_Enabled(&bIsEnable)) )
20ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
21                        if ( VARIANT_TRUE != bIsEnable)
22ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
23                            pFwAuthApp->put_Enabled(VARIANT_TRUE);
24                        }
    
25                    }

26                }

27            }

28
29            if (!pFwAuthApp)
30ExpandedSubBlockStart.gifContractedSubBlock.gif            {
31                //没有找到,加入
32                hr = CoCreateInstance( __uuidof(NetFwAuthorizedApplication), NULL, CLSCTX_INPROC_SERVER,
33                    __uuidof(INetFwAuthorizedApplication), (void**)&pFwAuthApp);
34                if ( SUCCEEDED(hr) )
35ExpandedSubBlockStart.gifContractedSubBlock.gif                {
36
37                    pFwAuthApp->put_Name(bstrAppName);
38                    pFwAuthApp->put_ProcessImageFileName(bstrAppPath);
39
40                    if ( pAuthrizedApp )
41ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
42                        hr = pAuthrizedApp->Add( pFwAuthApp );
43                    }

44                }

45            }

46
47            if (pFwAuthApp)
48ExpandedSubBlockStart.gifContractedSubBlock.gif            {
49                pFwAuthApp->Release();
50                pFwAuthApp = NULL;
51            }

52
53            SysFreeString(bstrAppName);
54            SysFreeString(bstrAppPath);
55        }

56
57        if (pAuthrizedApp)
58ExpandedSubBlockStart.gifContractedSubBlock.gif        {
59            pAuthrizedApp->Release();
60            pAuthrizedApp = NULL;
61        }

62    }

63
64    return hr;
65}

 

由于我不知道如设置让别人下载代码。 有需要代码者请给我留言或是发邮件

 

转载于:https://www.cnblogs.com/homeofish/archive/2008/12/18/1357886.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值