可以使用NetworkIsolationEnumAppContainers
和ConvertSidToStringSid
API 找到应用容器的 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);