一位客户正在将虚拟 Windows 工作站 (VDI) 从 Windows 7 升级到 Windows 10 x64。他们正在使用一个较旧的应用程序,即带有 Web 客户端的工作流产品,它在 Internet Explorer 中运行,并且仍然使用“Microsoft 数据和时间选择器控件 6.0 (SP6)”(32 位 ActiveX 控件)。
mscomct2.ocx 已被复制到 C:\Windows\SysWOW64 目录并使用“regsvr32 mscomct2.ocx”注册。
问题是,此控件不会在新 Windows 10 x64 映像上的 Internet Explorer(x86)中显示自己;事实上,该控件显示一个占位符并且被阻止(IE 处于兼容性视图中)。
工具/管理加载项确实在列表中显示了控件名称。双击该项目会显示“更多信息”,其中显示“阻止计数”为 17,而“使用计数”为 0。
好的,控制不知怎么被阻止了。有关测试设置的更多详细信息,请参阅下文。
现在,我听到你在想,为什么不用 HTML 原生控件替换该控件呢?好吧,替换控件需要重新发布工作流模板并更改所有工作流实例……
好的,在客户 Windows 10 映像的 VM 副本中,这是尝试显示选择器控件的网页。
<html>
<head>
<title>DTPicker_Test</title>
</head>
<body bgcolor="#FFFFFF">
function DocWrite(strHTML)
{
document.write(strHTML);
}
</script>
<b>clsid:20DD1B9E-87C4-11D1-8BE3-0000F8754DA1</b>
<script language="javascript">
DocWrite("<object classid=\"clsid:20DD1B9E-87C4-11D1-8BE3-0000F8754DA1\" name=\"DTPicker\" ID=\"DTPicker\" tabindex=\"1\" accesskey=\"\" mayscript=\"true\" onload=\"DTPicker_InitProps()\" style=\" position:absolute; left:10; top:100; width:300; height:100; z-index:0; color:#000000; font-family:Arial; font-style:normal; font-weight:bold; font-size:10pt; \"> <param name=\"MousePointer\" value=\"0\"> <param name=\"Enabled\" value=\"1\"> <param name=\"OLEDropMode\" value=\"0\"> <param name=\"CalendarBackColor\" value=\"-2147483643\"> <param name=\"CalendarForeColor\" value=\"-2147483630\"> <param name=\"CalendarTitleBackColor\" value=\"-2147483633\"> <param name=\"CalendarTitleForeColor\" value=\"-2147483630\"> <param name=\"CalendarTrailingForeColor\" value=\"-2147483631\"> <param name=\"CheckBox\" value=\"0\"> <param name=\"CustomFormat\" value=\"\"> <param name=\"Format\" value=\"1\"> <param name=\"UpDown\" value=\"0\"> <param name=\"MaxDate\" value=\"2958465\"> <param name=\"MinDate\" value=\"41640\"></object>");
</script>
<script language="javascript">
function DTPicker_InitProps()
{
alert("init");
}
</script>
</body>
</html>
在我自己的 Windows 10 x64 笔记本电脑上,当我将 OCX 复制到 C:\Windows\SysWOW64,注册它并在 Internet Explorer 中打开完全相同的页面时,该控件确实会显示出来。
现在,为什么客户的 Windows 10 映像中的 Internet Explorer 会阻止此控件?页面区域为 Internet;在区域的自定义安全级别中,我已将所有“ActiveX 控件和插件”相关项目更改为:
- 如果该项目有“启用”和“禁用”选项,那么我设置“启用”
- 如果该项目有“启用”、“禁用”和“提示”,那么我设置“提示”
- “允许 ActiveX 筛选”设置为“禁用”
- “在 ActiveX 控件上运行反恶意软件”设置为“禁用”
当我在 Internet Explorer 中加载该页面时,系统询问“是否允许运行 ActiveX 控件和插件等软件?”,我回答是。但控件仍然没有显示出来。控件已被阻止。
- 我遇到了几个类似的问题和答案,但没有一个能解决阻塞问题。例如如何阻止 Internet Explorer 阻止本地文件上的 ActiveX 控件
- 我比较了我的 Windows 10 笔记本电脑和 Windows 10 映像之间的 IE 设置和策略,但无济于事。
有人知道在 Win10 图像上要检查什么或有解决方案吗?
同事Tim: 我正在与我尊敬的同事 Victor 一起研究这个问题。还有一个额外的重要发现是,这个特定的 ActiveX 控件“mscomct2.ocx”在 MS Office 365 (x86) 中运行良好(可以通过“开发人员选项卡”-->“控件”部分 -->“ActiveX 控件”-->“更多控件”-->“Microsoft 数据和时间选择器控件 6.0 (SP6)”启动),而 IE x86 阻止了该控件。很奇怪吧?
我们还为 IE 中的 ActiveX 组件启用了 VersionAuditLog,但它说它没有阻止该控件。
感谢您对如何进一步解决问题的任何建议,因为我们在这里陷入了困境。
编辑 添加了同事 Tim 的贡献。
答案1
我来回答我自己的问题。在与一位非常专注的阴谋家合作并进行了大量排除后,我们找到了罪魁祸首:ActiveX 许可注册表项
看起来下一个注册表项启用了 Internet Explorer 中的日期和时间选择器:
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\4F86BADF-9F77-11d1-B1B7-0000F8753F5D] ""="iplpwpnippopupiivjrioppisjsjlpiiokuj"
我们是如何找到它的?我之前注意到,当我安装带有一些工作负载(“ASP.Net 和 Web 开发”)的 Visual Studio 2019 社区版时,控件开始工作。当我删除它时,它停止工作。在选择和取消选择单个 VS 组件进行安装的大量尝试和失败之后,Nuget 包管理器似乎起了作用。删除已安装的 DLL 不起作用;删除新安装的注册表项起作用了。
供参考:更多Microsoft Common Controls ActiveX许可证注册表项: https://github.com/yangshengcheng/bhm/blob/master/policy/msgforward/vb6controls.reg