65.9K
CodeProject 正在变化。 阅读更多。
Home

部署已侧载的 Windows 8 应用到生产环境

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (6投票s)

2015年7月31日

CPOL

10分钟阅读

viewsIcon

37558

downloadIcon

212

通过本文,您将了解如何轻松地将侧载的 Windows 8 应用部署到生产环境,以及如何维护/提供应用的定期升级版本。

引言

侧载 (Sideloading):侧载简单来说就是不通过应用商店发布和下载,直接安装 Windows 应用商店的应用。您直接安装它们。基本上,它们是业务线 (LOB) 应用。这意味着利益相关者不希望通过 Windows 应用商店发布应用,因为那样会让应用公开可用。

背景

我一直在开发一个 Windows 8 应用,该应用将被侧载到客户的平板电脑上。平板电脑运行的是 Windows 8.1 Pro。我需要侧载该应用并提供升级包作为错误修复和功能改进。在处理所有这些事情的过程中,我学到了一些东西,我决定分享它们,因为我发现要获取侧载应用的所有必需信息非常困难。以下是我为完成部署所遵循的步骤。

分步部署流程

第一步 - 允许在客户机器上安装所有受信任的应用

要在客户机器上安装您的应用,您需要启用该功能。要做到这一点,您需要将以下注册表项的值从 0 更改为 1HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Appx\AllowAllTrustedApps = 1

第二步 - 创建自己的签名证书和程序包密钥

您必须将证书日期更改为最长有效期,并将发布者名称更改为适当的名称。例如,您可能会想,为什么我需要证书,因为 Visual Studio 已经为我生成了一个?好的,Visual Studio 确实会为您生成证书。但 Visual Studio 还会设置一个通常为一年的到期日期。那么,如果到期日期过了,会发生什么?应用是否还能正常运行?我的发现是,应用仍然可以正常运行,但您将无法安装新版本或升级应用。因此,除非您将证书更改为客户的平板电脑或设备,否则您将无法向该设备安装/升级任何东西。所以,首先要更改它们。以下是一些截图,说明我所说的内容。

在上面的截图中,您会找到 Package.appxmanifest 文件,双击该文件并导航到“Packaging”选项卡。在那里,您会找到程序包名称和程序包系列名称。如果您更改程序包名称,程序包系列名称也会相应更改。一旦设置,这个程序包系列名称就无法更改。您将找到运行您的应用所需的所有必要的 DLL 和其他文件,这些文件在该文件夹中,位于C:\Program Files\WindowsApps\Package 系列名称文件夹下。

在“Publisher”选项卡的右侧,您会找到“Certificate”按钮。点击该按钮,您会看到一个带有发布者名称(默认情况下,它会采用 PC 的管理员用户名)和一年到期日期的证书。我们需要更改此到期日期。我在上面解释了为什么需要这样做。

您将需要两个 EXE 文件来创建您自己的签名证书文件和程序包密钥文件,并使用您自己的密码进行签名。它们是 makecert.exepvk2pfx.exe

您可能会在以下位置找到 makecert.exe 文件:C:\Program Files (x86)\Windows Kits\8.1\bin\x64

以及在以下位置找到 pvk2pfx.exeC:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin

位置可能不匹配,因为您设备上运行的 Visual Studio 版本可能不匹配。我正在笔记本电脑上运行 Visual Studio 2013 进行开发。因此,您需要做一些工作来找到它们。我还将 EXE 文件附加到了文章中。

现在我们需要开始为我们的项目创建证书和程序包密钥。

  1. 在 C 驱动器上创建一个名为 MakeCert 的文件夹,并将这两个 EXE 文件放在那里,然后在命令提示符下运行以下两个命令。
    • C:\MakeCert>makecert -sv CodeProjectApp.pvk -n "CN= CodeProject" /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" CodeProjectApp.cer -b 05/07/2015 -e 05/08/2030 -r
    • C:\MakeCert>Pvk2Pfx -pvk CodeProjectApp.pvk -pi CodeProjectApp -spc CodeProjectApp.cer -pfx CodeProjectApp_PermanentKey.pfx -po CodeProjectApp –f

** 这里,CodeProjectApp 是密码。CodeProjectApp.cer 是证书文件名。

