トップ回答者
Windows7とIE8の保護モード時にCookieを取得する方法について

質問
-
みなさん初めまして、絹箱と申します。
Windows7とIE8の保護モード時にCookieを取得する方法について質問があります。
VB.NETでCookieをWindowsAPIのInternetGetCookieを使用して取得するプログラムを作成し
WindowsXP上で動作させると正しくCookieの情報を取得することができますが、Windows7で同じ
プログラムを動作させるとInternetGetCookieでCookieが取得できません。
いろいろ調べてみましたが、
IEIsProtectedModeProcessを使用してIEが保護モードで動作しているかを確認し、保護モードであった場合
IEGetProtectedModeCookieを使用して保護されているCookieを取得する方法があるということまではわかりましたが、
いろいろなサイトで定義されているAPIの書式がVB用であったり、C#用であったり書き方がバラバラであったりとどのように
定義していいのかがよくわかりません。
とりあえず動作するようにプログラムを書いてみましたが、Cookieを取得することができませんでした。
MSDNなどを参照してみてもC++のサンプルコードはありますが、VBやC#用のものがないように思われます。
IEIsProtectedModeProcessやIEGetProtectedModeCookieはVBやC#で使用してはいけないのでしょうか?
英語のサイトを含め、非常に情報が少なく難航しています。
(もちろんWindowsAPIなのでそんなことはないと思いますが。)
どなたか上記のAPIの使用方法をご存じの方はいらっしゃいますでしょうか?
また、その他の方法でWindows7+IE8の保護モードのCookieを取得することなのは可能でしょうか?
以上、なにとぞよろしくお願いいたします。
回答
-
ネイティブの API 定義をマネージコードに変換するツールとして、過去に MSDN マガジンに掲載されたツールがあります。
日本語版からのダウンロードリンクが辿れなかったので、英語版も同時にリンクしています。英語版の上部にダウンロードリンクがあります。http://msdn.microsoft.com/ja-jp/magazine/cc164193.aspx
http://msdn.microsoft.com/en-us/magazine/cc164193.aspxここに MSDN でのネイティブの定義を SigImp Translate Snippet タブで貼り付ければ、それらしいものが出てきます。
ただ、あくまでそれらしいものというレベルにとどまりますので、完璧ではありません。
http://msdn.microsoft.com/en-us/library/ms537316(VS.85).aspxこのように、VB.NET や C# 向けに DllImport 属性や Declare キーワードを使って API の定義を書けば、新たな API を利用することができます。
# API の具体的な使い方については調べていないので割愛します。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク 絹箱 2010年7月21日 4:15
-
Windows 7 + IE8 の環境で C# で BHO を作って試してみましたが、
[DllImport("IEFrame.dll")]
public static extern int IEIsProtectedModeProcess(ref bool pbResult);
この定義の仕方でちゃんと呼び出せています。
戻り値も 0 が返ってきますし、保護モードの有効/無効も判別できています。
絹箱さんがやっていることとの違いは何でしょうか?
(ブラウザーのプロセスの中から API を呼び出さないといけないのですが、ここはクリアしていますよね?)
参考:
How to attach to Browser Helper Object (BHO) with C# in two minutes - CodeProject
http://www.codeproject.com/KB/cs/Attach_BHO_with_C_.aspx- 回答としてマーク 絹箱 2010年7月21日 4:15
すべての返信
-
ネイティブの API 定義をマネージコードに変換するツールとして、過去に MSDN マガジンに掲載されたツールがあります。
日本語版からのダウンロードリンクが辿れなかったので、英語版も同時にリンクしています。英語版の上部にダウンロードリンクがあります。http://msdn.microsoft.com/ja-jp/magazine/cc164193.aspx
http://msdn.microsoft.com/en-us/magazine/cc164193.aspxここに MSDN でのネイティブの定義を SigImp Translate Snippet タブで貼り付ければ、それらしいものが出てきます。
ただ、あくまでそれらしいものというレベルにとどまりますので、完璧ではありません。
http://msdn.microsoft.com/en-us/library/ms537316(VS.85).aspxこのように、VB.NET や C# 向けに DllImport 属性や Declare キーワードを使って API の定義を書けば、新たな API を利用することができます。
# API の具体的な使い方については調べていないので割愛します。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク 絹箱 2010年7月21日 4:15
-
「-2147467263」は標準の COM エラーで「80004001」。E_NOTIMPL が返ってきています。
IEIsProtectedModeProcess を Vista より前の Windows で呼ぶと E_NOTIMPL が返るみたいですが、
IEIsProtectedModeProcess Function ()
http://msdn.microsoft.com/ja-jp/ms537316(en-us,VS.85).aspx
まさかねぇ。
ちなみに、API をどのように定義して、どのように呼び出しているのでしょうか?
特にieframe.dllに対しては参照設定内は行っていません。
COM 呼び出しではないみたいなので、参照設定はいらないと思います。 -
おはようございます。
totojoさん お返事ありがとうございます。
IEIsProtectedModeProcessを呼び出しているOSはWindows7+IE8+VB.NET環境です。
リンク先を見るとVista+IE7環境と書いてあるように思うのですが、上記環境では
呼び出せないのでしょうか。そんなことはないとは思いますが。
APIの定義ですが、
'''Return Type: HRESULT->LONG->int '''pbResult: BOOL* <System.Runtime.InteropServices.DllImportAttribute("ieframe",EntryPoint:="IEIsProtectedModeProcess")> _ Public Shared Function IEIsProtectedModeProcess(ByRef pbResult As Integer) As Integer End Function
というように行っています。Azuleanさんから教えていただいたツールを使用して定義してみました。
C#側でも
[DllImport("IEFrame.dll")] public static extern int IEIsProtectedModeProcess(ref bool pbResult);
と定義してみましたが結果は同じでした。
定義の方法が何かまずいのでしょうか?
なにか不備などありましたらご指摘ください。
-
Windows 7 + IE8 の環境で C# で BHO を作って試してみましたが、
[DllImport("IEFrame.dll")]
public static extern int IEIsProtectedModeProcess(ref bool pbResult);
この定義の仕方でちゃんと呼び出せています。
戻り値も 0 が返ってきますし、保護モードの有効/無効も判別できています。
絹箱さんがやっていることとの違いは何でしょうか?
(ブラウザーのプロセスの中から API を呼び出さないといけないのですが、ここはクリアしていますよね?)
参考:
How to attach to Browser Helper Object (BHO) with C# in two minutes - CodeProject
http://www.codeproject.com/KB/cs/Attach_BHO_with_C_.aspx- 回答としてマーク 絹箱 2010年7月21日 4:15
-
totojo様 回答ありがとうございます。
ご指摘の中にブラウザーのプロセスの中からAPIを呼び出さないといけないとありますが、おそらくそれが原因かと思います。
普通にIEIsProtectedModeProcessAPIをWindowsアプリケーション上から呼び出していました
おそらく隠匿されているCookieの取得関数についても同様のことが言えると思います。
そうなると今回質問させていただいているAPIについては、まったく見当違いのやり方を
していたということになりますね。
本来やりたかった動きというのが、WindowsアプリケーションからブラウザのCookieの内容を取得して
情報を使用するというものでしたので。
もう一度処理形態を見直して他の方法を探してみようと思います。
ご回答していただいた皆様、ありがとうございました。