Ian*_*oyd 6 webbrowser-control iwebbrowser2 twebbrowser
我有一个嵌入的本地Windows应用程序WebBrowser,即
CLSID_WebBrowser8856F961-340A-11D0-A96B-00C04FD705A2Shell.Explorer.2不幸的是,当在Windows Server上运行时,Internet Explorer增强的安全模式会干扰WebBrowser控件,从而使其根本无法呈现:
在这种情况下,软件的UI作为WebBrowser控件驱动-使该软件不可用。
我可以禁用Internet Explorer增强安全模式,但这不切实际。
我如何指示Internet Explorer浏览器允许在没有安全对话框的情况下渲染嵌入式浏览器?
注意:我建议添加about:security_Application.exe到“ 受信任的区域”列表中”
可悲的是,这将需要DRP / FRP验证,ISO安全评估,并且必须召集安全组进行更改。此外,将需要创建RFC,以便毕马威(KPMG)不会进行下次审核。我希望获得“好的”解决方案。
您可以指定不同的 URL。例如,您可以将内容提取到临时文件并导航到它。这不会将您的内容放入受信任区域,但它比您通过 about 协议获得的互联网区域更好。
如果您不想保存内容,可以首先导航到 about:blank,然后在DocumentComplete中,QI 文档 for IPersistMoniker,并使用基本上模拟 url 名称的 TInterfacedObject 调用 Load。
IMoniker.GetDisplayName需要返回 URL。该 URL 需要位于受信任区域中。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;
Run Code Online (Sandbox Code Playgroud)
此方法检查 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;
Run Code Online (Sandbox Code Playgroud)
所有其他方法都必须返回INET_E_DEFAULT_ACTION(即不是S_OK 也不是 E_NOTIMPL),例如:
function TEmbeddedSecurityManager.SetSecuritySite(Site: IInternetSecurityMgrSite): HResult;
begin
Result := INET_E_DEFAULT_ACTION;
end;
Run Code Online (Sandbox Code Playgroud)
当嵌入式 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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2248 次 |
| 最近记录: |