0

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

如果我使用防火墙 MMC,我可以访问:

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

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

4

2 回答 2

1

可以使用NetworkIsolationEnumAppContainersConvertSidToStringSidAPI 找到应用容器的 SID。这就是Fiddler在他们的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);
于 2015-10-23T13:59:40.087 回答
0

阻止 UWP 应用程序的 Internet 连接就像传统的桌面软件一样。

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

*C:\Program Files\WindowsApps*

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

GoogleInc.GoogleSearch_2.1.19.0_x64__yfg5n0ztvskxp

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

谷歌搜索通用

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

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

于 2021-10-05T16:27:31.913 回答