とあるプログラマーの覚書

ASP編:同ネットワーク上の他のサーバのファイルへアクセスする方法

スポンサーリンク

今回は、ASPに関するトピックです。
ここで言う「ASP」は、クラシックASP、レガシーASPと言われる方のASPです。(ASP.NETで試していませんが、おそらくASP.NETでも実現出来るかもしれません。)

やりたかった事は、ASPを動作させているIISを動かしているWebサーバから、同ネットワーク上の他のサーバの共有フォルダにあるファイルへアクセス(コピーの為とか、内容のリードの為とか)したい、という事です。
実際のコードで表現すると、以下のようなイメージですね。


Set objFS = Server.CreateObject(“Scripting.FileSystemObject”)
objFS.CopyFile “\\ServerA\share\xxxx.txt”, “files\xxxx.txt”, True


ASPを作動させているWebサーバから、「ServerA」という別サーバのファイルにアクセスして、自身のWebサーバへコピーする、という事です。
こんな簡単そうな事なのですが、いざやってみると、、、
「書き込みできません」とか「ファイルが存在しません」とかのエラーメッセージが表示されてしまいます。

理由を調べていると、以下のようなページを見つけました。
FileSystemObject でリモート ファイルにアクセスできない
基本的には、FileSystemObjectを使っての、他サーバへのファイルへのアクセスは出来ないらしいです。
で、IUSR_マシン名のユーザアカウントを、他サーバにも追加する等、このページに一応解決策が記載されていたのですが、設定の仕方が誤っているのか、上手く動作しませんでした。

そして、インターネット上の他の情報も探しつつ、以下のようなページを見つけました。
ASP(VBSCRIPT)でのネットワークドライブへのファイルコピーについて
ここに書かれている一説によると、クラシックASP、レガシーASPでの他マシンからのファイルアクセスは、他サーバからのファイルコピー処理を行うだけの簡単な機能を持たせたCOMアプリケーション(DLL)を作成して、それをASPから実行するという方法が王道?という情報がありました。
王道かどうかはわかりませんが、とりあえず実現出来るのか色々試したところ、なんとか実現する事が出来ました。

私が行った手順を、参考にしたページも併せて紹介したいと思います。


1.VB.NETで、単純なファイルコピーを行うだけのCOMアプリ(DLL)を作成。

.NETか6.0系かはどちらでもOKだと思います。
私の場合、Visual Studio 2008のVBで作成しました。
手順は以下の通りです。
「新しいプロジェクト」⇒「クラス ライブラリ」にて、DLLを作成する為のプロジェクトを用意します。
プロジェクトを作成した後に自動的に出来上がるクラスは、削除してOKです。
次に、ソリューションエクスプローラで右クリック⇒「追加」⇒「新しい項目」⇒「COMクラス」を選択します。
この追加したCOMクラスに、実装したい関数を作成します。
例えば、引数にコピー元のファイルパスと、コピー先のファイルパスを持つようなPublic Fucntionと、エラーが発生した場合にエラー内容を格納する文字列変数と、その内容を返すPublic Functionがあるとよいでしょう。


2.作成したDLLを、Webサーバ上にてレジストリ登録する。

VB.NETで作成したDLLをレジストリ登録します。
レジストリ登録の手順は、以下の通りです。
まず、作成したDLLをWebサーバのWindowsのSystemフォルダへ移動する。⇒Systemフォルダでなくてもいいかもしれません。

コマンドプロンプトを起動し、cdコマンドで以下のディレクトリに移動する。
C:\Windows\Microsoft.NET\Framework\v2.0.50727⇒お使いのマシンにより、Windowsフォルダが異なるかもしれません。

下記のコマンド実行
Regasm C:\~省略~\xxxx.dll /codebase
ちなみに、このとき、「アセンブリが厳密に署名されていない」という警告が出る事がありますが、これはdllをコンパイルするときに署名を付けるだけで回避出来ます。
Visual Studioで、DLLのプロジェクトを開き、ソリューションエクスプローラでDLLのプロジェクトのプロパティを開きます。
「署名」というタブがあります。ここで「厳密な名前のキーファイルを選択してください」というところがありまして、この下のプルダウンから「新規作成」を選び、適当にキーファイル名とパスワードを入力すればOKです。
私は、このアセンブリの署名については詳しくは存じ上げないので、詳細を知りたい方は別のサイト等でご確認頂ければと思います。


