PackageManager.FindPackageForUser(String,String)始终返回null

时间:2019-03-20 21:11:01

标签: c# winforms uwp

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

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

备注:要测试FindPackageForUser(…)方法,您需要首先按照说明向您的VS2017项目的任何类型(Winform,WPF等)添加以下引用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,我为FindPackages()方法运行了this示例代码示例,以查找我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

1 个答案:

答案 0 :(得分:0)

FindPackageForUser方法没有问题。为了使此方法成功工作,首先需要以管理员模式运行Visual Studio(步骤:“开始->右键单击Visual Studio->更多->以管理员身份运行” < / strong>)。

然后,当您调用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方法将成功返回特定的软件包信息。