App-V 虚拟化应用程序的奇怪行为 - 无法启动新实例,直到所有其他实例都关闭

App-V 虚拟化应用程序的奇怪行为 - 无法启动新实例,直到所有其他实例都关闭

首先我必须为这个模糊的说法道歉。这很难确定,这就是我发布这篇文章的原因。

环境是 Windows 2012 R2 Citrix 7.16 服务器,多租户(这是使用 App-V 的原因)。

首先介绍一下该应用程序的一些内容。

  • 该应用程序在最新的 App-V 5.1 中排序。
  • 该应用程序在排序期间在网络共享上注册一个 exe 文件。
  • 应用程序客户端部分主要包括注册此文件。客户端上没有本地文件。
  • 共享为读取/执行(共享和 NTFS 权限)
  • 大约 6 个月前,该应用程序运行良好。之后,所有新软件包都出现了这种行为。
  • 当应用程序未在 App-V 中虚拟化时,不会发生这种情况。

关于它的具体表现,请看下文:

  • 错误总是在正常工作时间之后发生,大多是在几个小时之后。(我们的工作理论是,也许是用户注销/空闲会话自动注销或会话重新连接期间的某些事情触发了此问题。)

  • 该错误本质上是用户无法启动应用程序。什么都没有发生。

  • 很容易发现此错误,因为在任务管理器中所有受影响的应用程序实例都没有图标。例如,任务管理器无法访问/读出资源,但是我们已经测试了访问权限,文件和共享“可以正常使用”。

  • 如果我们随后终止该应用程序的所有实例,那么用户就可以重新启动该应用程序。

  • 可能相关的是,包中还有其他可以运行的应用程序。因此虚拟环境并未对所有用户关闭,并且包一直处于“使用中”状态。

  • 这篇 Technet 文章可能相关 - 这可能与缓存文件的共享资源有关。但非常重要:当应用程序未在 App-V 中虚拟化时,不会发生这种情况。

我们将尝试关闭所有因该问题而处于空闲/断开连接状态的不同租户的会话,看看是否有帮助,但这仍然不是一个很好的解决方案。

除此之外,我只是希望某个地方的某个人经历过类似的事情并找到了根本原因,或者某个更聪明、更了解这里使用的核心技术的人也许可以理解正在发生的事情,或者给我一些关于我们下一步可以尝试的想法。

我们今天在 appv 事件日志中发现了一些错误消息(错误 0x7A602510-0xF),这导致这条死胡同

昨天尝试过主动注销用户以消除会话重新连接的问题。没有成功。只有两个用户登录并处于活动状态,第三个用户触发了错误,没有重新连接,也没有其他断开连接/空闲的会话。

这个 ars 线程似乎是我迄今为止见过的最活跃、最相关的线程(感谢@TrententTye!)。将尝试以几种不同的方式访问应用程序文件,FQDN、IP、映射驱动器。用户 kttii 还写道,Win2016 可能已经为他们解决了这个问题。最后提到了 2017 年 5 月的一些 WannaCry 补丁,这实际上与我们开始收到错误的时间非常吻合。

非常感谢所有转发和贡献的人推特! 你们太棒了。

编辑:发现错误消息和技术网络死胡同。

编辑2:@TrententTye贡献这个 ars 线程看起来是同一个问题。从 2010/Win2003 到 2017/Win2012!

答案1

我自己回答了这个问题,因为我们发现了这个错误并且我找到了解决办法。

这就是错误,我们现在知道:https://support.microsoft.com/en-us/help/2536487/applications-crash-or-become-unresponsive-if-another-user-logs-off-ar 当不使用 App-V 时,它也出现过几次,但 98% 的时间都是在应用程序虚拟化时出现。

这是解决方法:

1 在出现错误的 RDS/Xenapp 服务器上创建一个计划任务。将其设置为在启动时或之后不久启动。它必须在任何用户启动应用程序之前启动。这是计划任务:

应用:PowerShell.exe

参数:-command "& 'C:\Program Files (x86)\Script\ReadLockFilesInFolder.ps1' '\\server\folder\'"

2 将其保存为 PowerShell 脚本:

$AllOfTheFiles = Get-childitem -Path $args[0] -File | Select-Object -ExpandProperty FullName

$fileLocks = @()

foreach ($afile in $AllOfTheFiles) {
    $fileLocks+=[System.io.File]::Open("$afile",'Open','Read','Read')
}

Start-Sleep -s 86400

该脚本通过非独占方式打开文件来工作,并保存神奇的第一个句柄,从而阻止它被释放。

笔记:

脚本会在 24 小时后释放句柄。脚本仅锁定第一个文件夹中的文件。在 Get-Childitem 后面添加“-recurse”以递归遍历所有文件夹。

这对我们来说效果很好。我还可以确认,正如 KB 所述,它不会在 Server 2016 上发生。希望这能有所帮助

相关内容