#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 и т.д.), Как описано здесь:
- C:Program Files (x86) Windows Kits10UnionMetadata 10.0.17763.0Windows.winmd
- 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’, чтобы увидеть, установлен ли он для текущего пользователя?