【发布时间】:2021-10-09 18:56:30
【问题描述】:
我在 C# WPF 应用程序中使用 WebBrowser 控件。我需要以编程方式执行粘贴命令,我使用以下语句执行此操作:
WebBrowser.Document.ExecCommand("paste", false, null);
这在我的本地机器上完美运行;但是,它在我们的生产环境中不起作用。该命令根本不执行任何操作。幸运的是,我已根据this post 确定此问题的原因是 IE 安全限制。
解决方法是将 IE 中的安全级别修改为中等(工具 > Internet 选项 > 安全 > Internet > 中等级别)。
按照该帖子的答案,可以解决问题。但是,在我们的生产环境中,IE 的安全设置设置为高,并且由于安全策略的原因无法修改。因此无法使用此修复程序。
我看到另一个 post 关于添加自定义安全管理器,这听起来像是解决此问题的可能方法。
但是,我无法准确确定需要实现哪些 IInternetSecurityManager 方法或如何实现它们。我已经定义了接口并获得了要调用的方法,但我目前只是为所有这些方法返回 INET_E_DEFAULT_ACTION。
public class MyWebBrowser : WebBrowser
{
protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
{
return new ExtendedWebBrowserSite(this);
}
protected class ExtendedWebBrowserSite : WebBrowserSite, IInternetSecurityManager, IServiceProvider
{
private static readonly Guid SID_IInternetSecurityManager = new Guid("79EAC9EE-BAF9-11CE-8C82-00AA004BA90B");
WebBrowser _host;
public ExtendedWebBrowserSite(WebBrowser host) : base(host)
{
_host = host;
}
public int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject)
{
if (guidService == SID_IInternetSecurityManager && riid == SID_IInternetSecurityManager)
{
ppvObject = Marshal.GetComInterfaceForObject(this, typeof(IInternetSecurityManager));
return HRESULTS.S_OK;
}
ppvObject = IntPtr.Zero;
return HRESULTS.E_NOINTERFACE;
}
#region IInternetSecurityManager Implementation
public int SetSecuritySite([In] IntPtr pSite)
{
return URLMonikerErrorCodes.INET_E_DEFAULT_ACTION;
}
public int GetSecuritySite([Out] IntPtr pSite)
{
return URLMonikerErrorCodes.INET_E_DEFAULT_ACTION;
}
public int MapUrlToZone([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, out uint pdwZone, uint dwFlags)
{
pdwZone = 0;
return URLMonikerErrorCodes.INET_E_DEFAULT_ACTION;
}
public int GetSecurityId([MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, [MarshalAs(UnmanagedType.LPArray)] byte[] pbSecurityId, ref uint pcbSecurityId, uint dwReserved)
{
return URLMonikerErrorCodes.INET_E_DEFAULT_ACTION;
}
public int ProcessUrlAction([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, uint dwAction, out byte pPolicy, uint cbPolicy, byte pContext, uint cbContext, uint dwFlags, uint dwReserved)
{
pPolicy = 0;
return URLMonikerErrorCodes.INET_E_DEFAULT_ACTION;
}
public int QueryCustomPolicy([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, ref Guid guidKey, ref byte ppPolicy, ref uint pcbPolicy, ref byte pContext, uint cbContext, uint dwReserved)
{
return URLMonikerErrorCodes.INET_E_DEFAULT_ACTION;
}
public int SetZoneMapping(uint dwZone, [In, MarshalAs(UnmanagedType.LPWStr)] string lpszPattern, uint dwFlags)
{
return URLMonikerErrorCodes.INET_E_DEFAULT_ACTION;
}
public int GetZoneMappings(uint dwZone, out IEnumString ppenumString, uint dwFlags)
{
ppenumString = null;
return URLMonikerErrorCodes.INET_E_DEFAULT_ACTION;
}
#endregion IInternetSecurityManager Implementation
}
}
我应该实施哪些方法来修复粘贴功能,以及如何实施?
【问题讨论】: