App Layering

调试层完整性消息

当您关闭打包机并运行关 闭以完成时,它会调用 uniservice.exe 获取当前层完整性状态。关闭 Fininalize 正在检查是否有任何必需的流程仍处于 待决状态。如果所需的进程没有关闭,它会给您一条有关待处理问题的消息。App Layering 将此信息写入以下日志文件:

C:\Program Files\Unidesk\Uniservice\Log\LayerIntegrity.txt C:\Program Files\Unidesk\Uniservice\Log\UniBilcLogs_X.txt

您无法确切知道它使用的是哪个 UniBilcLogs 文件,因此请查找带有最新时间戳的文件。搜索“诚信”。

您可能认为您可以通过关闭计算机并最终完成计算机来绕过层完整性检查。但是,如果您尝试,App Layering 设备将停止该任务并返回到打包计算机。关闭以完成脚本必须完成图层定版过程。

层完整性警告

以下层完整性消息告诉您在层准备完成之前必须完成哪些排队操作:

  • “RunCnce 脚本尚未完成-请检查并重新启动打包机。“
  • “安装后重新启动正在等待-请检查并重新启动打包机。“
  • “Microsoft ngen 操作正在后台进行中。“
  • “MSI 安装操作正在进行中-请检查包装机。“
  • “正在等待重新启动以更新引导盘上的驱动程序-请检查并重新启动打包计算机。“
  • “需要 Microsoft ngen 操作。“
  • “软件中心客户端配置为运行,但 SMSCFG.INI 仍然存在。“

不能通过关闭计算机来绕过层完整性消息。App Layering 软件将停止并返回到打包计算机,直到所有流程完成为止。

如果 Microsoft NGen 操作正在进行中,你可以尝试加快操作,如下一节所述。

“一个运行一次脚本是优秀的”

创建层或向其添加版本时,可以指定脚本,以便在用户在桌面启动(或重新启动)后首次登录时运行。例如,您可以使用“运行一次”脚本来完成应用程序的设置。 运行一次脚本是安装在图层上的 .cmd.bat 文件。

在映像上运行一次运行脚本后,Windows 通常会在重新启动时删除关联的注册表项。此消息告诉您 Windows 没有从以下位置之一删除“运行一次”脚本的密钥:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce

要解决此问题:

  • 如果脚本文件不再存在,请删除注册表项。
  • 如果消息中引用的脚本存在,请手动运行该脚本,然后删除注册表项。

“安装后重新启动正在挂起”

此消息源于以下任何注册表项:

  • HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired
  • HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\NETLOGON\Start
  • HKLM\SYSTEM\CURRENTCONTROLSET\CONTROL\COMPUTERNAME\ACTIVECOMPUTERNAME
  • HKLM\SYSTEM\CURRENTCONTROLSET\CONTROL\COMPUTERNAME\COMPUTERNAME
  1. 如果您看到这些条目之一,请先重新启动。如有必要,重新启动多次,直到您确定该消息不是某些软件的真正重新启动请求。

  2. 如果 Net Loon 出现问题,请重新启动 Unidesk Service for Message Management

  3. 检查上一个列表中的前三个注册表项之一是否存在:

    • HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
    • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending
    • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired
  4. 手动修改这些密钥中的任何一个以满足您的需求。如果您不需要密钥,可以删除它们。

  5. 查看 NetLogon 密钥中的更改,看看是否:

    • 该值与启动时的值不同。
    • 计算机名称与活动计算机名称不同。

    如果存在差异,请修复该设置。

  6. 确定域加入操作是否仍在等待重新启动。

    • HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\NETLOGON\Start
    • HKLM\SYSTEM\CURRENTCONTROLSET\CONTROL\COMPUTERNAME\ACTIVECOMPUTERNAME
    • HKLM\SYSTEM\CURRENTCONTROLSET\CONTROL\COMPUTERNAME\COMPUTERNAME

    您无法修改这三个注册表项,但是某些软件可以在每次重新启动时修改 NETLOGON\Start 密钥。

清除步骤 #1 中列出的前三个键后,您仍会收到重新启动时的提示,您可以选择忽略层完整性检查。但是,这是最后的手段,通常不建议使用。有关如何忽略层完整性检查的详细信息,请参阅本文末尾的“最后手段”部分。

“Microsoft ngen 操作正在后台进行中”

此消息告诉您,前台或后台 NGEN 操作仍在进行中。NGEN 操作是将 .Net 程序集编译成本机映像的地方。该消息表示该过程仍在进行中。你可以观看进度。

警告:

不要重新启动,因为这会导致进程重新启动。

要在前台观看进度,请运行 ngen eqi 3。或者,请定期等待并运行 ngen queue status 以查看该过程的进展情况。请记住,运行 ngen queue status 会减慢后台进程的速度,因为每次在前台检查其状态时,后台进程都会暂停。

NGEN 流程完成非常重要。耐心等待如果您终止进程或在中间重新启动,最终可能会出现部分写入的 .Net 程序集。

如果后台进程(例如 MSCORSVW.EXENET 运行时 优化服务)未在一天内完成,请检查过时的后台进程。重新启动可能会有所帮助。

以下服务运行完毕后,您可以继续:

  • ngen.exe
  • ngentask.exe
  • mscorsvw.exe

