locked
Visual Studio 2015でのMVCプログラミングについて? RRS feed

  • 質問

  • Visual Studio 2015でMVCプログラミングをしております。

    セキュリティーの所で困っております。
    Visual Studio 2015のデバッグ(IIS Express)モードでは正しく動作するのですが、
    Windows Server 2012のIIS環境ではエラーになって動作してくれません。

    プログラムは、コントローラでmshtml.tlb/shdocvw.dllを使ってイントラ内部の
    Webサーバの情報を取り出し表示したいだけです。以下の行を実行すると
    System.UnauthorizedAccessExceptionが発生します。

    static private SHDocVw.InternetExplorer iIE = new SHDocVw.InternetExplorer();

    多分IISのセキュリテーか、SHDocVwがアクセスするエリアに権限が無いのではと
    思うのですが。
    mshtml.tlb/shdocvw.dllを使用するプログラミングが初心者なので
    困っております。


    2017年1月4日 5:39

回答

  • > Visual Studio 2015のデバッグ(IIS Express)モードでは正しく動作するのですが、
    > Windows Server 2012のIIS環境ではエラーになって動作してくれません。

    開発環境では Visual Studio を管理者権限で実行しているのですよね?

    であれば、開発環境では Web アプリを動かしているワーカープロセスは管理者権限を持っているはずです。一方、運用環境ではデフォルトではワーカープロセスは権限の低いアクセス権しか持っていません。それが、開発環境ではうまく行っても運用環境ではダメという原因だと思います。

    アプリケーション プール ID
    https://technet.microsoft.com/ja-jp/library/ee886292.aspx

    IIS の設定でワーカープロセスのアカウントを管理者権限を持つものに設定することはできますが、セキュリティ上は多分に問題がありそうです。

    > プログラムは、コントローラでmshtml.tlb/shdocvw.dllを使ってイントラ内部の
    > Webサーバの情報を取り出し表示したいだけです。

    ASP.NET Web アプリで shdocvw.dll を使うという話は初めて聞きました。ワーカープロセスのアクセス権の問題をクリアしたとしても別の問題がありそうな気がします(気がするだけで確証はありませんが)。

    局所的な質問だけでなく、全体のシナリオを含めて何がしたいのかを書いていただけませんか。そうすれば、局所的な質問の部分は実現が無理 or 別に適切な方法がある場合、「それはできない or 適切な方法ではないけど、やりたいことはこうすれば実現できる」というような代案も出てくるかもしれません。

    2017年1月4日 6:41
  • 基本的に IIS から実行されるコードは、デスクトップがない状態のプロセス内で実行されるはずです。
    それに対して、InternetExplorer というデスクトップが必要な要素を使おうとしていることが、問題になっていそうです。

    いわゆる、サービス(デスクトップがない状態)で使うテクニックを考える必要があります。
    (たとえば、WebClient で通信して HTML タグを解析する何かライブラリを使うとか。それ以外にも権限の問題も出てくるかもしれません)

    2017年1月4日 6:58
  • 直接的なドキュメントはありませんでしたが、Internet Explorerが通信に使用しているWinINETについてはサービスでは WinInet の使用はサポートされないにて

    Microsoft Win32 インターネット関数 (WinInet.dll からエクスポートされます) は、サービスや Internet Information Server (IIS) アプリケーション (これもサービスです) から実行する場合にはサポートされません。

    と説明されています。ですので、SHDocVwについてもIIS環境では動作させられないと考えるべきでしょう。

    2017年1月4日 7:57
  • 私も、ASP.NET Web アプリでは無理だと思っていましたが試しに作ってみたらVisual Studio 2015のデバッグ(IIS Express)モードで動いてしまったのであきらめきれない気分です。

    無理か、不安定であろうと思います。
    仮に動いたとしても、Cookie が共有されるなど、不都合が起きる可能性があります。

    なお、「IIS Express で動くから使える」と思っていると、たいてい作り直しを含む損害(工数ロス)になるので考え方を変えた方が良いですよ。
    デスクトップあり&ログオンユーザーができることはかなり多くなってますが、それと比較して、Web サービス・ワーカープロセスはできることがかなり少なくなります。

    2017年1月4日 8:59
  • 私も、ASP.NET Web アプリでは無理だと思っていましたが試しに作ってみたらVisual Studio 2015のデバッグ(IIS Express)モードで動いてしまったのであきらめきれない気分です。

    勘違いされています。

    ASP.NET Web プロジェクト用の Visual Studio の Web サーバー - IIS Express と Visual Studio の併用の後半、IIS Express を使用することの短所で説明されていますが

    IIS Express を使用してページを実行する場合、ページは現在のユーザー アカウントのコンテキストで実行されます。 たとえば、管理者レベルのユーザーとして実行する場合、IIS Express で実行されるページは、管理者レベルの特権を持ちます。 一方、IIS 7 および IIS 8 では、ASP.NET は既定で特権が制限されているアカウントとして実行されます。

    この違いにより、ユーザーアカウントのコンテキストで動作するIIS ExpressではInternet Explorerが利用でき、本番となるIISでは動作しません。

    2017年1月4日 9:07
  • > 2.ボタンを押すと、Ajaxでコントローラ経由で隣にあるWebサーバのデータをクロールしJsonで返します。

    そこで mshtml.tlb/shdocvw.dll を使っていると想像していますが、具体的に何をどのようにして取得しているのでしょう?
    mshtml.tlb/shdocvw.dll を使わない別の手段はないのでしょうか? WebRequest / WebResponse などの手段でアクセスして取得できるデータであれば何とかなりそうな気がしますが。

    2017年1月4日 9:10

