http://www.divakk.co.jp/aoyagi/csharp_tips_wbzone.html

C# Tips
-AxWebBrowserのIInternetSecurityManager-


[トップ] [目次]


WebBrowserコントロールのセキュリティ設定

VisualStudio.NETにあるMicrosoft Web Browserコントロール(AxWebBrowser)のセキュリティ関係を調整する方法です。
ちなみに、Microsoft Web Browserコントロールはshdocvw.dll(ActiveXコントロール)をラップしているだけです。なので、AxWebBrowserの細かい制御はCOMを使う必要があります。


COM.cs

以下で使うCOMのインターフェースやら#defineやらをC#で使えるようにしたソースです。長いのでファイルを置いておきます。
COM.cs


Formにインターフェースを実装する

まずは、VisualStudio.NETでFormを作って、そのFormにMicrosoft Web Browserコントロールを貼り付けてください。あとは、以下のようにインターフェースを継承するようにして、中身を実装してください。


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using ZoneTest;
namespace ZoneTest
{
public class Form1 : System.Windows.Forms.Form, COM.IServiceProviderForIInternetSecurityManager, COM.IInternetSecurityManager
{
:
コンストラクタとかもろもろは省略
:
private void Form1_Load(object sender, System.EventArgs e)
{
// ServiceProvider を関連付ける
object obj = axWebBrowser1.GetOcx();
COM.IServiceProvider sp = obj as COM.IServiceProvider;
object ops;
sp.QueryService(ref COM.SID_SProfferService, ref COM.IID_IProfferService, out ops);
COM.IProfferService ps = ops as COM.IProfferService;
int cookie = 0;
ps.ProfferService(ref COM.IID_IInternetSecurityManager, this, ref cookie);
}
#region IServiceProviderForIInternetSecurityManager メンバ
int COM.IServiceProviderForIInternetSecurityManager.QueryService(ref Guid guidService, ref Guid riid, out COM.IInternetSecurityManager ppvObject)
{
ppvObject = null;
if (guidService == COM.IID_IInternetSecurityManager)
{
ppvObject = this as COM.IInternetSecurityManager;
return COM.S_OK;
}
return COM.E_NOINTERFACE;
}
#endregion
#region IInternetSecurityManager メンバ
int COM.IInternetSecurityManager.SetSecuritySite(COM.IInternetSecurityMgrSite pSite)
{
return COM.INET_E_DEFAULT_ACTION;
}
int COM.IInternetSecurityManager.GetSecuritySite(COM.IInternetSecurityMgrSite pSite)
{
return COM.INET_E_DEFAULT_ACTION;
}
int COM.IInternetSecurityManager.MapUrlToZone(String pwszUrl, out int pdwZone, int dwFlags)
{
pdwZone = 0;
if (pwszUrl == "http://www.yahoo.co.jp/")
{
// サンプル:Yahoo! のトップページをローカルマシンゾーンにしてみる
pdwZone = (int)COM.URLZONE.URLZONE_LOCAL_MACHINE;
return COM.S_OK;
}
return COM.INET_E_DEFAULT_ACTION;
}
int COM.IInternetSecurityManager.GetSecurityId(string pwszUrl, byte[] pbSecurityId, ref uint pcbSecurityId, uint dwReserved)
{
return COM.INET_E_DEFAULT_ACTION;
}
int COM.IInternetSecurityManager.ProcessUrlAction(String pwszUrl, int dwAction, out byte pPolicy, int cbPolicy, byte pContext, int cbContext, int dwFlags, int dwReserved)
{
pPolicy = 0;
if (dwAction == (int)COM.URLACTION_HTML_SUBMIT_FORMS_TO)
{
// サンプル:サブミットを拒否してみる
pPolicy = (int)COM.URLPOLICY_DISALLOW;
return COM.S_FALSE;
}
return COM.INET_E_DEFAULT_ACTION;
}
int COM.IInternetSecurityManager.QueryCustomPolicy(String pwszUrl, ref Guid guidKey, byte ppPolicy, int pcbPolicy, byte pContext, int cbContext, int dwReserved)
{
return COM.INET_E_DEFAULT_ACTION;
}
int COM.IInternetSecurityManager.SetZoneMapping(int dwZone, String lpszPattern, int dwFlags)
{
return COM.INET_E_DEFAULT_ACTION;
}
int COM.IInternetSecurityManager.GetZoneMappings(int dwZone, out UCOMIEnumString ppenumString, int dwFlags)
{
ppenumString = null;
return COM.INET_E_DEFAULT_ACTION;
}
#endregion
}
}

Form1のコード


ちょっとした解説

まずはFormにIServiceProviderとIInternetSecurityManagerを実装するように、これらを継承元として追加します。もちろん、Formに実装しなくてはいけないわけではないので別クラスにわけても構いません。
ここでちょっと注意。
IServiceProvider.QueryServiceメソッドは、ほんとうなら


int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject);

としたいんです。けど、3番目の引数がobjectだとどうしてもうまく動きませんでした。そこで、仕方ないので3番目の引数の型をIInternetSecurityManagerにしたIServiceProviderForIInternetSecurityManagerも定義しています(COM.cs参照)。そして、FormにはIServiceProviderではなく、IServiceProviderForIInternetSecurityManagerのほうを継承元としています。
(QueryInterfaceしてくれるんならobjectでも良さそうなものだけど、それだとどうしてもIInternetSecurityManagerだと認識してくれなかった)

続いて、Form_LoadイベントでIServiceProviderをFormに問い合わせにくるように登録してやります。

