ASP と WSH を使ったイントラネット上でのプリンタ出力

Jeff Sandquist
Microsoft Corporation

March 30, 1999

この記事は、 MSDN Online Voices に掲載されたコラム "Servin' It Up"を転載したものです。

内容の充実を図り装いも新たに登場した" Servin' It Up"にようこそ! 前回予告したように、このコラムでは、Active Server Pages (ASP)テクノロジを取り上げます。Tom Moranは MSDN Online Voices の Web Men Talking コラムの担当に回ったので、私が彼の後任としてこのコラムを引き継ぎます。皆様には、実践に役立つクールなASPソリューションをお届けしていきたいと思っています。では、そろそろ始めましょう!

シナリオ

あなたは、現在、ローカルのイントラネット用にWebベースのアプリケーションを開発しており、このWebアプリケーションからユーザーが印刷する出力を完全に制御したいと考えています(Webアプリケーションの開発者ならだれでもそうですが)。ユーザーに対しては、Webブラウザ上で印刷ボタンをクリックする操作だけができるようにします。サーバーから印刷することはできないかですって? 答えはイエス。ASPから印刷します。

アプリケーション

ここでは、フォームの情報をMicrosoft® Windows® Scripting Host (WSH)に渡し、得られた結果をローカル ネットワーク上のプリンタに出力する再帰的な ASPページを作成します。再帰とは、あるページからそのページ自身を呼び出すために使われる、ASPでは重要なプログラミング技法です。

注意

ASP、Microsoft Windows Scripting Host、および FileSystemObject オブジェクトをサポートするMicrosoft Visual Basic® Scripting Edition (VBScript)バージョンが必要です。Microsoft Windows NT 4.0 Option Pack Non-MSDN Online link をインストールすると、これらのテクノロジもすべてインストールされます。Scripting Enginesの最新バージョンやWSHのインストール方法について詳しくは、Microsoft Scripting Technologies Webサイト Non-MSDN Online linkをご覧ください。

アプリケーションの作成に取り掛かりましょう

ASPPrint.aspという名前のASPファイルを作成します。ページを作成するときは、変数の名前に統一性を持たせるために最初の段階で一定の基準を作成し、これを最後まで守り通すことが大事です。私個人としては、ハンガリー記法が好きです。あなたの12名の仲間にもぜひハンガリー記法の使用をお勧めしてください。我々の読者の1人は、この記法を使用しなかったためにひどい目に遭いました。そして、この記法を使用した別の1人は大金をものにしたのです。

まず、ページ内で使用する値を定義し、フォーム コレクションからSubmitボタンの値を取得します。ここでは、Option Explicit ステートメントを使って、スクリプトにすべての変数を明示的に宣言させている点に注意してください。

                  
<%@ Language=VBScript %>
<%
Option Explicit

Dim strSubmit         'フォームから取得するSubmitボタンの値
Dim strPrinterPath    'フォームから取得するプリンタへのネットワーク パスの値
Dim strUsername       'フォームから取得するユーザー名の値
Dim strPassword       'フォームから取得するパスワードの値
Dim strMessage        'フォームから取得する印刷メッセージの値
Dim objFS             'VBScriptファイル システム オブジェクト
Dim objWSHNet         'Windows Scripting Host Networkオブジェクト
Dim objPrinter        'テキストが送り先となるPrinterオブジェクト

strSubmit = Request.Form("Submit")
%>

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>

このページは、再帰的(あるいは再入可能な)ASPページとなるので、最初に、Submit ボタンの値をチェックして、どのアクションを実行する必要があるか決定します。

                  
<%
'
' フォームから結果を受け取っていない場合は、
' それを表示する
'
If strSubmit = "" Then
%>

フォームの値が空であれば、HTMLフォームが表示されます。このフォームを使って、プリンタへのネットワーク パス、ユーザー名、パスワード、および印刷したいメッセージを取得します。

                  
<FORM action="ASPPrint.asp" method=POST id=form name=form>
   <TABLE WIDTH=100% ALIGN=center BORDER=0 CELLSPACING=1 CELLPADDING=1>
      <TR>
         <TD ALIGN=right NOWRAP>Network Path to the Printer:</TD>
         <TD ALIGN=left NOWRAP><INPUT type="text" id=printerpath name=printerpath 
            value="\\< Domain >\< Printer >"></TD>
      </TR>
      <TR>
         <TD ALIGN=right NOWRAP>Login ID:</TD>
         <TD ALIGN=left NOWRAP><INPUT type="text" id=username name=username 
            value="<% = strUsername %>"></TD>
      </TR>
      <TR>
         <TD ALIGN=right NOWRAP>Password:</TD>
         <TD ALIGN=left NOWRAP><INPUT type="password" id=password 
            name=password></TD>
      </TR>
      <TR>
         <TD ALIGN=right NOWRAP>Message to print:</TD>
         <TD ALIGN=left NOWRAP><TEXTAREA rows=2 cols=20 id=message 
            name=message></TEXTAREA></TD>
      </TR>
      <TR>
         <TD ALIGN=right NOWRAP> </TD>
         <TD ALIGN=left NOWRAP><INPUT type="submit" value="Submit" 
            id=submit name=submit></TD>
      </TR>
   </TABLE>

