none
ASP.NETからのExcel起動について RRS feed

  • 質問

  • 過去ログなどを参照したのですが、解決しなかったので投稿させていただきます。

    現在ASP.Net(VB.Net)からExcelアプリケーションを起動させてグラフを作成する処理を作っています。
    <環境>
    OS:Windows XP SP2
    Visual Studio 2003(VB.Net)
    Excel 2003

    ExcelApplicationの起動をさせると、"System.UnauthorizedAccessException"アクセスが拒否されましたとなります。
    具体的なソースは以下のようにしています。
            Dim excelapp As Excel.Application
            Dim excelwb As Excel.Workbook
            excelapp = New Excel.Application  <ここで落ちる
    参照設定などは設定しているので、波線などは出ておらず、Windowsアプリケーションであれば動いています。
    DCOMのアクセス権限は、IUSER_<PC名>など
    http://support.microsoft.com/default.aspx?scid=kb;ja;288367
    を参考に付与しました。
    タスクマネージャで確認するとExcelアプリケーションのプロセス自体はあるのでExcelは起動していると思うのですが、デバッグにて変数を参照するとNothingの状態になっています。Excelのアプリケーションはローカルユーザで動いていました。

    ほかのPCにて同様の設定を行ったところ動くものと動かないものが発生しています。
    (上記と同様の環境でも動いていました。)

    ほかに設定などで抜けているところがあるでしょうか。
    よろしくお願いいたします。


    2007年7月17日 11:24

回答

  • ASP.NETのワーカープロセスがPIAにアクセスできないのかもしれません。 ワーカープロセスのユーザー名は何でしょうか? タスクマネージャのプロセスで、aspnet_wp.exeを実行しているユーザー名で確認できます。

     

    Windows認証でしょうか? 試しに偽装してみるとどうなりますか?

    2007年7月17日 14:57
    モデレータ
  • DCOMの設定でASPNETユーザーを追加してみて下さい。偽装をしなければASPNET、偽装すればUSER_コンピュータ名が実行アカウントになります。

     

    #前の私の発言でPIAうんぬんが出てきましたが、名前空間が単なるExcelですので、PIAは使っておられないようですね。失礼しました。m(_ _)m

    2007年7月18日 1:34
    モデレータ
  •  fumix さんからの引用

    DCOMCNFGにてDCOMの設定を確認したところコンピュータ名\ASPNETが起動許可、アクセス許可ともに入っております。
    また、それぞれのチェックボックスにもチェックが入っている状態です。
    設定項目の確認なのですが、
    コンソールルート->コンポーネントサービス->コンピュータ->マイコンピュータ->DCOMの構成->Microsoft Excelアプリケーションですがあっていますでしょうか?

     

    昔のスレッドを探してきました。参考になるかもしれません。

     

    ASP.NET(VB.NET)でのExcel操作
      http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-26599.htm

     

     fumix さんからの引用

    Imports Microsoft.Office.Interop
    をしているため、Excelで宣言ができました。
    これであればPIAは使っていないことになるのでしょうか?

     

    あっ、それであればPIAを使用しています。

    2007年7月18日 2:55
    モデレータ
  •  trapemiya さんからの引用
    名前空間が単なるExcelですので、PIAは使っておられないようですね。失礼しました。m(_ _)m

    むしろ PIA か VSTO の可能性が高いです。
    2007年7月18日 5:00
  •  fumix さんからの引用

    偽装するとタスクマネージャの内容も変わるのでしょうか。


    変わりません。トークンの種類が違います。
    本当に偽装ができているかどうかは、偽装されたIDを取得する次のコードを実行してみるとわかります。

     

    System.Security.Principal.WindowsIdentity.GetCurrent().Name

     

     fumix さんからの引用

    PIAを使わない方法はありますでしょうか。


    名前空間を代えてExcelのインスタンスを生成すれば可能だと思います。以下はその例です。

     

    Export to Excel
      http://www.aspnetpro.com/NewsletterArticle/2003/09/asp200309so_l/asp200309so_l.asp

     

    しかし、PIAを使う方が良いでしょう。型の互換性の保障がなくなるからです。

     

    プライマリ相互運用アセンブリ (PIA)
      http://www.microsoft.com/japan/msdn/net/general/whypriinterop.aspx#whypriinterop_topic14

    2007年7月19日 1:27
    モデレータ

