none
IEのプロキシ除外設定有効のタイミングについて RRS feed

  • 質問

  • 現在Windows7 Professional SP1を利用しています。

    モバイル用にPCをキッティングし、ドメインに参加させました。

    ADでプロキシの値が適用されているのを確認し、シャットダウン。

    除外サイトにSSTPの接続ドメインが含まれていることも確認。

    ADと接続できない環境でキャッシュログオン(ユーザー権限)。

    SoftbankのPocketWi-Fiにてインターネット接続。

    その後、SSTPを利用し社内に接続しようとしても接続できません。

    IEを開いてプロキシの設定を開いて「OK」を押すと接続が可能になります。

    100%発生するわけではないのですが、高頻度で発生します。

    また、1台のPCではなく、複数PCで発生しています。

    ユーザーにいちいちプロパティを開いてもらうわけにもいきません。

    原因がわからず困っています。。。

    解決方法、回避案などよろしくお願いします。

    2016年2月29日 18:18

回答

  • プロキシ設定をWPADでの自動構成にするのが一番シンプルだと思いました。

    ポリシーについては、おそらくレジストリに設定が入るだけなので、
    IEやインターネットオプションを開かず、システムへ設定反映するためには、
    kenjinoteさんの回答の通り、APIを使用するなどの必要が出てくるのだと思います。
    # 確かWinInetの通信開始時にも設定が反映されたと思いますので、
    # 一部の環境については、何らかの通信で反映されたのかもしれません。

    SSTPのHTTPS通信はWinHTTPを使用しているので、
    この通信がシステムの構成を参照した時には、除外設定が反映されていないため、
    接続が確立しないという事なのだと思います。

    従って、例えばWinHTTPのプロキシを構成してあげる事でも通信は可能になると思いますが、
    設定の解除も含め、複数の環境にこれを実装するのは現実的では無いと思います。
    PACファイルによる自動構成という手段もありますが、WinHTTPへは即時反映されなかった様な気がします。
    よって、WPADが一番良いかなと思いました。

    • 回答としてマーク あるか 2016年3月7日 7:18
    2016年3月2日 1:17
  • 原因はわかりませんが、回避案の1つ、ご提案します。

    InternetSetOptionというWindows APIがあり、これを使うとインターネットオプションでOKを押したときと同様な動作を行わせることができます。(レジストリHKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settingsの値をシステムに読み込ませる)

    PowerShellスクリプトとして実行する方法

    function Reload-InternetOptions
    {
      $signature = @'
    [DllImport("wininet.dll", SetLastError = true, CharSet=CharSet.Auto)]
    public static extern bool InternetSetOption(IntPtr hInternet, int
    dwOption, IntPtr lpBuffer, int dwBufferLength);
    '@
      $interopHelper = Add-Type -MemberDefinition $signature -Name MyInteropHelper -PassThru
    
      $INTERNET_OPTION_SETTINGS_CHANGED = 39
      $INTERNET_OPTION_REFRESH = 37
    
      $result1 = $interopHelper::InternetSetOption(0, $INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)
      $result2 = $interopHelper::InternetSetOption(0, $INTERNET_OPTION_REFRESH, 0, 0)
    
      $result1 -and $result2
    }
    
    Reload-InternetOptions
    

    上記スクリプトをファイル名「Reload-InternetOptions.ps1」として保存し、スタートアップ等必要な個所で実行します。
    ※実行ポリシーでスクリプトの実行が許可されている必要があります。(参考ページ


    EXEとして実行する方法

    #pragma comment(lib,"wininet")
    
    #include <windows.h>
    #include <wininet.h>
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	BOOL bResult1 = InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0);
    	BOOL bResult2 = InternetSetOption(0, INTERNET_OPTION_REFRESH, 0, 0);
    	return bResult1 && bResult2;
    }
    上記をVisual StudioのC++(Win32/64アプリケーション)でビルドし、出来上がったEXEをスタートアップ等必要な個所で実行します。
    • 回答としてマーク あるか 2016年3月7日 7:18
    2016年3月1日 5:36

