6

我有一个嵌入的本地 Windows 应用程序WebBrowser,即

  • CLSID_WebBrowser
  • 8856F961-340A-11D0-A96B-00C04FD705A2
  • Shell.Explorer.2

不幸的是,在 Windows 服务器上运行时,Internet Explorer 增强安全模式会干扰WebBrowser控件,导致它根本无法呈现:

在此处输入图像描述

在这种情况下,软件的 UI 被驱动为WebBrowser控件 - 使软件无法使用。

我可以禁用Internet Explorer 增强安全模式,但这不切实际。

如何指示 Internet Explorer 浏览器允许嵌入式浏览器在没有安全对话框的情况下呈现?

注意:我会建议添加about:security_Application.exe受信任区域列表”

在此处输入图像描述

遗憾的是,这将需要 DRP/FRP 验证、ISO 安全评估,并且必须调用安全组来进行更改。此外,还需要创建一个 RFC,这样 KPMG 就不会进行 hissy-fit 下一次审计。我希望有一个“好”的解决方案。

也可以看看

4

2 回答 2

1

您可以指定不同的 URL。例如,您可以将内容提取到临时文件并导航到它。这不会将您的内容放入受信任区域,但它比您为 about 协议获得的 Internet 区域要好。

如果您不想保存内容,可以先导航到 about:blank,然后在DocumentComplete中 QI 文档 for IPersistMoniker,然后使用基本上模拟 url 名字对象的 TInterfacedObject 调用 Load。

  1. IMoniker.GetDisplayName实现需要返回 URL 。url 需要位于受信任的区域中。
  2. IMoniker.BindToStorage当询问 IStream 时,实现需要发回对 TMemoryStream 的引用。

还有第三种方法,编写一个进程范围的安全管理器,将您的 url 放在受信任的区域中。


解决方案是实现您自己的 Internet 安全管理器服务,创建一个实现的对象IInternetSecurityManager(请参阅MSDN:实现自定义安全管理器)。有五个安全区域:

  • 本地:URLZONE_LOCAL_MACHINE(0)
  • 内网:URLZONE_INTRANET(1)
  • 受信任:URLZONE_TRUSTED(2)
  • 互联网:URLZONE_INTERNET(3)
  • 受限:URLZONE_UNTRUSTED(4)

您真正需要担心的唯一方法是MapUrlToZone

TEmbeddedSecurityManager = class(TInterfacedObject, IInternetSecurityManager)
public
   //...
   function MapUrlToZone(pwszUrl: LPCWSTR; out dwZone: DWORD; dwFlags: DWORD): HResult; virtual; stdcall;
   //...
end;

此方法检查 Url 是否以about:security

关于:security_Contoso.exe

如果是,则返回该区域应为Local

function TEmbeddedSecurityManager.MapUrlToZone(pwszUrl: LPCWSTR; out dwZone: DWORD; dwFlags: DWORD): HResult;
var
    url: UnicodeString;
begin
    Result := INET_E_DEFAULT_ACTION;

    {
        https://msdn.microsoft.com/en-us/library/ms537133(v=vs.85).aspx
    }
    url := pwszUrl;
    {
        When IE Enchanced Security is enabled, the url goes from 
            about:blank_xxxx
        to 
            about:security_xxxx

        In that case we will put the page in the "Local" zone
    }
    if url.StartsWith('about:security') then
    begin
        dwZone := URLZONE_LOCAL_MACHINE; //Local
        Result := S_OK;
    end;
end;

所有其他方法都必须返回INET_E_DEFAULT_ACTION(即不是S_OK 也不是 E_NOTIMPL),例如:

function TEmbeddedSecurityManager.SetSecuritySite(Site: IInternetSecurityMgrSite): HResult;
begin
    Result := INET_E_DEFAULT_ACTION;
end;

当嵌入式 WebBrowser 调用 IServiceProvider.QueryService 时,您会为它提供此服务。以Delphi的TEmbeddedWB控件为例,在OnQueryService事件中暴露:

function TForm1.EmbeddedWBQueryService(const rsid, iid: TGUID; out Obj: IInterface): HRESULT;
var
    sam: IInternetSecurityManager;
begin
    Result := E_NOINTERFACE;

    //rsid ==> Service Identifier
    //iid ==> Interface identifier
    if IsEqualGUID(rsid, IInternetSecurityManager) and IsEqualGUID(iid, IInternetSecurityManager) then
    begin
        sam := TEmbeddedSecurityManager.Create;
        Obj := sam;
        Result := S_OK;
    end;
end;
于 2012-12-22T00:09:43.820 回答
0

也许您可以考虑加载不同的嵌入式浏览器。有:

于 2012-12-21T22:49:19.487 回答