使用代码在Windows防火墙中创建例外 [英] Creating exception in Windows firewall using code

查看:89
本文介绍了使用代码在Windows防火墙中创建例外的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Hi,
How can I create exception of my application in windows firewall, using vb.net code?

Thanks

推荐答案

Imports System.Runtime.InteropServices

''' <summary>
''' A minimal-build class for accessing Windows Firewall
''' </summary>
Friend Class WinFirewall

    ' Windows Firewall Interfaces
    ' Main page: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366449%28v=VS.85%29.aspx

    ' To reduce code size, some interface member has been modified
    ' Actual implementation code preserved as comment

    <Guid("F7898AF5-CAC4-4632-A2EC-DA06E5111AF2"), TypeLibType(4160S)> _
    Friend Interface INetFwMgr
        ReadOnly Property LocalPolicy() As <MarshalAs(UnmanagedType.Interface)> INetFwPolicy
        ReadOnly Property CurrentProfileType() As NET_FW_PROFILE_TYPE_
        Sub RestoreDefaults()
        Sub IsPortAllowed(<[In](), MarshalAs(UnmanagedType.BStr)> ByVal imageFileName As String, <[In]()> ByVal IpVersion As NET_FW_IP_VERSION_, <[In]()> ByVal portNumber As Integer, <[In](), MarshalAs(UnmanagedType.BStr)> ByVal localAddress As String, <[In]()> ByVal ipProtocol As NET_FW_IP_PROTOCOL_, <Out(), MarshalAs(UnmanagedType.Struct)> ByRef allowed As Object, <Out(), MarshalAs(UnmanagedType.Struct)> ByRef restricted As Object)
        Sub IsIcmpTypeAllowed(<[In]()> ByVal IpVersion As NET_FW_IP_VERSION_, <[In](), MarshalAs(UnmanagedType.BStr)> ByVal localAddress As String, <[In]()> ByVal Type As Byte, <Out(), MarshalAs(UnmanagedType.Struct)> ByRef allowed As Object, <Out(), MarshalAs(UnmanagedType.Struct)> ByRef restricted As Object)
    End Interface

    <Guid("D46D2478-9AC9-4008-9DC7-5563CE5536CC"), TypeLibType(4160S)> _
    Friend Interface INetFwPolicy
        ReadOnly Property CurrentProfile() As <MarshalAs(UnmanagedType.Interface)> INetFwProfile
        Function GetProfileByType(<[In]()> ByVal profileType As NET_FW_PROFILE_TYPE_) As <MarshalAs(UnmanagedType.Interface)> INetFwProfile
    End Interface

    <Guid("174A0DDA-E9F9-449D-993B-21AB667CA456"), TypeLibType(4160S)> _
    Friend Interface INetFwProfile
        ReadOnly Property Type() As NET_FW_PROFILE_TYPE_
        Property FirewallEnabled() As Boolean
        Property ExceptionsNotAllowed() As Boolean
        Property NotificationsDisabled() As Boolean
        Property UnicastResponsesToMulticastBroadcastDisabled() As Boolean
        ' ReadOnly Property RemoteAdminSettings As <MarshalAs(UnmanagedType.Interface)> INetFwRemoteAdminSettings
        ReadOnly Property RemoteAdminSettings() As Object
        ' ReadOnly Property IcmpSettings As <MarshalAs(UnmanagedType.Interface)> INetFwIcmpSettings
        ReadOnly Property IcmpSettings() As Object
        ' ReadOnly Property GloballyOpenPorts As <MarshalAs(UnmanagedType.Interface)> INetFwOpenPorts
        ReadOnly Property GloballyOpenPorts() As Object
        ' ReadOnly Property Services As <MarshalAs(UnmanagedType.Interface)> INetFwServices
        ReadOnly Property Services() As Object
        ReadOnly Property AuthorizedApplications() As <MarshalAs(UnmanagedType.Interface)> INetFwAuthorizedApplications
    End Interface

    <Guid("644EFD52-CCF9-486C-97A2-39F352570B30"), TypeLibType(4160S)> _
    Friend Interface INetFwAuthorizedApplications
        Inherits IEnumerable

        ReadOnly Property Count() As Integer
        Sub Add(<[In](), MarshalAs(UnmanagedType.Interface)> ByVal app As INetFwAuthorizedApplication)
        Sub Remove(<[In](), MarshalAs(UnmanagedType.BStr)> ByVal imageFileName As String)
        Function Item(<[In](), MarshalAs(UnmanagedType.BStr)> ByVal imageFileName As String) As <MarshalAs(UnmanagedType.Interface)> INetFwAuthorizedApplication

        ' <TypeLibFunc(1S), DispId(-4)> _
        ' Function GetEnumerator() As <MarshalAs(UnmanagedType.CustomMarshaler, MarshalType:="", MarshalTypeRef:=GetType(EnumeratorToEnumVariantMarshaler), MarshalCookie:="")> IEnumerator

    End Interface

    <Guid("B5E64FFA-C2C5-444E-A301-FB5E00018050"), TypeLibType(4160S)> _
    Friend Interface INetFwAuthorizedApplication
        Property Name() As <MarshalAs(UnmanagedType.BStr)> String
        Property ProcessImageFileName() As <MarshalAs(UnmanagedType.BStr)> String
        Property IpVersion() As NET_FW_IP_VERSION_
        Property Scope() As NET_FW_SCOPE_
        Property RemoteAddresses() As <MarshalAs(UnmanagedType.BStr)> String
        Property Enabled() As Boolean
    End Interface

    Friend Enum NET_FW_PROFILE_TYPE_
        NET_FW_PROFILE_CURRENT = 2
        NET_FW_PROFILE_DOMAIN = 0
        NET_FW_PROFILE_STANDARD = 1
        NET_FW_PROFILE_TYPE_MAX = 3
    End Enum

    Friend Enum NET_FW_IP_VERSION_
        NET_FW_IP_VERSION_ANY = 2
        NET_FW_IP_VERSION_MAX = 3
        NET_FW_IP_VERSION_V4 = 0
        NET_FW_IP_VERSION_V6 = 1
    End Enum

    Friend Enum NET_FW_SCOPE_
        NET_FW_SCOPE_ALL = 0
        NET_FW_SCOPE_CUSTOM = 2
        NET_FW_SCOPE_LOCAL_SUBNET = 1
        NET_FW_SCOPE_MAX = 3
    End Enum

    Friend Enum NET_FW_IP_PROTOCOL_
        NET_FW_IP_PROTOCOL_ANY = &H100
        NET_FW_IP_PROTOCOL_TCP = 6
        NET_FW_IP_PROTOCOL_UDP = &H11
    End Enum


    Private Shared Function CreateInstance(Of T)(ByVal progId As String) As T
        Return DirectCast(Activator.CreateInstance(Type.GetTypeFromProgID(progId)), T)
    End Function

    Private Shared m_Manager As INetFwMgr

    Private Shared ReadOnly Property CurrentProfile() As INetFwProfile
        Get
            If (m_Manager Is Nothing) Then
                m_Manager = CreateInstance(Of INetFwMgr)("HNetCfg.FwMgr")
            End If
            Return m_Manager.LocalPolicy.CurrentProfile
        End Get
    End Property

    ''' <summary>
    ''' True if the firewall is enabled
    ''' </summary>
    Friend Shared ReadOnly Property IsEnabled() As Boolean
        Get
            Try
                Return CurrentProfile.FirewallEnabled
            Catch ex As Exception
                ' An Exception if Windows Firewall service is not running
            End Try
            Return False
        End Get
    End Property

    ''' <summary>
    ''' True if the application is authorized
    ''' </summary>
    Friend Shared ReadOnly Property IsAuthorized(ByVal executablePath As String) As Boolean
        Get
            Try
                Return CurrentProfile.AuthorizedApplications.Item(executablePath).Enabled
            Catch ex As Exception
                ' FileNotFoundException for non-AuthorizedApplication
            End Try
            Return False
        End Get
    End Property

    ''' <summary>
    ''' Authorize an application; True if success
    ''' </summary>
    Friend Shared Function Authorize(ByVal applicationName As String, ByVal executablePath As String) As Boolean
        Try

            ' Check if application already authorized
            If IsEnabled AndAlso IsAuthorized(executablePath) Then
                Return True
            End If

            Dim app As INetFwAuthorizedApplication = CreateInstance(Of INetFwAuthorizedApplication)("HNetCfg.FwAuthorizedApplication")
            If (app IsNot Nothing) Then
                app.Name = applicationName
                app.ProcessImageFileName = executablePath
                app.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL

                ' You can specify the remote addresses from which the application can listen for traffic
                ' see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365342%28v=vs.85%29.aspx
                ' app.RemoteAddresses = "*"

                app.IpVersion = NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY ' IPv4 and IPv6 both allowed
                app.Enabled = True
                CurrentProfile.AuthorizedApplications.Add(app)

                ' Again, check if application already authorized
                Return IsAuthorized(executablePath)
            End If
        Catch ex As Exception
            ' An Exception (ACCESSDENIED, INVALIDARG, OUTOFMEMORY, ...)
        End Try

        Return False
    End Function

End Class





授权你的申请:



To authorize your application:

WinFirewall.Authorize("yourAppName", "appExecutablePath")





别忘了在catch区块中处理异常。

希望这会有所帮助。



Don''t forget to handle the exception in catch block.
Hope this helps.


这篇关于使用代码在Windows防火墙中创建例外的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