すべての返信

  • 原因はわかりませんが、回避案の1つ、ご提案します。

    InternetSetOptionというWindows APIがあり、これを使うとインターネットオプションでOKを押したときと同様な動作を行わせることができます。(レジストリHKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settingsの値をシステムに読み込ませる)

    PowerShellスクリプトとして実行する方法

    function Reload-InternetOptions
    {
      $signature = @'
    [DllImport("wininet.dll", SetLastError = true, CharSet=CharSet.Auto)]
    public static extern bool InternetSetOption(IntPtr hInternet, int
    dwOption, IntPtr lpBuffer, int dwBufferLength);
    '@
      $interopHelper = Add-Type -MemberDefinition $signature -Name MyInteropHelper -PassThru
    
      $INTERNET_OPTION_SETTINGS_CHANGED = 39
      $INTERNET_OPTION_REFRESH = 37
    
      $result1 = $interopHelper::InternetSetOption(0, $INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)
      $result2 = $interopHelper::InternetSetOption(0, $INTERNET_OPTION_REFRESH, 0, 0)
    
      $result1 -and $result2
    }
    
    Reload-InternetOptions
    

    上記スクリプトをファイル名「Reload-InternetOptions.ps1」として保存し、スタートアップ等必要な個所で実行します。
    ※実行ポリシーでスクリプトの実行が許可されている必要があります。(参考ページ


    EXEとして実行する方法

    #pragma comment(lib,"wininet")
    
    #include <windows.h>
    #include <wininet.h>
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	BOOL bResult1 = InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0);
    	BOOL bResult2 = InternetSetOption(0, INTERNET_OPTION_REFRESH, 0, 0);
    	return bResult1 && bResult2;
    }
    上記をVisual StudioのC++(Win32/64アプリケーション)でビルドし、出来上がったEXEをスタートアップ等必要な個所で実行します。
    • 回答としてマーク あるか 2016年3月7日 7:18
    2016年3月1日 5:36
  • プロキシ設定をWPADでの自動構成にするのが一番シンプルだと思いました。

    ポリシーについては、おそらくレジストリに設定が入るだけなので、
    IEやインターネットオプションを開かず、システムへ設定反映するためには、
    kenjinoteさんの回答の通り、APIを使用するなどの必要が出てくるのだと思います。
    # 確かWinInetの通信開始時にも設定が反映されたと思いますので、
    # 一部の環境については、何らかの通信で反映されたのかもしれません。

    SSTPのHTTPS通信はWinHTTPを使用しているので、
    この通信がシステムの構成を参照した時には、除外設定が反映されていないため、
    接続が確立しないという事なのだと思います。

    従って、例えばWinHTTPのプロキシを構成してあげる事でも通信は可能になると思いますが、
    設定の解除も含め、複数の環境にこれを実装するのは現実的では無いと思います。
    PACファイルによる自動構成という手段もありますが、WinHTTPへは即時反映されなかった様な気がします。
    よって、WPADが一番良いかなと思いました。

    • 回答としてマーク あるか 2016年3月7日 7:18
    2016年3月2日 1:17
  • kenjinote様

    ご回答ありがとうございます。

    なるほど。Powershellだとできるんですね。

    プロキシの設定を開いて「OK」を自動で押すバッチも検討したのですが、気づきませんでした。

    プログラムを書いてしまうと、OSのバージョン等で動かなくなったときに直せないので、LazyDogg様のWPAD・PAC作戦で行こうと思います。

    ご回答いただき本当にありがとうございました。

    2016年3月7日 7:17
  • LazyDogg様

    ご回答ありがとうございます。

    SSTPのHTTPS通信はWinHTTPの設定なのですね。。。

    とりあえず、PACファイルでテストしてみました。

    実験回数は少ないですがうまく行ったようでエラーは発生しなくなりました。

    もう少し検討してWPADにするか検討したいとおもいます。

    ご回答いただき本当にありがとうございました。


    2016年3月7日 7:20