3.COMアプリケーションの登録

まず、レジストリに登録したDLLファイルに対して、IUSRの実行権限を与えておきます。⇒これは不要かもしれませんが。
以下の手順で、COMアプリケーションに登録します。
「コントロールパネル」⇒「管理ツール」⇒「コンポーネントサービス」を起動します。
左ペインより、「コンポーネントサービス」⇒「コンピュータ」⇒「マイコンピュータ」⇒「COM+ アプリケーション」を開きます。
「COM+ アプリケーション」で右クリック⇒新規作成⇒「アプリケーション」を選択すると、COM+アプリケーション インストールウィザードが開きます。
「空のアプリケーションを作成する」⇒適当なアプリケーション名入力+「サーバー アプリケーション」選択で、次へ行きます。
次に、「このユーザー」を選択して、他サーバへアクセス出来る権限(Administrator等)を設定します。
次に、「アプリケーションロールの追加」という画面になりますが、ここはスルーで次へ行きます。
次に、おそらく「CreateOwner」というツリービューが出てくるかと思いますので、ここでIUSRと、先程指定した権限を追加しておきましょう。(厳密に両方の設定が必要かどうかは検証していませんが)
これで一旦完了です。


4.DLLの紐付け

先程追加したアプリケーション名が、COM+アプリケーションに追加されたと思います。
これはまだ空のアプリケーションなので、作成したDLLに紐付ける必要があります。
「コンポーネントサービス」で、追加されたアプリケーションを開くと、「レガシ コンポーネント」というのがあるかと思います。
このディレクトリを右クリック⇒新規作成⇒「レガシ コンポーネント」と選択します。
すると、登録済みのCOMコンポーネントが一覧表示されます。
この中から、自分が作成したDLLの名前(クラス名)を探します。DLLファイル名.クラス名というような並びになっているはずです。
64ビットマシンで試している場合、作成したDLLが見つからない場合があるかもしれません。
その場合は、「32ビットレジストリ」にチェックを入れて検索してみてください。
見つかったら、それを選択して、次へ行きます。
これで、「レガシ コンポーネント」内に、追加したCOMクラスが表示されます。
これを右クリック⇒プロパティ⇒「ID」にて、先程設定したときと同じように他サーバへアクセスできる権限を設定します。
次に「セキュリティ」タブで「アクセス許可」「起動とアクティブ化のアクセス許可」というのがあります。
両方共、念の為、IUSRと、先程設定したアカウントを追加して、全てチェックを入れておきます。
※もしかしたら不要な設定もあるかもしれません。


5.レガシ コンポーネントの昇格と実行開始

先程設定したレガシ コンポーネントを右クリック⇒「昇格」を実行します。
すると、レガシ コンポーネントから上の「コンポーネント」へ移動します。
次に、一階層上のアプリケーション名のところを右クリック⇒「開始」を実行します。


6.ASPからDLLの関数呼出し

ASPから、DLLのオブジェクトを生成します。
Set obj = Server.CreateObject(“DLL名.クラス名”)
ここで、オブジェクト生成に失敗する場合は、IUSRの実行権限が付与されていない等の可能性があります。
エラー内容を見て、調べてみてください。

生成後、クラスに実装したPublic Functionを実行してみましょう。例えば下記のような感じですね。
obj.CopyFile “\\ServerA\share\xxxx.txt”, “files\xxxx.txt”
エラー発生時も考慮し、DLL側にエラー内容の設定と取得関数も実装しておくと便利です。


私の場合、一応これでなんとかASPにて、ネットワーク経由で他サーバのファイルアクセスを実行する事が出来ました。

今回、アクセス権限の与え方を何処まで厳しくしても大丈夫か?の検証はしていませんので、もしお試しになられる際は、ご自身の責任の範疇でお願いいたしますm(_ _)m

今回は以上です。


スポンサーリンク

URL :
TRACKBACK URL :

Leave a Reply

*
* (公開されません)

*

*

Return Top