【问题标题】:How to set up a rule for a Store app using the Windows Firewall API?如何使用 Windows 防火墙 API 为应用商店应用设置规则?
【发布时间】:2016-01-22 20:50:05
【问题描述】:

所以我已经很清楚如何使用INetFwPolicy2INetFwRule COM 接口以编程方式设置防火墙规则。但是,如何使用 COM 互操作为特定的“现代应用程序”/“地铁应用程序”/“商店应用程序”设置规则?

如果我使用防火墙 MMC,我可以转到:

规则 -> 属性 -> 程序和服务 -> 应用程序包

并在那里允许/阻止指定的包。但我不知道如何在代码中做到这一点。我找到了提供LocalAppPackageId 属性的INetFwRule3 接口,我认为这就是所有魔法。但是LocalAppPackageId 包含包的 SID,而不是它的名称,例如 microsoft.windows.photos_8wekyb3d8bbwe。那么,当我只知道它的名称时,我怎么能阻止我想要的包呢?我想我必须获得 SID,那么我该如何找到它呢? SID 的范围是本地的(每台机器唯一),还是我可以在找到 SID 后对其进行硬编码而不费心动态查找 SID?

【问题讨论】:

    标签: c# .net com windows-firewall windows-firewall-api


    【解决方案1】:

    可以使用NetworkIsolationEnumAppContainersConvertSidToStringSid API 找到应用容器的SID。这就是 Fiddler does 在他们的 AppContainer Loopback Exemption Utility 中的内容(这就是我找到 API 的方式)。

    如果您只关心 SID 而不关心其他问题,则使用 DeriveAppContainerSidFromAppContainerName/ConvertSidToStringSid 组合会更容易。你甚至不必使用ConvertSidToStringSid,.NET 框架已经提供了转换:

    private static string SidToString(IntPtr sid)
    {
        return new SecurityIdentifier(sid).Value;
    }
    

    奇怪的是,DeriveAppContainerSidFromAppContainerName 不会检查应用程序容器是否存在于系统中,它似乎只是接受您向其输入的任何输入,并仅根据该信息生成 SID(如哈希函数)。

    那么完整的代码:

    public static string AppContainerNameToSid(string appContainerName)
    {
        var sid = IntPtr.Zero;
        try
        {
            if (DeriveAppContainerSidFromAppContainerName(appContainerName, out sid) == 0)
                return new SecurityIdentifier(sid).Value;
            else
                return null;
        }
        finally
        {
            if (sid != IntPtr.Zero)
                FreeSid(sid);
        }
    }
    
    [DllImport("userenv.dll", SetLastError = false, CharSet = CharSet.Unicode)]
    private static extern int DeriveAppContainerSidFromAppContainerName(string appContainerName, out IntPtr sid);
    
    [DllImport("advapi32.dll", SetLastError = false)]
    private static extern IntPtr FreeSid(IntPtr sid);
    

    【讨论】:

      【解决方案2】:

      阻止 UWP 应用的互联网连接就像传统的桌面软件一样。

      在 Windows 8/10 搜索中键入“高级安全性”,然后选择“具有高级安全性的 Windows Defender 防火墙”。 在新打开的窗口和左侧面板中,转到“入站规则”,然后在右侧面板中,选择“新规则...”,然后在选择“程序”时点击“下一步”。然后点击“浏览...”并转到这个地址:

      *C:\Program Files\WindowsApps*

      现在找到您的应用名称并进入其文件夹,然后选择“应用程序”类型的文件。 您将能够在几秒钟内找到正确的“应用程序”类型文件。 例如,“Google”应用的文件夹名称如下:

      GoogleInc.GoogleSearch_2.1.19.0_x64__yfg5n0ztvskxp

      它的应用程序“应用程序”文件类型的名称是这样的:

      GoogleSearchUniversal

      但是,在选择正确的“应用程序”文件类型后,单击“打开”。 然后点击“下一步”,然后选择“阻止连接”,然后选择“下一步”,然后标记所有类型的连接,然后“下一步”,然后调用它并“完成”。

      就像传统的桌面软件一样。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • 先生,这个网站是为开发者提供关于编码问题的问题。不是一般的问答网站。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 2014-09-21
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多