</FORM>

:   このサンプルは説明の目的でのみ紹介したもので、セキュリティ上問題がありますのでそのまま使用することは避けてください。セキュリティを考えた場合、Windows NTユーザーのアカウント情報を平文のままネットワーク上に流すことは好ましくありません。アカウントを作成し、そのアカウントにネットワーク プリンタの印刷権限を割り当てるのが最も無難です。その後、この情報をASPページでハード コーディングすることができます。どうしてもアカウント情報をネットワーク上で安全に送信する必要がある場合には、Secure Sockets Layer (SSL)コネクションを使用します。

フォームが送信されたとき、次のコードがフォームから値を取得します。

                  
<%
Else
   '
   ' フォームから情報を取得する
   '
   strPrinterPath = Request.Form("printerpath")
   strUsername = Request.Form("username")
   strPassword = Request.Form("password")
   strMessage = Request.Form("message")

これで、VBScript FileSystemObject オブジェクトとWSH Network オブジェクトを使用できるようになりました。Network オブジェクトはプリンタ コネクションをオープンするメソッドを提供し、FileSystemObject は出力をプリンタに送るための機能を受け持ちます。次のコード サンプルで、これらのオブジェクトを作成します。

                  
  '
   ' FileSystemオブジェクトとWindows Scripting Host Networkオブジェクトを
   ' 作成する
   Set objFS = CreateObject("Scripting.FileSystemObject")
   Set objWSHNet = CreateObject("WScript.Network")

AddPrinterConnection メソッドは、strPrinterPathで指定されたリモート プリンタをローカル リソース名に割り当てます。ここでは、LPT1が使用されます。このコネクションは、フォーム コレクションからすでに取得済みの値を使ってポピュレートされます。

                  
   ' Windows Scripting Hostからネットワーク プリンタに接続する
   '
   objWSHNet.AddPrinterConnection "LPT1", strPrinterPath, False, strUsername, strPassword

コネクションを確立したら、FileSystemObject を使ってメッセージをプリンタに送ります。

                  
   '
   ' File System Objectを使って、プリント デバイスをファイルとして開く
   '
   Set objPrinter = objFS.CreateTextFile("LPT1:", True)
   '
   ' File System Objectを使ってテキストをプリント デバイスに送る
   '
   objPrinter.Write(strMessage)

エラー トラップの考え方はいつの場合にも有効です。次のセクションは、プリンタ オブジェクトへのコネクションを切断しているときにエラーへのトラップを行います。プロダクション コードの場合には、この種のエラー処理をページ全体にわたって取り入れる必要があります。

                   
   '
   ' プリント デバイス オブジェクトを閉じ、エラーへのトラップを行う
   '
   On Error Resume Next
   objPrinter.Close
   '
   ' プリンタ コネクションを切断しているときにエラーが起きたら、
   ' 何に異常があったか出力する
   '
   If Err Then
      Response.Write ("Error # " & CStr(Err.Number) & " " & Err.Description)
      Err.Clear    
   Else

うまくいって次のセクションに移ることができれば、操作は正常に行われたことになります。ブラウザには、親しみを込めた確認のメッセージが送られます。

                   
     '
      ' 操作が正常に終了。確認メッセージを出力する
      '
      Response.Write("<CENTER>")
      Response.Write("<TABLE WIDTH=100% ALIGN=center BORDER=0 CELLSPACING=1 CELLPADDING=1>")
      Response.Write("<TR><TD ALIGN=RIGHT><B>Message Sent:</B></TD>")
      Response.Write("<TD ALIGN=LEFT>" & strMessage & "</TD></TR>")
      Response.Write("<TR><TD ALIGN=RIGHT><B>Path to Network Printer:</B></TD>")
      Response.Write("<TD ALIGN=LEFT>" & strPrinterPath & "</TD></TR>")
      Response.Write("<TR><TD ALIGN=RIGHT><B>Login ID:</B></TD>")
      Response.Write("<TD ALIGN=LEFT>" & strUsername & "</TD></TR>")
      Response.Write("</TABLE>")
      Response.Write("</CENTER>")
   End If

最後に、プリンタ コネクションを削除し、オブジェクトを除去します。

                  
  '
   ' プリンタ コネクションを削除する
   '
   objWSHNet.RemovePrinterConnection "LPT1:"
   Set objWSHNet  = Nothing
   Set objFS      = Nothing
   Set objPrinter = Nothing
End If
%>
</BODY>
</HTML>

ASPの強みは、それがオートメーション インターフェイスである点です。このインターフェイスを介してWindows Scripting Hostにアクセスでき、最終的にそのプロパティやメソッドを使ってネットワーク プリンタに接続できます。

Jeff Sandquist は、マイクロソフトデベロッパーサポートの Active Server Pages エスカレーション チームの一員です。