[C++/Win] Exercising the Firewall

퍼온글 2007/06/02 00:22 장인정신
SPAN class=postbody본 내용은 Microsoft 의 사이트에서 발췌한것임을 밝힙니다. (사이트의 정확한 주소는 오래되서 기억이 안나네요.) br /Windows 의 firewall 을 제어하는 예제라고 보시면 되겠습니다. br /br /br /br /Exercising the Firewall (C++) br /br /The following code example exercises the Windows Firewall profile; display current profile, turn off firewall, turn on firewall, add application, etc. br /br //SPAN TABLE cellSpacing=1 cellPadding=3 width=90% align=center border=0 TBODY TR TDSPAN class=genmedB코드:/B/SPAN/TD/TR TR TD class=codebr //* br /nbsp; nbsp; Copyright (c) Microsoft Corporation br /br /nbsp; nbsp; SYNOPSIS br /br /nbsp; nbsp; nbsp; nbsp; Sample code for the Windows Firewall COM interface. br /*/ br /br /#include lt;windows.hgt; br /#include lt;crtdbg.hgt; br /#include lt;netfw.hgt; br /#include lt;objbase.hgt; br /#include lt;oleauto.hgt; br /#include lt;stdio.hgt; br /br /br /HRESULT WindowsFirewallInitialize(OUT INetFwProfile** fwProfile) br /{ br /nbsp; nbsp; HRESULT hr = S_OK; br /nbsp; nbsp; INetFwMgr* fwMgr = NULL; br /nbsp; nbsp; INetFwPolicy* fwPolicy = NULL; br /br /nbsp; nbsp; _ASSERT(fwProfile != NULL); br /br /nbsp; nbsp; *fwProfile = NULL; br /br /nbsp; nbsp; // Create an instance of the firewall settings manager. br /nbsp; nbsp; hr = CoCreateInstance( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; __uuidof(NetFwMgr), br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; NULL, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; CLSCTX_INPROC_SERVER, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; __uuidof(INetFwMgr), br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; (void**)amp;fwMgr br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(CoCreateInstance failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Retrieve the local firewall policy. br /nbsp; nbsp; hr = fwMgr-gt;get_LocalPolicy(amp;fwPolicy); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(get_LocalPolicy failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Retrieve the firewall profile currently in effect. br /nbsp; nbsp; hr = fwPolicy-gt;get_CurrentProfile(fwProfile); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(get_CurrentProfile failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /error: br /br /nbsp; nbsp; // Release the local firewall policy. br /nbsp; nbsp; if (fwPolicy != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwPolicy-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; // Release the firewall settings manager. br /nbsp; nbsp; if (fwMgr != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwMgr-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; return hr; br /} br /br /br /void WindowsFirewallCleanup(IN INetFwProfile* fwProfile) br /{ br /nbsp; nbsp; // Release the firewall profile. br /nbsp; nbsp; if (fwProfile != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwProfile-gt;Release(); br /nbsp; nbsp; } br /} br /br /br /HRESULT WindowsFirewallIsOn(IN INetFwProfile* fwProfile, OUT BOOL* fwOn) br /{ br /nbsp; nbsp; HRESULT hr = S_OK; br /nbsp; nbsp; VARIANT_BOOL fwEnabled; br /br /nbsp; nbsp; _ASSERT(fwProfile != NULL); br /nbsp; nbsp; _ASSERT(fwOn != NULL); br /br /nbsp; nbsp; *fwOn = FALSE; br /br /nbsp; nbsp; // Get the current state of the firewall. br /nbsp; nbsp; hr = fwProfile-gt;get_FirewallEnabled(amp;fwEnabled); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(get_FirewallEnabled failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Check to see if the firewall is on. br /nbsp; nbsp; if (fwEnabled != VARIANT_FALSE) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; *fwOn = TRUE; br /nbsp; nbsp; nbsp; nbsp; printf(The firewall is on.\n); br /nbsp; nbsp; } br /nbsp; nbsp; else br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(The firewall is off.\n); br /nbsp; nbsp; } br /br /error: br /br /nbsp; nbsp; return hr; br /} br /br /br /HRESULT WindowsFirewallTurnOn(IN INetFwProfile* fwProfile) br /{ br /nbsp; nbsp; HRESULT hr = S_OK; br /nbsp; nbsp; BOOL fwOn; br /br /nbsp; nbsp; _ASSERT(fwProfile != NULL); br /br /nbsp; nbsp; // Check to see if the firewall is off. br /nbsp; nbsp; hr = WindowsFirewallIsOn(fwProfile, amp;fwOn); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(WindowsFirewallIsOn failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // If it is, turn it on. br /nbsp; nbsp; if (!fwOn) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; // Turn the firewall on. br /nbsp; nbsp; nbsp; nbsp; hr = fwProfile-gt;put_FirewallEnabled(VARIANT_TRUE); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(put_FirewallEnabled failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; printf(The firewall is now on.\n); br /nbsp; nbsp; } br /br /error: br /br /nbsp; nbsp; return hr; br /} br /br /br /HRESULT WindowsFirewallTurnOff(IN INetFwProfile* fwProfile) br /{ br /nbsp; nbsp; HRESULT hr = S_OK; br /nbsp; nbsp; BOOL fwOn; br /br /nbsp; nbsp; _ASSERT(fwProfile != NULL); br /br /nbsp; nbsp; // Check to see if the firewall is on. br /nbsp; nbsp; hr = WindowsFirewallIsOn(fwProfile, amp;fwOn); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(WindowsFirewallIsOn failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // If it is, turn it off. br /nbsp; nbsp; if (fwOn) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; // Turn the firewall off. br /nbsp; nbsp; nbsp; nbsp; hr = fwProfile-gt;put_FirewallEnabled(VARIANT_FALSE); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(put_FirewallEnabled failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; printf(The firewall is now off.\n); br /nbsp; nbsp; } br /br /error: br /br /nbsp; nbsp; return hr; br /} br /br /br /HRESULT WindowsFirewallAppIsEnabled( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN INetFwProfile* fwProfile, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN const wchar_t* fwProcessImageFileName, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; OUT BOOL* fwAppEnabled br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ) br /{ br /nbsp; nbsp; HRESULT hr = S_OK; br /nbsp; nbsp; BSTR fwBstrProcessImageFileName = NULL; br /nbsp; nbsp; VARIANT_BOOL fwEnabled; br /nbsp; nbsp; INetFwAuthorizedApplication* fwApp = NULL; br /nbsp; nbsp; INetFwAuthorizedApplications* fwApps = NULL; br /br /nbsp; nbsp; _ASSERT(fwProfile != NULL); br /nbsp; nbsp; _ASSERT(fwProcessImageFileName != NULL); br /nbsp; nbsp; _ASSERT(fwAppEnabled != NULL); br /br /nbsp; nbsp; *fwAppEnabled = FALSE; br /br /nbsp; nbsp; // Retrieve the authorized application collection. br /nbsp; nbsp; hr = fwProfile-gt;get_AuthorizedApplications(amp;fwApps); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(get_AuthorizedApplications failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Allocate a BSTR for the process image file name. br /nbsp; nbsp; fwBstrProcessImageFileName = SysAllocString(fwProcessImageFileName); br /nbsp; nbsp; if (SysStringLen(fwBstrProcessImageFileName) == 0) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; hr = E_OUTOFMEMORY; br /nbsp; nbsp; nbsp; nbsp; printf(SysAllocString failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Attempt to retrieve the authorized application. br /nbsp; nbsp; hr = fwApps-gt;Item(fwBstrProcessImageFileName, amp;fwApp); br /nbsp; nbsp; if (SUCCEEDED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; // Find out if the authorized application is enabled. br /nbsp; nbsp; nbsp; nbsp; hr = fwApp-gt;get_Enabled(amp;fwEnabled); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(get_Enabled failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; if (fwEnabled != VARIANT_FALSE) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; // The authorized application is enabled. br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; *fwAppEnabled = TRUE; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; Authorized application %lS is enabled in the firewall.\n, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; fwProcessImageFileName br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; nbsp; nbsp; } br /nbsp; nbsp; nbsp; nbsp; else br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; Authorized application %lS is disabled in the firewall.\n, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; fwProcessImageFileName br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; nbsp; nbsp; } br /nbsp; nbsp; } br /nbsp; nbsp; else br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; // The authorized application was not in the collection. br /nbsp; nbsp; nbsp; nbsp; hr = S_OK; br /br /nbsp; nbsp; nbsp; nbsp; printf( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; Authorized application %lS is disabled in the firewall.\n, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; fwProcessImageFileName br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; } br /br /error: br /br /nbsp; nbsp; // Free the BSTR. br /nbsp; nbsp; SysFreeString(fwBstrProcessImageFileName); br /br /nbsp; nbsp; // Release the authorized application instance. br /nbsp; nbsp; if (fwApp != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwApp-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; // Release the authorized application collection. br /nbsp; nbsp; if (fwApps != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwApps-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; return hr; br /} br /br /br /HRESULT WindowsFirewallAddApp( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN INetFwProfile* fwProfile, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN const wchar_t* fwProcessImageFileName, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN const wchar_t* fwName br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ) br /{ br /nbsp; nbsp; HRESULT hr = S_OK; br /nbsp; nbsp; BOOL fwAppEnabled; br /nbsp; nbsp; BSTR fwBstrName = NULL; br /nbsp; nbsp; BSTR fwBstrProcessImageFileName = NULL; br /nbsp; nbsp; INetFwAuthorizedApplication* fwApp = NULL; br /nbsp; nbsp; INetFwAuthorizedApplications* fwApps = NULL; br /br /nbsp; nbsp; _ASSERT(fwProfile != NULL); br /nbsp; nbsp; _ASSERT(fwProcessImageFileName != NULL); br /nbsp; nbsp; _ASSERT(fwName != NULL); br /br /nbsp; nbsp; // First check to see if the application is already authorized. br /nbsp; nbsp; hr = WindowsFirewallAppIsEnabled( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; fwProfile, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; fwProcessImageFileName, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; amp;fwAppEnabled br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(WindowsFirewallAppIsEnabled failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Only add the application if it isn't already authorized. br /nbsp; nbsp; if (!fwAppEnabled) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; // Retrieve the authorized application collection. br /nbsp; nbsp; nbsp; nbsp; hr = fwProfile-gt;get_AuthorizedApplications(amp;fwApps); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(get_AuthorizedApplications failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Create an instance of an authorized application. br /nbsp; nbsp; nbsp; nbsp; hr = CoCreateInstance( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; __uuidof(NetFwAuthorizedApplication), br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; NULL, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; CLSCTX_INPROC_SERVER, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; __uuidof(INetFwAuthorizedApplication), br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; (void**)amp;fwApp br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(CoCreateInstance failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Allocate a BSTR for the process image file name. br /nbsp; nbsp; nbsp; nbsp; fwBstrProcessImageFileName = SysAllocString(fwProcessImageFileName); br /nbsp; nbsp; nbsp; nbsp; if (SysStringLen(fwBstrProcessImageFileName) == 0) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; hr = E_OUTOFMEMORY; br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(SysAllocString failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Set the process image file name. br /nbsp; nbsp; nbsp; nbsp; hr = fwApp-gt;put_ProcessImageFileName(fwBstrProcessImageFileName); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(put_ProcessImageFileName failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Allocate a BSTR for the application friendly name. br /nbsp; nbsp; nbsp; nbsp; fwBstrName = SysAllocString(fwName); br /nbsp; nbsp; nbsp; nbsp; if (SysStringLen(fwBstrName) == 0) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; hr = E_OUTOFMEMORY; br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(SysAllocString failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Set the application friendly name. br /nbsp; nbsp; nbsp; nbsp; hr = fwApp-gt;put_Name(fwBstrName); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(put_Name failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Add the application to the collection. br /nbsp; nbsp; nbsp; nbsp; hr = fwApps-gt;Add(fwApp); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(Add failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; printf( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; Authorized application %lS is now enabled in the firewall.\n, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; fwProcessImageFileName br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; } br /br /error: br /br /nbsp; nbsp; // Free the BSTRs. br /nbsp; nbsp; SysFreeString(fwBstrName); br /nbsp; nbsp; SysFreeString(fwBstrProcessImageFileName); br /br /nbsp; nbsp; // Release the authorized application instance. br /nbsp; nbsp; if (fwApp != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwApp-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; // Release the authorized application collection. br /nbsp; nbsp; if (fwApps != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwApps-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; return hr; br /} br /br /br /HRESULT WindowsFirewallPortIsEnabled( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN INetFwProfile* fwProfile, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN LONG portNumber, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN NET_FW_IP_PROTOCOL ipProtocol, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; OUT BOOL* fwPortEnabled br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ) br /{ br /nbsp; nbsp; HRESULT hr = S_OK; br /nbsp; nbsp; VARIANT_BOOL fwEnabled; br /nbsp; nbsp; INetFwOpenPort* fwOpenPort = NULL; br /nbsp; nbsp; INetFwOpenPorts* fwOpenPorts = NULL; br /br /nbsp; nbsp; _ASSERT(fwProfile != NULL); br /nbsp; nbsp; _ASSERT(fwPortEnabled != NULL); br /br /nbsp; nbsp; *fwPortEnabled = FALSE; br /br /nbsp; nbsp; // Retrieve the globally open ports collection. br /nbsp; nbsp; hr = fwProfile-gt;get_GloballyOpenPorts(amp;fwOpenPorts); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(get_GloballyOpenPorts failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Attempt to retrieve the globally open port. br /nbsp; nbsp; hr = fwOpenPorts-gt;Item(portNumber, ipProtocol, amp;fwOpenPort); br /nbsp; nbsp; if (SUCCEEDED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; // Find out if the globally open port is enabled. br /nbsp; nbsp; nbsp; nbsp; hr = fwOpenPort-gt;get_Enabled(amp;fwEnabled); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(get_Enabled failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; if (fwEnabled != VARIANT_FALSE) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; // The globally open port is enabled. br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; *fwPortEnabled = TRUE; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(Port %ld is open in the firewall.\n, portNumber); br /nbsp; nbsp; nbsp; nbsp; } br /nbsp; nbsp; nbsp; nbsp; else br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(Port %ld is not open in the firewall.\n, portNumber); br /nbsp; nbsp; nbsp; nbsp; } br /nbsp; nbsp; } br /nbsp; nbsp; else br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; // The globally open port was not in the collection. br /nbsp; nbsp; nbsp; nbsp; hr = S_OK; br /br /nbsp; nbsp; nbsp; nbsp; printf(Port %ld is not open in the firewall.\n, portNumber); br /nbsp; nbsp; } br /br /error: br /br /nbsp; nbsp; // Release the globally open port. br /nbsp; nbsp; if (fwOpenPort != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwOpenPort-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; // Release the globally open ports collection. br /nbsp; nbsp; if (fwOpenPorts != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwOpenPorts-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; return hr; br /} br /br /br /HRESULT WindowsFirewallPortAdd( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN INetFwProfile* fwProfile, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN LONG portNumber, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN NET_FW_IP_PROTOCOL ipProtocol, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; IN const wchar_t* name br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ) br /{ br /nbsp; nbsp; HRESULT hr = S_OK; br /nbsp; nbsp; BOOL fwPortEnabled; br /nbsp; nbsp; BSTR fwBstrName = NULL; br /nbsp; nbsp; INetFwOpenPort* fwOpenPort = NULL; br /nbsp; nbsp; INetFwOpenPorts* fwOpenPorts = NULL; br /br /nbsp; nbsp; _ASSERT(fwProfile != NULL); br /nbsp; nbsp; _ASSERT(name != NULL); br /br /nbsp; nbsp; // First check to see if the port is already added. br /nbsp; nbsp; hr = WindowsFirewallPortIsEnabled( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; fwProfile, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; portNumber, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ipProtocol, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; amp;fwPortEnabled br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(WindowsFirewallPortIsEnabled failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Only add the port if it isn't already added. br /nbsp; nbsp; if (!fwPortEnabled) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; // Retrieve the collection of globally open ports. br /nbsp; nbsp; nbsp; nbsp; hr = fwProfile-gt;get_GloballyOpenPorts(amp;fwOpenPorts); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(get_GloballyOpenPorts failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Create an instance of an open port. br /nbsp; nbsp; nbsp; nbsp; hr = CoCreateInstance( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; __uuidof(NetFwOpenPort), br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; NULL, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; CLSCTX_INPROC_SERVER, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; __uuidof(INetFwOpenPort), br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; (void**)amp;fwOpenPort br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(CoCreateInstance failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Set the port number. br /nbsp; nbsp; nbsp; nbsp; hr = fwOpenPort-gt;put_Port(portNumber); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(put_Port failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Set the IP protocol. br /nbsp; nbsp; nbsp; nbsp; hr = fwOpenPort-gt;put_Protocol(ipProtocol); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(put_Protocol failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Allocate a BSTR for the friendly name of the port. br /nbsp; nbsp; nbsp; nbsp; fwBstrName = SysAllocString(name); br /nbsp; nbsp; nbsp; nbsp; if (SysStringLen(fwBstrName) == 0) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; hr = E_OUTOFMEMORY; br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(SysAllocString failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Set the friendly name of the port. br /nbsp; nbsp; nbsp; nbsp; hr = fwOpenPort-gt;put_Name(fwBstrName); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(put_Name failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; // Opens the port and adds it to the collection. br /nbsp; nbsp; nbsp; nbsp; hr = fwOpenPorts-gt;Add(fwOpenPort); br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(Add failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; printf(Port %ld is now open in the firewall.\n, portNumber); br /nbsp; nbsp; } br /br /error: br /br /nbsp; nbsp; // Free the BSTR. br /nbsp; nbsp; SysFreeString(fwBstrName); br /br /nbsp; nbsp; // Release the open port instance. br /nbsp; nbsp; if (fwOpenPort != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwOpenPort-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; // Release the globally open ports collection. br /nbsp; nbsp; if (fwOpenPorts != NULL) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; fwOpenPorts-gt;Release(); br /nbsp; nbsp; } br /br /nbsp; nbsp; return hr; br /} br /br /br /int __cdecl wmain(int argc, wchar_t* argv[]) br /{ br /nbsp; nbsp; HRESULT hr = S_OK; br /nbsp; nbsp; HRESULT comInit = E_FAIL; br /nbsp; nbsp; INetFwProfile* fwProfile = NULL; br /br /nbsp; nbsp; // Initialize COM. br /nbsp; nbsp; comInit = CoInitializeEx( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; 0, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /br /nbsp; nbsp;// Ignore RPC_E_CHANGED_MODE; this just means that COM has already been br /nbsp; nbsp;// initialized with a different mode. Since we don't care what the mode is, br /nbsp; nbsp;// we'll just use the existing mode. br /nbsp; nbsp;if (comInit != RPC_E_CHANGED_MODE) br /nbsp; nbsp;{ br /nbsp; nbsp; nbsp; nbsp; hr = comInit; br /nbsp; nbsp; nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; printf(CoInitializeEx failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; nbsp; nbsp; } br /nbsp; nbsp;} br /br /nbsp; nbsp; // Retrieve the firewall profile currently in effect. br /nbsp; nbsp; hr = WindowsFirewallInitialize(amp;fwProfile); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(WindowsFirewallInitialize failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Turn off the firewall. br /nbsp; nbsp; hr = WindowsFirewallTurnOff(fwProfile); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(WindowsFirewallTurnOff failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Turn on the firewall. br /nbsp; nbsp; hr = WindowsFirewallTurnOn(fwProfile); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(WindowsFirewallTurnOn failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Add Windows Messenger to the authorized application collection. br /nbsp; nbsp; hr = WindowsFirewallAddApp( br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; fwProfile, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; L%ProgramFiles%\Messenger\msmsgs.exe, br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; LWindows Messenger br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(WindowsFirewallAddApp failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /nbsp; nbsp; // Add TCP::80 to list of globally open ports. br /nbsp; nbsp; hr = WindowsFirewallPortAdd(fwProfile, 80, NET_FW_IP_PROTOCOL_TCP, LWWW); br /nbsp; nbsp; if (FAILED(hr)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; printf(WindowsFirewallPortAdd failed: 0x%08lx\n, hr); br /nbsp; nbsp; nbsp; nbsp; goto error; br /nbsp; nbsp; } br /br /error: br /br /nbsp; nbsp; // Release the firewall profile. br /nbsp; nbsp; WindowsFirewallCleanup(fwProfile); br /br /nbsp; nbsp; // Uninitialize COM. br /nbsp; nbsp; if (SUCCEEDED(comInit)) br /nbsp; nbsp; { br /nbsp; nbsp; nbsp; nbsp; CoUninitialize(); br /nbsp; nbsp; } br /br /nbsp; nbsp; return 0; br /} br /br //TD/TR/TBODY/TABLE
크리에이티브 커먼즈 라이센스
Creative Commons License
2007/06/02 00:22 2007/06/02 00:22
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/157

댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/157

트랙백 주소 :: http://blog.minzkn.com/trackback/157

트랙백 RSS :: http://blog.minzkn.com/rss/trackback/157

트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/157

댓글을 달아 주세요

댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/157
댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/157