PackageManager.FindPackageForUser(строка, String) всегда возвращает null

#c# #winforms #uwp

#c# #winforms #uwp

Вопрос:

Почему мой следующий пример кода этого метода возвращает?

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

Замечание: Чтобы протестировать FindPackageForUser(…) метод, вам нужно сначала добавить следующие ссылки на ваш VS2017 проект любого типа (Winform, WPF и т.д.), Как описано здесь:

  1. C:Program Files (x86) Windows Kits10UnionMetadata 10.0.17763.0Windows.winmd
  2. C:Program Файлы (x86) Ссылочные сборки Microsoft Framework.NETCore v4.5 System.Runtime.WindowsRuntime.dll

ПРИМЕЧАНИЕ: При первом использовании VS2017 я запустил этот пример кода для 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
  

Комментарии:

1. Я сообщил об этом вопросе соответствующей команде. Они расследуют это. Спасибо за ваш отзыв.

Ответ №1:

С FindPackageForUser методом проблем нет. Чтобы этот метод работал успешно, сначала необходимо запустить Visual Studio в режиме администратора(Шаги: «Пуск-> щелкните правой кнопкой мыши visual studio -> Подробнее -> Запуск от имени администратора»).

Затем, когда вы вызываете FindPackageForUser метод и передаете string.Empty в качестве первого параметра, если он возвращает NULL , это означает, что этот пакет не установлен для текущего пользователя.

Чтобы подтвердить этот момент, вы могли бы проверить сообщение в окне вывода при вызове FindPackages() метода. Разные пакеты должны иметь разных пользователей и user SecurityID. Вы могли бы использовать метод ‘DisplayPackageUsers’, чтобы увидеть идентификатор безопасности пользователя следующим образом:

 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 в качестве первого параметра. Вы могли бы получить соответствующий идентификатор безопасности пользователя с помощью вышеуказанных методов. Затем вызов FindPackageForUser метода успешно вернет конкретную информацию о пакете.

Комментарии:

1. Согласно вашему предложению, я попытался использовать VS2017 в режиме администратора. Я вижу, что в моей Windows 10 установлен пакет с полным именем HoloCamera_1.0.0.5_neutral__cw5n1h2txyewy . Но (как показано в моем сообщении выше) код oPkgManager.FindPackageForUser(string.Empty, "HoloCamera_1.0.0.5_neutral__cw5n1h2txyewy"); все еще возвращает Null . Почему?

2. @nam Вы внимательно проверили мой ответ? Как я уже сказал, вам нужно проверить пользователя пакета и идентификатор безопасности пользователя с помощью моего вышеупомянутого метода. Если вы передадите метод string.Empty в качестве FindPackageForUser первого параметра, он вернет только пакет текущего пользователя. Но проверяли ли вы пакет ‘HoloCamera_1.0.0.5_neutral__cw5n1h2txyewy’, чтобы увидеть, установлен ли он для текущего пользователя?