PackageManager.FindUsers(String) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
public:
virtual IIterable<PackageUserInformation ^> ^ FindUsers(Platform::String ^ packageFullName) = FindUsers;
IIterable<PackageUserInformation> FindUsers(winrt::hstring const& packageFullName);
public IEnumerable<PackageUserInformation> FindUsers(string packageFullName);
function findUsers(packageFullName)
Public Function FindUsers (packageFullName As String) As IEnumerable(Of PackageUserInformation)
매개 변수
- packageFullName
-
String
Platform::String
winrt::hstring
패키지의 전체 이름입니다. 이 매개 변수는 null일 수 없습니다.
반환
메서드가 성공하면 패키지 사용자 정보 개체의 열거 가능한 컬렉션이 반환됩니다. 이 컬렉션의 각 PackageUserInformation 개체에는 지정된 패키지가 설치된 사용자의 사용자 SID(사용자 보안 식별자)가 포함됩니다. 지정된 패키지의 전체 이름을 가진 패키지를 찾을 수 없는 경우 이 메서드는 빈 목록을 반환합니다.
Windows 요구 사항
앱 기능 |
packageManagement
|
예제
PackageManager.FindUsers 메서드를 호출하여 패키지를 설치한 사용자를 열거합니다. 이 예제에서는 PackageUserInformation.UserSecurityId 속성에 정보를 표시합니다.
using System.Security.Principal;
using Windows.Deployment.PackageManager;
private static void DisplayPackageUsers(
PackageManager packageManager,
Windows.ApplicationModel.Package package)
{
IEnumerable<PackageUserInformation> packageUsers = packageManager.FindUsers(
package.Id.FullName);
Console.Write("Users: ");
foreach (var packageUser in packageUsers)
{
Console.Write("{0} ", SidToAccountName(packageUser.UserSecurityId));
}
Console.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;
}
}
또한, Visual Studio의 C++/WinRT 지원을 참조하세요.
// main.cpp : In Visual Studio, create a new Windows Console Application (C++/WinRT), and run it (or run Visual Studio) as administrator.
#include "pch.h"
#include <winrt/Windows.ApplicationModel.h>
#include <winrt/Windows.Management.Deployment.h>
#include <winrt/Windows.Storage.h>
#include <iostream>
#include <Sddl.h>
using namespace winrt;
using namespace Windows::ApplicationModel;
using namespace Windows::Management::Deployment;
using namespace Windows::Storage;
std::wstring SidToAccountName(std::wstring const& sidString)
{
PSID sid{ nullptr };
std::wstring accountName{ sidString };
if (::ConvertStringSidToSid(sidString.c_str(), &sid))
{
DWORD nameCharCount{ 0 };
DWORD domainNameCharCount{ 0 };
SID_NAME_USE sidType;
// determine how much space is required to store the name and domainName.
::LookupAccountSid(nullptr, sid, nullptr, &nameCharCount, nullptr, &domainNameCharCount, &sidType);
std::wstring name; name.resize(nameCharCount + 1);
std::wstring domainName; domainName.resize(domainNameCharCount + 1);
try
{
if (::LookupAccountSid(nullptr, sid, name.data(), &nameCharCount, domainName.data(), &domainNameCharCount, &sidType))
{
accountName = domainName + L"\\" + name;
}
}
catch (...)
{
// do nothing, original SID will be used.
}
}
if (sid != nullptr)
::LocalFree(sid);
return accountName;
}
void DisplayPackageUsers(PackageManager const& packageManager, Windows::ApplicationModel::Package const& package)
{
std::wcout << L"Users: ";
for (auto const& packageUser : packageManager.FindUsers(package.Id().FullName()))
{
std::wstring stringSid = SidToAccountName(packageUser.UserSecurityId().c_str());
std::wcout << stringSid << L" ";
}
std::wcout << std::endl;
}
int wmain()
{
winrt::init_apartment();
PackageManager packageManager;
int count{ 10 };
for (auto const& package : packageManager.FindPackages())
{
DisplayPackageUsers(packageManager, package);
count--;
if (count == 0) break;
}
return 0;
}
using Windows::Management::Deployment;
void DisplayPackageUsers(
PackageManager^ packageManager,
Windows::ApplicationModel::Package^ package)
{
IIterable<PackageUserInformation^>^ packageUsers = packageManager->FindUsers(
package->Id->FullName);
wcout << L"Users: ";
std::for_each(begin(packageUsers), end(packageUsers),
[&](PackageUserInformation^ packageUser)
{
wstring stringSid;
SidToAccountName(packageUser->UserSecurityId->Data(), stringSid);
wcout << stringSid << L" ";
});
wcout << endl;
}
void SidToAccountName(wstring sidString, wstring& stringSid)
{
PSID sid = NULL;
if ( ConvertStringSidToSid(sidString.c_str(), &sid) )
{
DWORD nameCharCount = 0;
DWORD domainNameCharCount = 0;
SID_NAME_USE sidType;
// determine how much space is required to store the name and domainName
LookupAccountSid(NULL, sid, NULL, &nameCharCount, NULL, &domainNameCharCount, &sidType);
wchar_t *name = new wchar_t[nameCharCount + 1]; // leave space for terminating null
wchar_t *domainName = new wchar_t[domainNameCharCount + 1];
ZeroMemory(name, (nameCharCount + 1) * sizeof(wchar_t));
ZeroMemory(domainName, (domainNameCharCount + 1) * sizeof(wchar_t));
try
{
if ( LookupAccountSid(NULL, sid, name, &nameCharCount, domainName, &domainNameCharCount, &sidType) )
{
stringSid = domainName;
stringSid = stringSid + L"\\" + name;
}
}
catch ( ... )
{
// do nothing, original SID will be used.
}
delete [] domainName;
delete [] name;
}
if ( stringSid.length() == 0 )
stringSid = sidString;
if ( sid != NULL )
LocalFree(sid);
}
설명
이 메서드에는 관리 권한이 필요합니다.