すべての返信

  • ASP.NETのワーカープロセスがPIAにアクセスできないのかもしれません。 ワーカープロセスのユーザー名は何でしょうか? タスクマネージャのプロセスで、aspnet_wp.exeを実行しているユーザー名で確認できます。

     

    Windows認証でしょうか? 試しに偽装してみるとどうなりますか?

    2007年7月17日 14:57
    モデレータ
  • ご回答ありがとうございます。

    aspnet_wp.exeの実行ユーザですが、ASPNETとなっています。

    認証は統合Windows認証を使っています。(標準のままです)
    偽装ですが、web.configの<system.web>以下に
    <identity impersonate="true"/>
    を組み込みましたが、エラーとなっている箇所は変わりません。

    恐れ入りますが何かほかに設定など確認する部分などありましたらお教えください。

    2007年7月18日 0:43
  • DCOMの設定でASPNETユーザーを追加してみて下さい。偽装をしなければASPNET、偽装すればUSER_コンピュータ名が実行アカウントになります。

     

    #前の私の発言でPIAうんぬんが出てきましたが、名前空間が単なるExcelですので、PIAは使っておられないようですね。失礼しました。m(_ _)m

    2007年7月18日 1:34
    モデレータ
  • ご回答ありがとうございます。

    確認してみましたが、
    DCOMCNFGにてDCOMの設定を確認したところコンピュータ名\ASPNETが起動許可、アクセス許可ともに入っております。
    また、それぞれのチェックボックスにもチェックが入っている状態です。
    設定項目の確認なのですが、
    コンソールルート->コンポーネントサービス->コンピュータ->マイコンピュータ->DCOMの構成->Microsoft Excelアプリケーションですがあっていますでしょうか?

    また、PIAの部分ですが、
    Imports Microsoft.Office.Interop
    をしているため、Excelで宣言ができました。
    これであればPIAは使っていないことになるのでしょうか?


    2007年7月18日 2:17
  •  fumix さんからの引用

    DCOMCNFGにてDCOMの設定を確認したところコンピュータ名\ASPNETが起動許可、アクセス許可ともに入っております。
    また、それぞれのチェックボックスにもチェックが入っている状態です。
    設定項目の確認なのですが、
    コンソールルート->コンポーネントサービス->コンピュータ->マイコンピュータ->DCOMの構成->Microsoft Excelアプリケーションですがあっていますでしょうか?

     

    昔のスレッドを探してきました。参考になるかもしれません。

     

    ASP.NET(VB.NET)でのExcel操作
      http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-26599.htm

     

     fumix さんからの引用

    Imports Microsoft.Office.Interop
    をしているため、Excelで宣言ができました。
    これであればPIAは使っていないことになるのでしょうか?

     

    あっ、それであればPIAを使用しています。

    2007年7月18日 2:55
    モデレータ
  •  trapemiya さんからの引用
    名前空間が単なるExcelですので、PIAは使っておられないようですね。失礼しました。m(_ _)m

    むしろ PIA か VSTO の可能性が高いです。
    2007年7月18日 5:00
  • ご回答ありがとうございました。

    お教えいただきましたURLより偽装などを試みましたが、やり方が悪いのか、aspnet_wp.exeの実行ユーザはASPNETのままとなっていました。

    偽装するとタスクマネージャの内容も変わるのでしょうか。
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
       
      <system.web>
        <identity impersonate="true"/>
    という形で偽装の設定を入れました。

    PIAを使わない方法はありますでしょうか。
    (当初調べたときに、参照設定で COMオブジェクトのMicrosoft Excel バージョン object Libraryを参照するように書いてありましたので。)
    Office XP 以前はなかったということでしょうか。
    実行機が2003がインストールされているため、Officeのバージョンを変更することができません。
    2007年7月18日 5:36
  •  fumix さんからの引用

    偽装するとタスクマネージャの内容も変わるのでしょうか。


    変わりません。トークンの種類が違います。
    本当に偽装ができているかどうかは、偽装されたIDを取得する次のコードを実行してみるとわかります。

     

    System.Security.Principal.WindowsIdentity.GetCurrent().Name

     

     fumix さんからの引用

    PIAを使わない方法はありますでしょうか。


    名前空間を代えてExcelのインスタンスを生成すれば可能だと思います。以下はその例です。

     

    Export to Excel
      http://www.aspnetpro.com/NewsletterArticle/2003/09/asp200309so_l/asp200309so_l.asp

     

    しかし、PIAを使う方が良いでしょう。型の互換性の保障がなくなるからです。

     

    プライマリ相互運用アセンブリ (PIA)
      http://www.microsoft.com/japan/msdn/net/general/whypriinterop.aspx#whypriinterop_topic14

    2007年7月19日 1:27
    モデレータ
  • ご回答ありがとうございました。
    結局原因が分からず(正常に動作しているPCとの差がなかったため)一度Officeをアンインストールしました。
    DCOMの設定を元に戻し、Officeをアンインストール、その後に再度OfficeのインストールとDCOMの設定を行いました。

    その結果正常にExcelを起動することができました。ですので、PIAを使用して開発を進めることができそうです。
    前回お教えいただいた偽装の設定をWeb.configに記載していたのですが、偽装の設定をはずしても、Excelが起動しました。

    いろいろとお教えいただきました、 trapemiyaさんとじゃんぬねっとさん、本当にありがとうございました。
    VB6とは違い奥が深いとつくづく感じさせられました。


    2007年7月19日 9:01