Как получить полное имя Appx из строки с подстановочным знаком? - PullRequest
0 голосов
/ 11 июня 2018

В Powershell эта команда Get-AppxPackage *name* может показать полную информацию о пакете.Можно ли использовать какой-либо Windows API для получения такого же результата?

Я видел этот вопрос и подробности всех API запросов пакетов .Но им всем нужны полные имена пакетов или дескриптор работающего процесса пакета.Они не работают со строкой подстановки.

Например, если я установил этот пакет Microsoft.WindowsCalculator_8wekyb3d8bbwe, я могу получить подробности с помощью команды Get-AppxPackage *Calculator*.Это возможно с любым Windows API?Я хочу избегать system() или CreateProcess() подобных вещей.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Благодаря ответу @ f6a4.Я выбрал обратный путь для достижения своей цели.Вот моя процедура:

Я нахожу ответ , чтобы найти DLL, стоящую за Get-AppxPacage командлетом в Powershell.С помощью этой команды (Get-Command Get-AppxPackage).dll Powershell показывает путь к файлу DLL следующим образом:

C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Windows.Appx.PackageManager.Commands\v4.0_10.0.0.0__31bf3856ad364e35\Microsoft.Windows.Appx.PackageManager.Commands.dll

Перейдите по этому пути в проводнике и откройте файл Microsoft.Windows.Appx.PackageManager.Commands.dll в любом декомпиляторе .NET.Здесь я использовал dnSpy .Командный раздел Get-AppxManifest имеет следующий код C #:

protected override void ProcessRecord()
{
    AppxPackage appxPackage = this.packageManager.FindPackage(this.Package);
    if (appxPackage != null)
    {
        string str;
        if (appxPackage.IsBundle)
        {
            str = "\\AppxMetadata\\AppxBundleManifest.xml";
        }
        else
        {
            str = "\\AppxManifest.xml";
        }
        using (FileStream fileStream = new FileStream(appxPackage.InstallLocation + str, FileMode.Open, FileAccess.Read))
        {
            using (XmlReader xmlReader = XmlReader.Create(fileStream, new XmlReaderSettings
            {
                DtdProcessing = DtdProcessing.Ignore
            }))
            {
                XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.Load(xmlReader);
                base.WriteObject(xmlDocument);
            }
        }
    }
}

Я преобразовал этот код в аналогичный код C с помощью Windows API.Вот фрагмент кода:

ExpandEnvironmentStringsW(L"%ProgramFiles%\\WindowsApps", Buffer, MAX_PATH);

swprintf(FirstFile, MAX_PATH, L"%ls\\*", Buffer);

hFile = FindFirstFileW(FirstFile, &fileInfo);
if (hFile != INVALID_HANDLE_VALUE) {
    do {
        if (wcsstr(fileInfo.cFileName, AppxName) != 0) {
            memcpy(PackageName, fileInfo.cFileName, MAX_PATH);
        }
    } while (FindNextFileW(hFile, &fileInfo) != 0);
}
0 голосов
/ 11 июня 2018

Вы можете просмотреть папку приложения и получить имена из файлов манифеста xml.Для доступа к папке приложения необходимы права администратора.

В этом примере перечислены все приложения с именем «xbox».Логика может быть легко адаптирована к C # или другому языку.

$appNameFilter = '*xbox*'

[System.Collections.Generic.List[string]]$appList = @()

$apps = Get-ChildItem 'C:\Program Files\WindowsApps' -Recurse -Filter 'AppxManifest.xml'

foreach( $app in $apps ) {

    $xml     = [xml](Get-Content $app.FullName)
    $appName = $xml.Package.Properties.DisplayName

    if( $appName -like $appNameFilter -and !$appList.Contains( $appName )) {
        $appList.Add( $appName )
    }
}

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