3

我们正在使用 XenApp:7.6。我们有一个 .NET 完整框架 4.8 WinForms 应用程序作为 Citrix Receiver 中的已发布应用程序。此已发布应用程序托管在 Windows Server 2008 R2 SP1(64 位)计算机上。我们的应用程序使用 Microsoft.Web.WebView2 (1.0.824-prerelease) Web 浏览器 Winforms 控件在我们的应用程序中提供嵌入式 Web 浏览器。

当在用于交付已发布应用程序的同一 Windows Server 2008 R2 SP1 服务器上作为常规桌面应用程序运行时,我们的应用程序可以正常工作。在 Windows 10 和 Windows Server 2012 上作为常规桌面应用程序运行时,我们的应用程序也可以正常运行。

当我们通过 Citrix Receiver 将我们的应用程序作为已发布的应用程序启动时,当 Microsoft.Web.WebView2 Winforms 控件尝试创建 webview2 环境时,我们会在运行时看到 REGDB_E_CLASSNOTREG 错误。您可以在下面看到运行时异常...

System.Runtime.InteropServices.COMException (0x80040154): Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode)
at Microsoft.Web.WebView2.Core.CoreWebView2Environment.d__28.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Web.WebView2.WinForms.WebView2.d__14.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
The same application works without any issues when launched via the same Citrix Receiver portal using a Citrix published desktop and not a Citrix published application. 

在启动已发布的应用程序时在服务器上使用 ProcMon 我可以看到我们的应用程序最终调用了 C:\Program Files (x86)\Microsoft\EdgeWebView\Application\89.0.774.54\EBWebView\x64\EmbeddedBrowserWebView.dll 我相信那时启动 msedgewebview2.exe 进程。我们可以看到 msedgewebview2.exe 可执行文件正在为已发布的应用程序成功启动。下面显示了传递给 msedgewebview2.exe 的命令参数...

C:\Program Files (x86)\Microsoft\EdgeWebView\Application\89.0.774.54\msedgewebview2.exe" --embedded-browser-webview=1 --user-data-dir="C:\Users\Admin\AppData\Roaming\OurAppName\EBWebView" --no-default-browser-check --disable-component-extensions-with-background-pages --no-first-run --disable-default-apps --noerrdialogs --embedded-browser-webview-dpi-awareness=0 --disable-features=msEdgeOnRampFRE,msEdgeOnRampImport,msEdgeMGPFrev1,msEdgeSettingsImport,msEdgeSettingsImportV2,msReadAloud,msSyncEdgeCollections,msApplicationGuard,msEdgeTranslate,msEdgeReadingView,WebPayments,msSendClientDataHeader,msSendClientDataHeaderToEdgeServices,msImplicitSignin,SpareRendererForSitePerProcess --disable-popup-blocking --enable-features=ForwardMemoryPressureEventsToGpuProcess --internet-explorer-integration=none --js-flags="--harmony-weak-refs-with-cleanup-some --expose-gc" --winhttp-proxy-resolver --mojo-named-platform-channel-pipe=26740.36688.8089883041949745853

我尝试过的事情

  • 我使用 ProcMon 来识别在将我们的应用程序作为已发布的 Citrix 应用程序启动时加载的所有 CLSID,并验证所有 32 位和 64 位 CLSID 都存在。我还尝试在 System32 和 SysWOW64 文件夹中使用 RegSvr32 重新注册一些 DLL
  • 我使用 ProcMon 来识别正在加载的所有依赖项并验证这些依赖项是否存在。我结合使用 ProcMon 和依赖遍历器来验证所有 DLL 是否存在。
  • 我已经通过“dcomcnfg”和“mmc comexp.msc /32”验证了所有 COM 权限都是正确的
  • 在这里尝试了所有步骤https://support.microsoft.com/en-us/topic/-access-denied-errors-and-applications-with-com-activation-fail-after-installing-july-2018-security-and -quality-rollup-updates-for-net-framework-fd3d7a3f-ca2f-6e87-c409-a5652175cf40(Diasymreader.dll CLASSNOTREG)
  • 尝试安装多个 Windows 更新,包括 2018 年 8 月安全和质量汇总 - 运行已发​​布应用程序的 Windows Server 2008 R2 SP1(64 位)操作系统似乎是最新的。
  • 在端点/客户端机器上尝试了不同的屏幕分辨率、颜色深度
  • 尝试在服务器上为我们的可执行文件设置各种兼容模式,禁用高 DPI,直接合成等
  • 在禁用调试标志的情况下尝试了 x64 和 x86 版本构建 - 没有 PDB
  • 添加了检查以确保我们的应用程序在提升的管理员上下文中运行
  • 在 app.config 配置/启动元素中尝试 useLegacyV2RuntimeActivationPolicy="true"
  • app.config 元素中尝试的 runtime/loadFromRemoteSources 元素
  • 确保应用程序。清单存在以与 UAC 一起正常工作
  • 检查服务器上的本地安全策略(我看不到任何明显的问题)
  • 尝试嵌入式 WebView2 运行时(x64 和 x86)
  • 尝试从https://developer.microsoft.com/en-us/microsoft-edge/webview2/安装和下载专用 WebView2 运行时(x86 和 x64 版本)
  • 在运行已发布应用程序的服务器上安装了最新版本的 Edge
  • 将 msedge.exe、msedgewebview2.exe、msedgewebview2 添加到以下每个注册表项以禁用 Citrix 挂钩...
    • HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\CtxHook\ExcludedImageNames
    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\CtxHook64\ExcludedImageNames
    • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\CtxUvi\UviProcessExcludes

主要区别

当通过 Citrix Receiver 门户将我们的应用程序作为已发布的应用程序启动时,与常规桌面应用程序不同,我们通过 ProcMon 看到了以下主要区别...

  • 我们看到对注册表的调用以定位以下 CLSID(通过常规桌面应用程序启动时我们看不到这些调用)......
    • 60A417CA-F1AB-4307-801B-F96003F8938B - 主机对象助手
    • 9BA05972-F6A8-11CF-A442-00A0C90A8F39 - 外壳文件夹查看路由器
    • 0A29FF9E-7F9C-4437-8B11-F424491E3931 - NDP SymBinder CorSymBinder_SxS / 基于直径的 SymReader (diasymreader.dl / mscoree.dll)l
    • FAE3D380-FEA4-4623-8C75-C6B61110B681\Instance - WindowsCodecs.dll
      • 0E25DC18-9F5E-48B1-80B3-D124E81B773B ColourTransformer (%SystemRoot%\system32\windowscodecsext.dll)
      • 05AF94D8-7174-4CD2-BE4A-4124B80EE4B8
      • 7835EAE8-BF14-49D1-93CE-533A407B2248
      • 7ED96837-96F0-4812-B211-F13C24117ED3
      • ABE3B9A4-257D-4B97-BD1A-294AF496222E
      • AC757296-3522-4E11-9862-C17BE5A1767E
  • 我已验证上述 CLSID 中引用的 DLL 存在于 System32 和 SysWOW64 中
  • 我们看到 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\diasymreader.dll 中的 PDB 符号读取器正在加载。
  • 在访问任何文件之前,我们会在 HKU.Default\Software\Citrix\SessionSfr\10 处看到对注册表的调用
  • 我们的应用程序在端点上的 WFICA32.EXE 进程下运行,该进程是一个 32 位进程。我们看到我们的应用程序在服务器上作为一个常规的 64 位进程在属于本地管理员组的域用户下运行。

笔记

  • 虽然我们拥有完全的管理员权限,并且我们的 Winforms 应用程序在本地管理员的上下文中运行,但托管已发布应用程序的 Windows Server 2008 R2 SP1 服务器位于域上,并且应用了各种组策略。
  • Windows 防火墙在托管已发布应用程序的 Windows Server 2008 R2 SP1 服务器上完全禁用

在这个阶段,我不确定下一步该尝试什么。我真诚地欢迎社区内的 Citrix 专家提出任何建议。

提前感谢您提供的任何建议或帮助。

目前最好的祝愿,

瑞安

4

0 回答 0