App Layering

调试层完整性消息

当您关闭打包机并运行 Shutdown for Finalize 时,它会调用 uniservice.exe 来获取当前层完整性状态。Shutdown for Finalize 正在检查是否有任何必需的进程仍在挂起。如果必需的进程未关闭,它会向您显示有关挂起问题的消息。App Layering 会将此信息写入以下日志文件:

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

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

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

层完整性警告

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

  • “RunOnce 脚本未完成 - 请检查并重新启动打包机。”
  • “安装后重新启动挂起 - 请检查并重新启动打包机。”
  • “Microsoft ngen 操作正在后台进行。”
  • “MSI 安装操作正在进行中 - 请检查打包机。”
  • “重新启动挂起以更新启动磁盘上的驱动程序 - 请检查并重新启动打包机。”
  • “需要执行 Microsoft ngen 操作。”
  • “Software Center Client 已配置为运行,但 SMSCFG.INI 仍然存在。”

您无法通过关闭计算机来绕越层完整性消息。App Layering 软件将停止并让您返回到打包机,直到所有进程完成。

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

“RunOnce 脚本未完成”

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

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

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 Logon 上,请重新启动 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.EXE(.NET 运行时 Optimization Service))未在一天内完成,请检查是否存在陈旧的后台进程。重新启动可能会有所帮助。

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

  • 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 表示有工作项排队等待处理。

“Software Center Client 已配置为运行,但 SMSCFG.INI 仍然存在…”

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

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

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

加快 Microsoft NGen 操作

NGEN 可执行文件是 Microsoft Native Image Generator。它是 .NET 系统的一部分。Ngen 将 .NET 字节码重新编译为本机映像并构建注册表项。Windows 根据正在安装的内容以及 Windows 在配置中检测到的内容来确定何时运行 NGEN。当 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-->

    该值无关紧要。重要的是该值存在。此步骤会阻止层上的层完整性检查。它允许层最终化,无论可能对层以及包含该层的分层映像造成何种损害。