あとは、IServiceProviderForIInternetSecurityManagerとIInternetSecurityManagerを実装するだけです。
IServiceProviderForIInternetSecurityManagerにはQueryServiceメソッドしかありませんし、中身も上記のまんまで十分でしょう。
IInternetSecurityManagerにはいろいろとメソッドがありますが、重要なのはMapUrlToZoneとProcessUrlActionの各メソッドでしょう。
MapUrlToZoneメソッドでは、URLがどのゾーンなのかを返してやります。URLZONE列挙体はCOM.csに入ってます。
ProcessUrlActionメソッドでは、各Actionを許可するか拒否するかを返します。Actionは "URLACTION_" で始まるint値です。これも一通りCOM.csに入ってます。許可するかどうかはpPolicyにURLPOLICY_ALLOW、URLPOLICY_DISALLOWのいずれかをセットしてやります。 URLPOLICY_QUERYとかもありますが、どういう挙動になるのかは試してません。
ちなみに、これらの値はurlmon.hからコピーしてきてC#の文法にあわせただけです(コメントとかもそのまんま)。


[トップ] [目次]


青柳 臣一
2003/09/17

http://www.divakk.co.jp/aoyagi/csharp_tips_wbzone.html相关推荐

  1. ARM汇编:汇编语言跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    跳转指令分三类: 一.无条件跳转: JMP; 二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转); 三.根据 EFLAGS 寄存器的标志位 ...

  2. 百度启用Baidu.co.jp域名,有利于其在日本推广

     (欢迎媒体转载,转载请注明来源:[url]www.idcps.com[/url]) 百度去年就在日本建立了分公司,并开启了百度日 本站,采用的域名一直是Baidu.jp,但这个域名并不符合 日本人的 ...

  3. JP摩根预测:诺基亚2017年净利润将达14.21亿美元

    近日,JP摩根预测,不含苹果公司的补偿,诺基亚2017年EBIT为23.64亿美元,净利润14.21亿美元,对应PE26X. 据悉,诺基亚目前股票市值约为372亿美金,对应人民币超过2500亿元,成为 ...

  4. 服务器资源占用监控(jp@gc - PerfMon Metrics Collector)

    1.安装插件 第一步.JMeterPlugins-Standard解压,JMeterPlugins-Standard.jar放到jmeter的lib\ext目录下,重启jmeter. 第二步.Serv ...

  5. 汇编jnl_汇编指令 JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL

    名称 功能 操作数 操作码 模数 寄存器1 寄存器2或内存 位移量 立即数 符号 方向 芯片型号 16位 32位 JO 溢出跳转 短 $70 无 无 无 无 10 无 无 8086 无 无 JNO 不 ...

  6. java数字时钟代码,Android自定义数字时钟代码,android自定义时钟,package jp.t

    Android自定义数字时钟代码,android自定义时钟,package jp.tpackage jp.tsmsogn.digitalclock;import java.util.Calendar; ...

  7. 汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL

    名称   功能   操作数 操作码 模数 寄存器1 寄存器2 或内存 位移量 立即数 符号 方向 芯片 型号 16位 32位 JO 溢出跳转 短   $70 无 无 无 无 10 无 无 8086 无 ...

  8. petgo.jp狗粮

    petgo.jp狗粮 https://p01.mul-pay.jp/ext/api/getToken?key=POST https://id.petgo.jp/auth/login?r_u=%2Fmy ...

  9. jmeter线程组之jp@gc - Ultimate Thread Group

    首先,我们来了解几个jmeter中的概念 我们在添加一个线程组时通常都要配置这几个属性 线程数:即并发用户数 ramp-up时间(秒):持续时间,加速时间 比如,并发数是1000个,持续时间设置为10 ...

最新文章

  1. robo3t 连接服务器数据库_车牌识别软件连接各种数据库方法大全
  2. 清华「计图」、旷视「天元」纷纷重磅开源,国产深度学习框架迎来高光时刻...
  3. 跟我一起写 Makefile(八)
  4. C++ Primer 5th笔记(chap 17 标准库特殊设施)控制输入格式
  5. (转)JavaScript: 零基础轻松学闭包(1)
  6. iOS瀑布流实现(Swift)
  7. python中的常量_Python中的变量和常量
  8. Net Core集成Exceptionless分布式日志功能以及全局异常过滤
  9. PC服务器实现海量数据存取的方法
  10. tl494cn逆变器电路图_TL494逆变器电路图(400W)
  11. C# Winfrom Chart 图表控件 柱状图、折线图
  12. 【案例分享】网络环路检测基本功能配置
  13. 从python入门到放弃_Python从入门到放弃?方法不对一切白费
  14. mysql报错1593_主从复制报1593错误的处理
  15. Spring context:annotation-config/ 解说
  16. amd服务器6300系列,AMD新款Opteron 6300服务器CPU终极评测
  17. 虚拟服务器巡检,服务器巡检方案
  18. Jade_Primer---first program--JADE OPTIONS
  19. 水果礼包拼手气(仿红包拼手气)含拼手气红包算法
  20. 故事分享 | 33岁高中学历转行python,收获月薪19K,这位陶瓷厂工人逆天了!

热门文章

  1. Windows To Go屏蔽本机硬盘教程
  2. 如何快速将Android Support Library项目升级到AndroidX
  3. ik分词器的下载与使用
  4. 在ArcGIS中利用模型构建器批量进行面积制表
  5. 互联网+时代电子商务发展建议
  6. Capital One应用区块链协同认证系统专利
  7. 根治Windows 2003操作系统登录及关机麻烦
  8. 软件测试中的“银行理财项目”讲解
  9. linux epoll机制
  10. 公司发的月饼出虫了~~~~