none
Windows7とIE8の保護モード時にCookieを取得する方法について RRS feed

  • 質問

  • みなさん初めまして、絹箱と申します。

     

    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を取得することなのは可能でしょうか?

     

    以上、なにとぞよろしくお願いいたします。


     

     

    2010年7月15日 12:11

回答

  • ネイティブの 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
    2010年7月15日 14:16
    モデレータ
  • 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
    2010年7月20日 7:09

すべての返信

  • ネイティブの 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
    2010年7月15日 14:16
    モデレータ
  • おはようございます。

     

    Azuleanさん、ご回答ありがとうございます。

    教えていただいたリンク先、ツールを使用して試してみようと思います。

    まだまだ自分の勉強不足を思い知らされる毎日ですが、頑張ってうまくいくようにやってみます。

    結果は再度ご報告いたします。

    2010年7月15日 23:52
  • ツールなどを使って定義してみましたが、やはり動作させることはできませんでした。

    VB.NET、C#ともにIEIsProtectedModeProcessの戻り値に「-2147467263」が返却されてしまいます。

    特にieframe.dllに対しては参照設定内は行っていません。

     

    VB.NET、C#のどちらでも構いませんが、このWindowsAPIを正しく動作させている方がいらっしゃいましたら

    何かご教授いただけたらと思います。

     

    以上、よろしお願いいたします。



    2010年7月16日 6:47
  • 「-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 呼び出しではないみたいなので、参照設定はいらないと思います。
    2010年7月16日 10:16
  • おはようございます。

     

    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);

    と定義してみましたが結果は同じでした。

     

    定義の方法が何かまずいのでしょうか?

    なにか不備などありましたらご指摘ください。

     

     

     


    2010年7月20日 0:04
  • 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
    2010年7月20日 7:09
  • totojo様 回答ありがとうございます。

    ご指摘の中にブラウザーのプロセスの中からAPIを呼び出さないといけないとありますが、おそらくそれが原因かと思います。

    普通にIEIsProtectedModeProcessAPIをWindowsアプリケーション上から呼び出していました

    おそらく隠匿されているCookieの取得関数についても同様のことが言えると思います。

    そうなると今回質問させていただいているAPIについては、まったく見当違いのやり方を

    していたということになりますね。

     

    本来やりたかった動きというのが、WindowsアプリケーションからブラウザのCookieの内容を取得して

    情報を使用するというものでしたので。

     

    もう一度処理形態を見直して他の方法を探してみようと思います。

    ご回答していただいた皆様、ありがとうございました。

    • 回答としてマーク 絹箱 2010年7月21日 4:14
    • 回答としてマークされていない 絹箱 2010年7月21日 4:15
    2010年7月20日 7:22