如何使执行别名在 Windows Server 2019 上工作?

Posted

技术标签:

【中文标题】如何使执行别名在 Windows Server 2019 上工作?【英文标题】:How do I make an execution alias work on Windows Server 2019? 【发布时间】:2021-08-02 08:23:56 【问题描述】:

我将一个 Win32 控制台应用打包到一个 MSIX 包中。在 Win 10 上一切正常。我也可以在 Windows Server 2019 上安装它,但无法通过调用别名或任何其他方式从控制台运行它。

    应用安装在C:\Program Files\WindowsApps\stackmuncher_1.1.1.0_x64__eqf80b1s88fx6C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps 中有一个别名作为零长度文件 如果我将可执行文件从 C:\Program Files\WindowsApps\stackmuncher_1.1.1.0_x64__eqf80b1s88fx6 复制到任何其他文件夹,我可以运行该应用程序 别名显示在 Settings > App Execution Aliases

如果我尝试通过其别名 stackmuncher.exe 从 PS 或 CMD 终端运行应用程序,我会收到“未找到”消息。

我将%userprofile%\AppData\Local\Microsoft\WindowsApps 添加到系统Path 变量并得到了不同的错误:

程序“stackmuncher.exe”运行失败:指定的可执行文件不是此操作系统平台的有效应用程序

似乎已经安装了该应用程序,并且它需要正常运行的所有文件都在那里。

如何使用别名或任何其他方式运行它?


包裹信息

PS C:\rust\stm> get-appxpackage |  Where-Object  $_.Name -like "*stackmuncher*" 

Name              : stackmuncher
Publisher         : CN=stackmuncher, C=NZ
Architecture      : X64
ResourceId        :
Version           : 1.1.1.0
PackageFullName   : stackmuncher_1.1.1.0_x64__eqf80b1s88fx6
InstallLocation   : C:\Program Files\WindowsApps\stackmuncher_1.1.1.0_x64__eqf80b1s88fx6
IsFramework       : False
PackageFamilyName : stackmuncher_eqf80b1s88fx6
PublisherId       : eqf80b1s88fx6
IsResourcePackage : False
IsBundle          : False
IsDevelopmentMode : False
NonRemovable      : False
IsPartiallyStaged : False
SignatureKind     : Developer
Status            : Ok

AppManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<Package
    xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" 
  >
  <Identity Name="stackmuncher" Version="1.1.1.0" Publisher="CN=stackmuncher, C=NZ" ProcessorArchitecture="x64" />
    <Properties>
       <DisplayName>stackmuncher</DisplayName>
       <PublisherDisplayName>stackmuncher</PublisherDisplayName>
             <Description>stackmuncher app</Description>
      <Logo>150.png</Logo>
    </Properties>
    <Resources>
      <Resource Language="en-us" />
    </Resources>
      <Dependencies>
        <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.15063.0" />
      </Dependencies>
      <Capabilities>
        <rescap:Capability Name="runFullTrust"/>
      </Capabilities>
    <Applications>
      <Application Id="stackmuncher" Executable="stackmuncher.exe" EntryPoint="Windows.PartialTrustApplication">
        <uap:VisualElements DisplayName="stackmuncher" Description="stackmuncher app"   Square150x150Logo="150.png" Square44x44Logo="44.png"    BackgroundColor="#999999" />
        <Extensions>
          <uap3:Extension Category="windows.appExecutionAlias" EntryPoint="Windows.FullTrustApplication" Executable="stackmuncher.exe">
            <uap3:AppExecutionAlias>
              <desktop:ExecutionAlias Alias="stackmuncher.exe"/>
            </uap3:AppExecutionAlias>
          </uap3:Extension>
        </Extensions>
      </Application>
    </Applications>
  </Package>

完整的错误信息

PS C:\> stackmuncher.exe
Program 'stackmuncher.exe' failed to run: The specified executable is not a valid application for this OS platform.At
line:1 char:1
+ stackmuncher.exe
+ ~~~~~~~~~~~~~~~~.
At line:1 char:1
+ stackmuncher.exe
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (:) [], ApplicationFailedException
    + FullyQualifiedErrorId : NativeCommandFailed
安装者:https://distro.stackmuncher.com/msix/stackmuncher.msix 自签名证书:https://distro.stackmuncher.com/stm.cer

【问题讨论】:

MSIX 文档明确指出 WinServer 2019 (docs.microsoft.com/en-us/windows/msix/msix-server-2019) 不支持执行别名。似乎它们在一定程度上受到支持 - 创建了别名,但不能像在 Win10 上那样调用它,或者可能没有办法调用它。 【参考方案1】:

正如您在评论中提到的,Win Server 2019 不支持执行别名(很遗憾)。我刚刚在使用 Windows Server 2019 的 GitHub Actions 上测试我的 MSIX 包时遇到了同样的问题。

我找到了几种运行已安装包的方法。

    使用PowerShell commandInvoke-CommandInDesktopPackage。您也可以调用您的主要可执行文件。我测试了这种方法,它可以工作(虽然在我的机器上),但是很难从代码中做到这一点,然后将其附加到目标应用程序进程。

    另一种方法是使用类似的命令运行应用程序 explorer.exe shell:appsFolder\&lt;ApplicationID&gt;!&lt;AppID&gt;。这种方法描述了here with handy scripts。我还没有找到添加命令行参数的方法,所以对我来说不行。

    使用协议。它需要对应用程序进行额外的更改,但对我来说,这是最简单、最可靠的方法。所以我为我的应用程序添加了协议支持,如in this article 所述。在我的代码中,我只是添加了几行来支持这种类型的参数:

     public AppConfigBuilder AppendCommandLineArgs(string[] args)
     
         const string protocol = "myproto:?";
    
         bool isProtocolUsage = args.Any() && args[0].StartsWith(protocol);
    
         string[] keyValueArgs = isProtocolUsage
             ? args[0][(args[0].IndexOf("?", StringComparison.Ordinal) + 1)..].Split('&')
             : args;
    
         var configuration = new ConfigurationBuilder()
             .AddCommandLine(keyValueArgs)
             .Build();
    
             ...
     
    

基本上,我将它转换为常规args并将其传递给ConfigurationBuilder,它处理得很好。

【讨论】:

以上是关于如何使执行别名在 Windows Server 2019 上工作?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:如何在更新语句中使用别名?

在 Windows 7 中为 composer 创建一个工作别名

Sql Server:如何使用别名取消透视?

如何使用Windows Power Shell

如何修改windows server 2003远程桌面最大连接数

如何从联合类型中解开泛型类型别名,从而使类型别名更具体?