すべての返信

  • > Visual Studio 2015のデバッグ(IIS Express)モードでは正しく動作するのですが、
    > Windows Server 2012のIIS環境ではエラーになって動作してくれません。

    開発環境では Visual Studio を管理者権限で実行しているのですよね?

    であれば、開発環境では Web アプリを動かしているワーカープロセスは管理者権限を持っているはずです。一方、運用環境ではデフォルトではワーカープロセスは権限の低いアクセス権しか持っていません。それが、開発環境ではうまく行っても運用環境ではダメという原因だと思います。

    アプリケーション プール ID
    https://technet.microsoft.com/ja-jp/library/ee886292.aspx

    IIS の設定でワーカープロセスのアカウントを管理者権限を持つものに設定することはできますが、セキュリティ上は多分に問題がありそうです。

    > プログラムは、コントローラでmshtml.tlb/shdocvw.dllを使ってイントラ内部の
    > Webサーバの情報を取り出し表示したいだけです。

    ASP.NET Web アプリで shdocvw.dll を使うという話は初めて聞きました。ワーカープロセスのアクセス権の問題をクリアしたとしても別の問題がありそうな気がします(気がするだけで確証はありませんが)。

    局所的な質問だけでなく、全体のシナリオを含めて何がしたいのかを書いていただけませんか。そうすれば、局所的な質問の部分は実現が無理 or 別に適切な方法がある場合、「それはできない or 適切な方法ではないけど、やりたいことはこうすれば実現できる」というような代案も出てくるかもしれません。

    2017年1月4日 6:41
  • 基本的に IIS から実行されるコードは、デスクトップがない状態のプロセス内で実行されるはずです。
    それに対して、InternetExplorer というデスクトップが必要な要素を使おうとしていることが、問題になっていそうです。

    いわゆる、サービス(デスクトップがない状態)で使うテクニックを考える必要があります。
    (たとえば、WebClient で通信して HTML タグを解析する何かライブラリを使うとか。それ以外にも権限の問題も出てくるかもしれません)

    2017年1月4日 6:58
  • 直接的なドキュメントはありませんでしたが、Internet Explorerが通信に使用しているWinINETについてはサービスでは WinInet の使用はサポートされないにて

    Microsoft Win32 インターネット関数 (WinInet.dll からエクスポートされます) は、サービスや Internet Information Server (IIS) アプリケーション (これもサービスです) から実行する場合にはサポートされません。

    と説明されています。ですので、SHDocVwについてもIIS環境では動作させられないと考えるべきでしょう。

    2017年1月4日 7:57
  • 回答ありがとうございました。

    全体のシナリオですが。

    1.作成したWebページからボタンを押してAjax経由で処理を行おうとしています。

    2.ボタンを押すと、Ajaxでコントローラ経由で隣にあるWebサーバのデータをクロールしJsonで返します。

    3.Jsonで返された値をブラウザに表示したい、プラスメールで通知したい。

    1~3です。Visual Studio 2015のデバッグ(IIS Express)モードでは動作が確認できたので安心していたら実環境に持っていくと動作できませんでした。セキュリテーと思っているのはshdocvw.dllを使った同じプログラムをコマンドラインで作成してタスクスケジューラで動かしているのですがそれは正常に動いています。

    私も、ASP.NET Web アプリでは無理だと思っていましたが試しに作ってみたらVisual Studio 2015のデバッグ(IIS Express)モードで動いてしまったのであきらめきれない気分です。

    2017年1月4日 8:54
  • 私も、ASP.NET Web アプリでは無理だと思っていましたが試しに作ってみたらVisual Studio 2015のデバッグ(IIS Express)モードで動いてしまったのであきらめきれない気分です。

    無理か、不安定であろうと思います。
    仮に動いたとしても、Cookie が共有されるなど、不都合が起きる可能性があります。

    なお、「IIS Express で動くから使える」と思っていると、たいてい作り直しを含む損害(工数ロス)になるので考え方を変えた方が良いですよ。
    デスクトップあり&ログオンユーザーができることはかなり多くなってますが、それと比較して、Web サービス・ワーカープロセスはできることがかなり少なくなります。

    2017年1月4日 8:59
  • 私も、ASP.NET Web アプリでは無理だと思っていましたが試しに作ってみたらVisual Studio 2015のデバッグ(IIS Express)モードで動いてしまったのであきらめきれない気分です。

    勘違いされています。

    ASP.NET Web プロジェクト用の Visual Studio の Web サーバー - IIS Express と Visual Studio の併用の後半、IIS Express を使用することの短所で説明されていますが

    IIS Express を使用してページを実行する場合、ページは現在のユーザー アカウントのコンテキストで実行されます。 たとえば、管理者レベルのユーザーとして実行する場合、IIS Express で実行されるページは、管理者レベルの特権を持ちます。 一方、IIS 7 および IIS 8 では、ASP.NET は既定で特権が制限されているアカウントとして実行されます。

    この違いにより、ユーザーアカウントのコンテキストで動作するIIS ExpressではInternet Explorerが利用でき、本番となるIISでは動作しません。

    2017年1月4日 9:07
  • > 2.ボタンを押すと、Ajaxでコントローラ経由で隣にあるWebサーバのデータをクロールしJsonで返します。

    そこで mshtml.tlb/shdocvw.dll を使っていると想像していますが、具体的に何をどのようにして取得しているのでしょう?
    mshtml.tlb/shdocvw.dll を使わない別の手段はないのでしょうか? WebRequest / WebResponse などの手段でアクセスして取得できるデータであれば何とかなりそうな気がしますが。

    2017年1月4日 9:10
  • 基本的に IIS から実行されるコードは、デスクトップがない状態のプロセス内で実行されるはずです。
    それに対して、InternetExplorer というデスクトップが必要な要素を使おうとしていることが、問題になっていそうです。

    いわゆる、サービス(デスクトップがない状態)で使うテクニックを考える必要があります。
    (たとえば、WebClient で通信して HTML タグを解析する何かライブラリを使うとか。それ以外にも権限の問題も出てくるかもしれません)

    独自にHTMLタグの解析も検討しました。これだと思うライブラリが見つかりません。何か良いFreeのパッケージがあれば試してみようと思っています。お勧めのクローラはございますでしょうか?

    今、github.comでAbotというクローラを見つけて調べようと思っていますが、Javaスクリプトなどの解析をどこまでやってくれるのか不明です。その点、shdocvw.dllは情報も豊富で重宝していたため真面目にクローラの検討をしていませんでした。

    2017年1月4日 9:12

  • mshtml.tlb/shdocvw.dll を使わない別の手段はないのでしょうか? WebRequest / WebResponse などの手段でアクセスして取得できるデータであれば何とかなりそうな気がしますが。

    ありがとうございます。Webページにログインして返されたHTMLを正規表現で解析して必要な項目を抽出しています。

    WebRequest / WebResponse 検討できそうです。問題はWeb認証があるページなのでどうやってやれるか調べてみようと思っています。

    2017年1月4日 9:21
  • 多くの回答ありがとうございました。

    解決?あきらめました。
    IISではやはり無理の様でした。

    2017年1月6日 9:07