//枚举所有uwp程序,并判断指定显示名称的uwp程序是否存在
//displayname uwp程序的显示名称 containername uwp程序的PackageFamilyName,也就是结构体中的appContainerName
typedef struct _INET_FIREWALL_APP_CONTAINER
{
SID *appContainerSid;
SID *userSid;
LPWSTR appContainerName;
LPWSTR displayName;
LPWSTR description;
INET_FIREWALL_AC_CAPABILITIES capabilities;
INET_FIREWALL_AC_BINARIES binaries;
LPWSTR workingDirectory;
LPWSTR packageFullName;
} INET_FIREWALL_APP_CONTAINER, *PINET_FIREWALL_APP_CONTAINER;
BOOL IsExistSpecificUWP(LPTSTR displayname, std::wstring& containername)
{
BOOL bRet = FALSE;
HMODULE FirewallAPIModule;
FirewallAPIModule = (LoadLibrary(L"FirewallAPI.dll"));
auto EnumAppContainersProc = pNetworkIsolationEnumAppContainers(GetProcAddress(FirewallAPIModule, "NetworkIsolationEnumAppContainers"));
auto FreeAppContainersProc = pNetworkIsolationFreeAppContainers(GetProcAddress(FirewallAPIModule, "NetworkIsolationFreeAppContainers"));
DWORD pdwNumPublicAppCs = 0;
PINET_FIREWALL_APP_CONTAINER ppPublicAppCs = NULL;
if (nullptr == EnumAppContainersProc || nullptr == FreeAppContainersProc)
{
return bRet;
}
HRESULT Hr = EnumAppContainersProc(0, &pdwNumPublicAppCs, &ppPublicAppCs);
if (Hr != ERROR_SUCCESS)
{
return bRet;
}
for (int i = 0; i < pdwNumPublicAppCs; i++)
{
auto appContainer = ppPublicAppCs[i];
if (_tcscmp(appContainer.displayName, displayname) == 0)
{
containername = appContainer.appContainerName;
LOG_INFO(L"exist uwp containername=%s", containername.c_str());
bRet = TRUE;
}
}
FreeAppContainersProc(ppPublicAppCs);
FreeLibrary(FirewallAPIModule);
return bRet;
}
通过cmd命令调起该uwp程序(注意叹号前后的内容)
explorer.exe shell:appsFolder\microsoft.windowscommunicationsapps_8wekyb3d8bbwe!microsoft.windowslive.mail
^Here is the PackageFamilyName !^Here is the app ID
打开资源管理器,输入shell:appsFolder可以查看本机的所有uwp程序