Как найти цель псевдонима выполнения приложения Windows в C # / Win32 api? - PullRequest
0 голосов
/ 19 июня 2020

Microsft Windows Терминал (устанавливается через Microsoft Store) создает 0-байтовый wt.exe файл, который является Windows псевдонимом выполнения . AFAIK это что-то похожее на символическую ссылку c, за исключением того, что она, похоже, разрешена на уровне CreateProcess Api в отличие от символической ссылки, которая транслируется в файловой системе.

В PowerShell:

❯ dir ~\AppData\Local\Microsoft\WindowsApps\wt.exe

Mode    Name
----    ----
la---   wt.exe -> C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.0.1401.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe

❯ Get-Item .\wt.exe | fl

Name           : wt.exe
Length         : 0
LinkType       : AppExeCLink
Target         : C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.0.1401.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe

Мне не удалось найти подходящую документацию для этих «новых» псевдонимов. Даже поиск в Google значения PS AppExeCLink не очень полезен.

Мне нужен быстрый способ разрешить псевдоним выполнения (получить целевой файл) в приложении C#. Учитывая мои требования, я предпочитаю неуправляемый (Win32 Api) способ добавления ссылки на медленный WMI или внешний пакет nuget 300 КБ.

Спасибо!

1 Ответ

1 голос
/ 19 июня 2020

Вы также можете попробовать добавить Microsoft.PowerShell.5.1.ReferenceAssemblies пакет nuget в свой проект.

Тогда работает следующий код:

using System.Linq;
using System.Management.Automation;

string wtPath =
    Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
        "Microsoft",
        "WindowsApps",
        "wt.exe"
    );

using (var ps = PowerShell.Create())
{
    var psObject = ps.AddCommand("Get-Item").AddParameter("Path", wtPath).Invoke().Single();
    var psPropInfo = psObject.Properties["Target"];

    string[] targets = (psPropInfo.Value as List<string>).ToArray();

    Console.WriteLine($"[{psPropInfo.Name}]=[{String.Join("; ", targets)}]");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...