netfw.h - Firewall-API



  • Hallo,

    ich möchte programmtechnisch einen Port für eine bestimmte App im Firewall freigeben und benutze den Code unten aus dem Web. Funktioniert soweit auch, aber das fügt mir lediglich eine App zum FW dazu. Ich möchte aber auch angeben, welcher Port zu öffnen ist, das Protokoll (ipv4) und ob die Regel als Inbound- oder als Outbound Rule anzulegen ist.

    (Fehlerbehandlung im Beispiel hab ich weitestgehend gelöscht wg. Übersichtlichkeit. Um Fehlerbehandlung geht es auch nicht ....)

    Könnte mir da jemand auf die Sprünge helfen bzw. einen Link auf entsprechenden Beispielcode posten?

    Grüße!

    //------------------------------------------------------------------------
    //
    //	FirewallAddApp
    //
    //------------------------------------------------------------------------
    HRESULT CFirewall::FirewallAddApp( const wchar_t *szProcessImageFileName,   const wchar_t *szName)
    
    {
    
    HRESULT							hr = S_OK;
    BOOL							fwAppEnabled;
    	BSTR							fwBstrName = NULL;
    	BSTR							fwBstrProcessImageFileName = NULL;
    	INetFwAuthorizedApplication		*fwApp = NULL;
    	INetFwAuthorizedApplications	*fwApps = NULL;
    
    	if (szProcessImageFileName == NULL)
    		return (HRESULT)-1;
    
    	if (szName == NULL)
    		return (HRESULT)-1;
    
    	__try 
    	{
    		__try 
    		{
    			hr = FirewallAppIsEnabled(	szProcessImageFileName,
    										&fwAppEnabled
    									);
    
    			if (!fwAppEnabled)	
    			{
    
    				hr = m_fwProfile->get_AuthorizedApplications(&fwApps);
    				if (FAILED(hr))	
    				{
    				}
    
    				// Instanz Application.
    				hr = CoCreateInstance(
    										__uuidof(NetFwAuthorizedApplication),
    										NULL,
    										CLSCTX_INPROC_SERVER,
    										__uuidof(INetFwAuthorizedApplication),
    										reinterpret_cast<void**>(static_cast<INetFwAuthorizedApplication**>(&fwApp))
    									);
    
    				fwBstrProcessImageFileName = SysAllocString(szProcessImageFileName);
    
    				hr = fwApp->put_ProcessImageFileName(fwBstrProcessImageFileName);
    
    				fwBstrName = SysAllocString(szName);
    
    				hr = fwApp->put_Name(fwBstrName); 
    
    				hr = fwApps->Add(fwApp);
    
    			}
    		}
    		__except(1) 
    		{
    		}
    	}
    	__finally {
    		SysFreeString(fwBstrName);
    		SysFreeString(fwBstrProcessImageFileName);
    
    		if (fwApp != NULL) {
    			fwApp->Release();
    		}
    
    		if (fwApps != NULL) {
    			fwApps->Release();
    		}
    	}
    	return hr;
    }
    


  • Für Windows Vista und später solltest Du die Windows Firewall with Advanced Security API verwenden.



  • Hallo Swordfish,

    Danke für den Hinweis. Ist gar nicht schwer. Ich habe eine komplette Rule dazugefügt - klappt. Allerdings: wenn ich mir die Rule im FW ansehe (W7 Pro) kommt dort der Hinweis: "Dies ist eine vordefinierte Regel und einige ihrer Eigenschaften können nicht geändert werden". Und tatsächlich das ist so.

    Wie macht man, dass die Regel änderbar ist?


Log in to reply