“MSI 安装操作正在进行中”

此消息指出存在名为 Global\_MSIExecute 的系统互斥对象(互斥对象)。MSI 安装程序使用 Global\_MSIExecute 确保一次只运行一个安装程序。如果您确定没有进行 MSI 安装,则资源可能存在锁定。回到层,并找出哪个进程被锁定。

“重新启动挂起以更新启动磁盘上的驱动程序”

此消息告诉您修改或安装了设置为在系统启动时启动的服务或驱动程序。修改后的驱动程序能够成功启动非常重要。

通常你需要重新启动一次,驱动程序工作正常。我们在某些情况下看到软件(如 Microsoft Defender 或 McAfee)试图在每次启动时修改其驱动程序文件,每次都会触发此完整性检查。没有重新启动清除它。您可能需要使用绕过层完整性检查的选项,如下面的“最后手段”部分所述。

“需要执行 Microsoft NGen 操作”

此消息告诉您打包机上安装了应用程序,并且它计划以 3的优先级更新项目。

在此优先级级别,操作仅在 CPU 处于空闲状态时运行,并且正在等待,直到没有其他活动。

为确保应用程序以最佳方式在已发布的映像上运行,App Layering 会阻止定版过程,因为 NGEN 过程需要在打包机上运行,而不是在部署应用程序的每台计算机上运行。

使用 NGEN eqi 3 (优先级 3),您可以:

  • 在以下两个目录中运行未完成的操作:

    • c:\windows\microsoft.net\framework\vYY.MM.Build
    • c:\windows\microsoft.net\framework64\v4.0.30319
  • 等等NGEN 操作通常在闲置 15 分钟后自行运行。

正在检查的值包括:

  • HKLM\SOFTWARE\Microsoft\.NETFramework\v2.0.50727\NGenService\Roots\WorkPending
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727\NGenService\Roots\WorkPending

值为 1 表示有待处理的工作项排队。

“软件中心客户端配置为运行,但 SMSCFG.INI 仍然存在…“

此消息告诉您,此计算机已将 ccmexec.exe 配置为服务,并且未将其配置为禁用

由于我们知道在包装机上创建的任何层都需要正确密封才能在 VDI 环境中正确部署,因此我们正在进行检查以确保 SMSCFG.ini 不存在。有一个命令文件可供您在层的最后运行。我们提供了在批处理命令文件中运行的命令,您可以使用这些命令来密封层。以管理员身份登录到命令窗口以运行以下脚本:

c:\windows\setup\scripts\SEALSCCMCLIENT.cmd

加快 Microsoft NGen 操作

NGEN 可执行文件是微软本机映像生成器。它是 .NET 系统的一部分。 Ngen.NET 字节码重新编译为本机映像并构造注册表项。Windows NGEN 根据正在安装的内容以及 Windows 在配置中检测到的内容来确定何时运行。运行 NGEN 时, 始终 让它完成。中断的 NGEN 操作可能会导致 .NET 组件无法正常运行或 .NET 系统中出现其他问题。

您可以选择等待 NGEN 流程在后台完成,或者强制到前台。您还可以按照以下步骤中的说明检查 NGEN 操作的状态。但是,每次检查队列状态时,都会创建前台活动,这可能会导致后台处理暂时暂停。

NGEN 流程放到前台允许您查看进度。完成此过程后,您可以最终确定层。

  1. NGEN 操作带到前台。通常情况下, NGEN 是后台操作,如果存在前台活动,则会暂停。将任务置于前台可以帮助任务尽快完成。为此,您需要:
    1. 以管理员身份打开命令提示符。
    2. 转到当前正在使用的版本的 Microsoft .NET Framework 目录:

      cd C:\Windows\Microsoft.NET\FrameworkNN\vX.X.XXXXX

    3. 输入 NGEN 命令以执行排队项目: ngen eqi 3 <!--NeedCopy-->
    4. 这会在命令提示符下将 NGEN 任务置于前台,并列出正在编译的程序集。

      注意:

      如果您收到多条 “编译失败” 消息,请在任务管理器中查看 MSCORSVW.EXE 是否正在运行的实例。如果是,请允许它完成或重新运行 NGEN eqi 3不要重新启动以停止任务。任务必须完成。

  2. 检查 NGEN 操作状态
    1. 以管理员身份打开命令提示符。
    2. 通过运行以下命令检查状态: NGEN queue status
    3. 当您收到以下状态时,表示 NGEN 已完成,您可以完成图层。.NET Runtime Optimization Service 已停止,

处理层完整性问题的最后手段(不推荐)

如果您的层根本无法完成,则可以使用注册表项告诉该层忽略其层完整性检查。

警告: 只能将此钥匙用作最后的手段!在这些情况下,App Layering 会阻止您最终完成。允许您最终确定层会对层和包含该层的图像造成不可弥补的损害。始终尝试首先在 Windows 中解决问题!

要忽略层上的层完整性消息(不推荐),请执行以下操作:

  1. 运行 regedit.exe 并创建此密钥:

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Uniservice: "BypassLayerCheck"=DWORD 1<!--NeedCopy-->

    这个价值并不重要。重要的是价值存在。此步骤将阻止对层进行层完整性检查。它允许对层进行最终定版,无论其对层和包含层的分层图像造成何种损害。