【问题标题】:PackageManager.FindPackageForUser(String, String) always returning nullPackageManager.FindPackageForUser(String, String) 总是返回 null
【发布时间】:2019-08-11 16:57:53
【问题描述】:

为什么我下面的this 方法的代码示例正在返回?

using Windows.Management.Deployment;
…
...
Windows.ApplicationModel.Package oPkg = oPkgManager.FindPackageForUser(string.Empty, "HoloCamera_1.0.0.5_neutral__cw5n1h2txyewy");

备注:要测试FindPackageForUser(…) 方法,您需要首先将以下引用添加到您的任何类型(Winform、WPF 等)的VS2017 项目中,如here 所述:

  1. C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.17763.0\Windows.winmd
  2. C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

注意:首先使用VS2017,我运行this 示例代码示例FindPackages() 方法来查找安装在我的Windows 10 上的所有包。我发现了几个默认安装在 Windows 上的软件包。而且,我尝试了以下两个,但它们都在上面的代码行中返回 null。

以下是FindPackages() 方法返回的两个包。而且,我在上面的代码示例中都尝试了它们

1.

Name: HoloCamera
FullName: HoloCamera_1.0.0.5_neutral__cw5n1h2txyewy

Version: 1.0.0.5

Publisher: CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US

PublisherId: cw5n1h2txyewy

IsFramework: False

And

2.

Name: DesktopLearning

FullName: DesktopLearning_1000.15063.0.0_neutral__cw5n1h2txyewy

Version: 1000.15063.0.0

Publisher: CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US

PublisherId: cw5n1h2txyewy

IsFramework: False

【问题讨论】:

  • 我已将此问题报告给相关团队。他们正在调查它。感谢您的反馈。

标签: c# winforms uwp


【解决方案1】:

FindPackageForUser 方法没有问题。要使此方法成功运行,您首先需要在 Administrator 模式下运行您的 Visual Studio(步骤:'开始-> 右键单击​​您的 Visual Studio -> 更多 -> 以管理员身份运行')。

那么,当你调用FindPackageForUser方法并将string.Empty作为第一个参数传递时,如果它返回NULL,则表示当前用户没有安装这个包。

要验证这一点,您可以在调用FindPackages() 方法时检查输出窗口中的消息。不同的包应该有不同的用户和用户securityId。您可以使用“DisplayPackageUsers”方法查看用户 securityId,如下所示:

private static void DisplayPackageUsers(Windows.Management.Deployment.PackageManager packageManager, Windows.ApplicationModel.Package package)
{
    IEnumerable<Windows.Management.Deployment.PackageUserInformation> packageUsers = packageManager.FindUsers(package.Id.FullName);
    Debug.Write("Users: ");
    foreach (var packageUser in packageUsers)
    {
        Debug.Write(string.Format("{0},UserSecurityId: {1} ", SidToAccountName(packageUser.UserSecurityId), packageUser.UserSecurityId));
    }
    Debug.WriteLine("");
}
private static string SidToAccountName(string sidString)
{
    SecurityIdentifier sid = new SecurityIdentifier(sidString);
    try
    {
        NTAccount account = (NTAccount)sid.Translate(typeof(NTAccount));
        return account.ToString();
    }
    catch (IdentityNotMappedException)
    {
        return sidString;
    }
}

所以,如果要使用FindPackageForUser 方法查找某个包,还需要将特定用户securityId 作为第一个参数传递。您可以从上述方法中获取适当的用户 securityId。然后调用FindPackageForUser方法会成功返回具体的包信息。

【讨论】:

  • 根据您的建议,我尝试在管理员模式下使用VS2017。我看到我的 Windows 10 安装了一个全名 HoloCamera_1.0.0.5_neutral__cw5n1h2txyewy 的软件包。但是(如我上面的帖子所示)代码oPkgManager.FindPackageForUser(string.Empty, "HoloCamera_1.0.0.5_neutral__cw5n1h2txyewy"); 仍然返回Null。为什么?
  • @nam 你仔细看我的回复了吗?正如我所说,您需要通过我上面的方法检查包的用户和用户securityId。如果您将string.Empty 作为FindPackageForUser 方法的第一个参数传递,它将只返回当前用户的包。但是您是否检查过“HoloCamera_1.0.0.5_neutral__cw5n1h2txyewy”软件包以查看它是否为当前用户安装?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2014-07-14
  • 2011-11-18
相关资源
最近更新 更多