在项目浏览器中,您会找到一个名为 CodeProjectApp_TemporaryKey.pfx 的临时个人信息交换文件或 .pfx 文件,该 pfx 文件包含该项目的所有必要信息。我们将用我们新创建的 CodeProjectApp_PermanentKey.pfx 文件替换该文件。为此,点击“Choose Certificate”按钮,然后选择我们刚刚在 C 驱动器上创建的文件。现在项目的证书将在 2030 年后到期。

但这还不是全部,我们需要单独安装证书才能与应用程序匹配。要做到这一点,请遵循以下步骤。

  1. 右键单击 CodeProjectApp.cer 文件 -> 选择“安装证书” ->“本地计算机” ->“下一步” ->“将所有证书放入下列存储区” ->“浏览” -> 选择“受信任的根证书颁发机构” ->“确定” ->“下一步” ->“完成”。
  2. 为了确保到期日期并且证书已正确安装,请执行以下操作。
    1. 按 Windows 键 + S,然后键入“管理用户证书”。然后,展开“受信任的根证书颁发机构” ->“证书”。在那里,您会找到刚刚安装的证书。双击该证书以查看到期日期。

** 证书安装过程是针对发布版本的应用程序将要运行的客户 PC 进行的。

** 您需要安装侧载密钥并激活您客户 PC 上的侧载功能,才能成功安装和运行应用程序。要获取侧载密钥,您必须与 Microsoft 代表沟通以获取密钥。

