API для получения AppContainerName из AppContainerSid

Скажи, если у меня есть DACL для процесса, который мне нужно показать для конечного пользователя. Я могу преобразовать его в строковое представление с ConvertSecurityDescriptorToStringSecurityDescriptor, Затем мне нужно сделать его более управляемым, удалив из него «сумасшедшие» локальные идентификаторы безопасности. Вот пример:

D:(A;;0x1fffff;;;S-1-5-21-2301966995-2804055512-1978750589-1002)(A;;0x1fffff;;;SY)(A;;0x121411;;;S-1-5-5-0-1207601)(A;;0x1fffff;;;S-1-15-2-155514346-2573954481-755741238-1654018636-1233331829-3075935687-2861478708)

Например, результирующая строка может включать SID пользователя (или S-1-5-21-2301966995-2804055512-1978750589-1002 в случае выше), который я могу преобразовать в имя пользователя с LookupAccountName, но я не могу найти способ конвертировать SID AppContainer в имя AppContainer.

В этом случае, S-1-15-2-155514346-2573954481-755741238-1654018636-1233331829-3075935687-2861478708 обозначает Microsoft.Windows.ShellExperienceHost,

Существует API, который может преобразовать последний в первый, называемый DeriveAppContainerSidFromAppContainerName.

Но мне интересно, как мне конвертировать AppContainerSid в AppContainerName?

1

Решение

Для этой задачи существуют недокументированные функции (смотрите app_container.cc
из хрома
)

LONG WINAPI AppContainerLookupMoniker(PSID Sid, PWSTR* packageFamilyName);

это экспортировано из api-ms-win-appmodel-identity-l1-2-0.dll

он принимает ваш sid в качестве входной и возвращаемой строки — packageFamilyName. бесплатно эту строку нужно использовать другой недокументированный API

BOOLEAN WINAPI AppContainerFreeMemory(void* ptr);

возвращенный packageFamilyName мы можем использовать уже в документированных API GetPackagesByPackageFamily. возвращенный packageFullName мы уже можем использовать в API, как GetStagedPackagePathByFullName, OpenPackageInfoByFullName, так далее..

например:

#include <appmodel.h>

void AppXtest(PSID Sid)
{
LONG (WINAPI* AppContainerLookupMoniker)(PSID Sid, PWSTR* packageFamilyName);
BOOLEAN (WINAPI* AppContainerFreeMemory)(void* ptr);

if (HMODULE hmod = LoadLibraryW(L"api-ms-win-appmodel-identity-l1-2-0"))
{
if ((*(void**)&AppContainerLookupMoniker = GetProcAddress(hmod, "AppContainerLookupMoniker")) &&
(*(void**)&AppContainerFreeMemory = GetProcAddress(hmod, "AppContainerFreeMemory")))
{

PWSTR packageFamilyName;
LONG err = AppContainerLookupMoniker(Sid, &packageFamilyName);

if (err == NOERROR)
{
DbgPrint("%S\n", packageFamilyName);

UINT32 count = 0, bufferLength = 0;

if (ERROR_INSUFFICIENT_BUFFER == GetPackagesByPackageFamily(packageFamilyName, &count, 0, &bufferLength, 0))
{
PWSTR *packageFullNames = (PWSTR*)alloca(count * sizeof(PWSTR) + bufferLength*sizeof(WCHAR));
PWSTR buffer = (PWSTR)(packageFullNames+ count);

if (NOERROR == GetPackagesByPackageFamily(packageFamilyName, &count, packageFullNames, &bufferLength, buffer))
{
if (count)
{
do
{
PCWSTR packageFullName = *packageFullNames++;
DbgPrint("%S\n", packageFullName);

WCHAR path[MAX_PATH];
UINT32 len = RTL_NUMBER_OF(path);

if (NOERROR == GetStagedPackagePathByFullName(packageFullName, &len, path))
{
DbgPrint("%S\n", path);
}
} while (--count);
}
}
}

AppContainerFreeMemory(packageFamilyName);
}
}
}
}

для сид S-1-15-2-155514346-2573954481-755741238-1654018636-1233331829-3075935687-2861478708

я получил:

microsoft.windows.shellexperiencehost_cw5n1h2txyewy
Microsoft.Windows.ShellExperienceHost_10.0.14393.0_neutral_neutral_cw5n1h2txyewy
C:\Windows\SystemApps\ShellExperienceHost_cw5n1h2txyewy
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]