VC++ の共通機能開発の概要 (コラム記事のリスト、購読歓迎、継続的な更新...) https://blog.csdn.net/chenlycly/article/details/124272585 C++ ソフトウェア異常トラブルシューティング チュートリアル シリーズ入門から習熟まで(コラム記事一覧)、ぜひ購読して更新を続けてください...)https://blog.csdn.net/chenlycly/article/details/125529931入門から習熟までのC++ソフトウェア解析ツール事例集(コラム)記事は更新中...) https://blog.csdn.net/chenlycly/article/details/131405795 C/C++ の基礎と応用 (コラム記事、継続的に更新中...) https://blog.csdn.net /chenlycly/category_11931267.html この記事は、INetFwMgr、INetFwPolicy、INetFwProfile などの COM インターフェイスを通じて紹介されており、防火が有効になっているかどうか、および現在のプロセスがファイアウォールのホワイトリストに追加されているかどうかを検出するために使用されます。
Windows 10 システムの場合、システム ファイアウォールを有効/無効にするページは次のとおりです。
Windows ファイアウォールを介した通信を設定するページは次のとおりです。
COM コンポーネントを使用して、ファイアウォールが有効になっているかどうか、およびプログラムがファイアウォールを介した通信を許可されているか (ファイアウォール ホワイトリストに追加する) を検出するための完全なコードは次のとおりです。
BOOL DetectFirewallSettings( BOOL* bExeEnableFW )
{
BOOL status = FALSE;
HRESULT hr = S_FALSE;
INetFwMgr* fwMgr = NULL;
INetFwPolicy* fwPolicy = NULL;
INetFwProfile* fwProfile = NULL;
INetFwAuthorizedApplications *apps = NULL;
INetFwAuthorizedApplication *app = NULL;
FW_ERROR_CODE ret = FW_NOERROR;
VARIANT_BOOL bFWEnabled;
VARIANT_BOOL bDoNoteAllowExceptions;
CoInitialize( NULL );
try
{
// 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( &fwProfile );
if( FAILED( hr ) )
{
throw FW_ERR_PROFILE;
}
// 1、是否开启了防火墙
hr = fwProfile->get_FirewallEnabled( &bFWEnabled );
if( FAILED( hr ) )
{
throw FW_ERR_FIREWALL_IS_ENABLED;
}
if( bFWEnabled )
{
// 开启了防火墙,再检测是否允许例外
hr = fwProfile->get_ExceptionsNotAllowed( &bDoNoteAllowExceptions );
if( FAILED(hr) )
{
throw FW_ERR_FIREWALL_IS_ENABLED;
}
if( bDoNoteAllowExceptions )
{
status = TRUE;
}
else
{
// 允许意外
// 2、得到授权应用程序
hr = fwProfile->get_AuthorizedApplications( &apps );
if( FAILED(hr) )
{
status = TRUE;
throw FW_ERR_FIREWALL_IS_ENABLED;
}
// 3、获取当前进程的进程名
TCHAR szPEBuff[MAX_PATH] = {0};
GetModuleFileName( NULL, szPEBuff, MAX_PATH );
BSTR bstrTemp = _bstr_t( szPEBuff );
// 看当前进程在不在允许列表中
hr = apps->Item( bstrTemp, &app );
if( FAILED(hr) )
{
// 不在允许列表中
status = TRUE;
throw FW_ERR_FIREWALL_IS_ENABLED;
}
else
{
//在允许列表中,查看是否允许通过防火墙
hr = app->get_Enabled( &bFWEnabled );
if( FAILED(hr) )
{
status = TRUE;
throw FW_ERR_FIREWALL_IS_ENABLED;
}
if( bFWEnabled != VARIANT_FALSE )
{
status = FALSE;
if ( bExeEnableFW != NULL )
{
*bExeEnableFW = true;
}
}
else
{
status = TRUE;
}
}
}
}
}
catch( FW_ERROR_CODE nError )
{
ret = nError;
}
if( fwPolicy )
{
fwPolicy->Release();
}
if( fwMgr )
{
fwMgr->Release();
}
CoUninitialize();
return status;
}
上記のインターフェイスの戻り値は、保護壁が有効かどうかを示し、インターフェイスの発信パラメータ bExeEnableFW は、現在のプログラムがファイアウォールを介した通信を許可されているかどうかを示します。