这是 Microsoft 关于获取侧载密钥的指南链接。(https://technet.microsoft.com/en-us/library/dn613835.aspx

关于侧载

您可以使用 Windows 软件许可管理工具 (Slmgr.vbs) 为这些场景启用侧载,并为每个目标设备执行以下步骤。

  1. 为设备获取侧载产品激活密钥。有关如何获取侧载产品激活密钥的更多信息,请参阅 Windows 8 Volume Licensing Guide
  2. 通过从提升的命令提示符运行以下命令将侧载产品激活密钥添加到设备(其中 <sideloading product key> 是 25 位侧载产品激活密钥)

    Slmgr /ipk <sideloading product key>

  3. 通过从提升的命令提示符运行以下命令激活侧载产品激活密钥

    Slmgr /ato ec67814b-30e6-4a50-bf7b-d55daf729d1e

第三步 - 创建用于部署的应用包

现在是时候创建应用包了。

步骤

  1. CodeProjectApp 应用创建应用包。选择 CodeProjectApp 项目,然后从 Visual Studio 菜单中选择“Project”选项,然后 ->“Store” ->“Create App Packages” ->“No” -> 检查版本号 ->“Generate app bundle”(选择“Never”) -> 检查 x86 ->“Create” -> 创建应用包需要一些时间,完成后会显示一个窗口,其中包含包文件夹路径链接(您可以点击该路径直接转到包文件夹。此包文件夹包含 .appx 文件、“Dependencies”文件夹) ->“Close”。
  2. 对于版本号,较高的版本号通常用作应用程序的升级版本。因此,要手动升级应用程序,您只需要创建一个版本号高于已安装版本的应用包,然后再次安装该应用程序即可。例如,如果已安装的应用程序版本号是 1.0.0.1,那么 1.0.0.2 将作为升级版本,如果您安装新版本。在这种情况下,数据库将保持不变。具有更高内部版本号的版本不会更改或删除数据库文件和其他资源。您还必须牢记,如果某个机器上已安装了较高版本应用程序,则较低版本将无法安装。

** 如果已安装版本和新版本的程序包系列名称(我们项目的程序包系列名称是 CodeProjectApp_763n4ec54fjwc)保持不变,则最新版本将作为升级包。如果它们的程序包系列名称不同,则会安装一个较新的版本。通常,已安装的文件夹也包含版本号。例如,已安装的文件夹名称将是 CodeProjectApp_1.0.0.1_x86_763n4ec54fjwc

我们已经生成了 .appx 文件,现在我们需要使用 powershell 安装 .appx 文件。我创建了一个 EXE 文件来完成所有这些工作。我已将此任务的源代码附加。请按照以下步骤使用 C# 代码和 powershell 安装应用程序。

首先,您需要获得使用 powershell 的访问权限,因为设备用户可能没有 proper 访问权限来安装或升级应用程序。为此,我做了以下工作。

private static void PreparePowerShellPermission()
{
   using (PowerShell powershell = PowerShell.Create())
   {
      powershell.AddScript("Set-ExecutionPolicy RemoteSigned -Scope CurrentUser");
      IAsyncResult result = powershell.BeginInvoke();
      Console.Write("\nWaiting to get access permission of CurrentUser");
      while (result.IsCompleted == false)
      {
        Console.Write(".");
        Thread.Sleep(2000);
      }
      Console.Write("\n");
      Console.Write("-Access granted!\n");
   }

   using (PowerShell powershell = PowerShell.Create())
   {
      powershell.AddScript("Set-ExecutionPolicy unrestricted");
      IAsyncResult result = powershell.BeginInvoke();
      Console.Write("\nWaiting to get permission of PowerShell");
      while (result.IsCompleted == false)
      {
        Console.Write(".");
        Thread.Sleep(2000);
      }
      Console.Write("\n");
      Console.Write("-Access granted!\n");
   }
}
private static string Execute(string scriptPath)
{
    const string shellPath = @"powershell.exe";
    var sb = new StringBuilder();
    sb.AppendFormat("\"&Add-AppxPackage '{0}'\" ", scriptPath);
    string result = ExecuteCommand(shellPath, sb.ToString());
    return result;
}

** 这里,scriptPath.appx 文件的位置。

** 这是我根据我的要求编写代码的方式。请根据您自己的要求修改它。

这是一个非常有用的链接,我从中获得了帮助。

升级 Windows 8 应用

假设您不想使用 Windows Intune 或 System Centre Configuration Manager 来安装或升级您的应用程序。那么真的有办法做到吗?答案是肯定的。我已经展示了安装过程。以下是升级应用程序的最简单方法。

步骤

  1. 假设您有一个 FTP 服务器,上面有一个升级包。升级包版本号为 1.0.0.2,而已安装的包版本号为 1.0.0.1。
  2. 现在假设您的应用程序中有一个升级应用程序的选项。比如按钮名称是“Upgrade App”。一旦点击“Upgrade App”按钮,您需要做的就是下载包含包文件(.appx 文件)的包文件/zip 文件,然后打开一个外部应用程序来从您的应用程序启动一个控制台应用程序。这是从 Windows 8 应用程序启动外部应用程序的代码。
    public async void LaunchExternalUpgraderApplication()
    {
      try
      {
         StorageFile file = await StorageFile.GetFileFromPathAsync
             (Path.Combine(ApplicationData.Current.LocalFolder.Path, 
              @"ExternalApplicationExtensions\ExternalApplication.ExternalApplicationExtension"));
         Launcher.LaunchFileAsync(file);
      }
      catch (Exception exception)
      {
         //
      }
    }

    ** 这里,ApplicationData.Current.LocalFolder.Path = "C:\Users\YourUserName\AppData\Local\Packages\CodeProjectApp_763n4ec54fjwc\LocalState"

  3. 在您的 LocalState 文件夹中创建一个名为 ExternalApplicationExtensions 的文件夹,并创建一个带有 ExternalApplicationExtension 扩展名的空文件。所以文件名将类似于 ExternalApplication.ExternalApplicationExtension
  4. 升级过程与安装过程相同。因此,使用上面的代码创建一个控制台应用程序,该应用程序可以自动运行升级程序。然后,将该控制台应用程序放在磁盘上的任何位置,并将此控制台应用程序设置为 ExternalApplication.ExternalApplicationExtension 文件的默认程序执行程序。要做到这一点,右键单击此 ExternalApplication.ExternalApplicationExtension 文件,然后将默认程序设置为我们刚刚创建的控制台应用程序。现在,一旦您启动此扩展文件,您的控制台应用程序就会运行并为您完成工作。搞定!

关注点

在开发和研发阶段,我学到了很多关于侧载 Windows 8 应用部署过程的知识。我已经描述了到目前为止我所面临的情况。如果您想在不使用 Windows Intune 或 Windows System Centre Configuration Manager 的情况下,通过您的 FTP 服务器管理应用程序的升级版本,您也可以做到。在这种情况下,您只需从 Package.appxmanifest 文件维护您的版本,并使用您自己的代码进行部署。我在上面描述了一种方法。如果您有任何要分享的,请告诉我。我将非常乐意对此进行一些研发。

© . All rights reserved.