PackageManager.FindPackageForUser (String, String) всегда возвращает ноль - PullRequest
0 голосов
/ 21 марта 2019

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

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 Kits \ 10 \ UnionMetadata \ 10.0.17763.0 \ Windows.winmd
  2. C: \Программные файлы (x86) \ Справочные сборки \ Microsoft \ Framework.NETCore \ v4.5 \ System.Runtime.WindowsRuntime.dll

ПРИМЕЧАНИЕ : сначала используйте VS2017, Iзапустил этот пример кода для метода FindPackages(), чтобы найти все пакеты, установленные на моем Windows 10.И я обнаружил несколько пакетов, которые установлены в Windows по умолчанию.И я попробовал следующие два, но оба они возвращают ноль в приведенной выше строке кода.

Ниже приведены два пакета, которые возвращает метод 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 голосов
/ 08 апреля 2019

С методом FindPackageForUser проблем нет.Для успешной работы этого метода сначала необходимо запустить Visual Studio в режиме Администратор ( Шаги: «Пуск-> Щелкните правой кнопкой мыши Visual Studio -> Дополнительно -> Запуск от имени администратора» * 1005).*).

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

Чтобы проверить эту точку, вы можете проверить сообщение в окне вывода при вызове метода FindPackages().Различные пакеты должны иметь разные user и 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 вернет конкретную информацию о пакете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...