ハマーさん、
こんなかんじ?
<HTML>
<HEAD>
<TITLE>WScript.Shell>>run()の試験</TITLE>
</HEAD>
<SCRIPT LANGUAGE='JavaScript'>
<!--
function doubleQuote(s) {
var q = String.fromCharCode(34);
return q + s + q;
}
function invokeRunMethod(form) {
var aCommandLine =doubleQuote(form.filePath.value);
new ActiveXObject('WScript.Shell').run(aCommandLine);
}
//-->
</SCRIPT>
<BODY>
<FORM>
<INPUT TYPE='text' NAME='filePath' SIZE=80>
<BR>
<INPUT
TYPE='button'
VALUE='パス情報を入力してクリックしてください'
ONCLICK='invokeRunMethod(this.form)'>
</FORM>
</BODY>
</HTML>
AYA さんのサイト, 15. Text が参考になります。
http://member.nifty.ne.jp/aya/js2/js2_frm.htm
何度もすいません。
さすがに日本語がおかしいんで、もう1度質問内容を言います。
JavaScriptで
writeln("<td><a href=\"\" onClick=\"winOpen()\">" + objFai.text + "</a></td>");
といった命令で
function winOpen(){
WSHShell = new ActiveXObject("WScript.Shell")
WSHShell.Run("CMD.EXE "+objFai.text+"")
}
function voi()
{}
を走らせています。この +objFai.text+ の部分に変数を与えてファイル名としたいのです。
これで説明を理解していただけるか不安ですが、
どなたかご指摘お願いします。
何度もすいません。
さすがに日本語がおかしいんで、もう1度質問内容を言います。
JavaScriptで
writeln("<td><a href=\"\" onClick=\"winOpen()\">" + objFai.text + "</a></td>");
といった命令で
function winOpen(){
WSHShell = new ActiveXObject("WScript.Shell")
WSHShell.Run("CMD.EXE "+objFai.text+"")
}
function voi()
{}
を走らせています。この +objFai.text+ の部分に変数を与えてファイル名としたいのです。
これで説明を理解していただけるか不安ですが、
どなたかご指摘お願いします。
超初心者です。
WSHについて勉強し始めたばかりなんですが、質問があります。
JavaScriptでXMLデータを抽出して、コマンドを使用して
アプリケーションの立ち上げとファイル指定を行いたいのですが、
直接WSHShell.Runで指定できるのはわかるんです。
そこにJavaScriptの変数を指定して、ファイル名としたうえで
起動したいのですがやり方がわかりません。
つまりはJavaScriptでアプリケーションの起動とファイル名を変数として読み込む命令がほしいんです。
説明の仕方もよくわからないですが、どなたか教えていただけませんか?
はじめて質問させていただきます。くまりすです。
わたしは、WMIのWin32_PrinterDriverを使用して、プリンタドライバを
インストールしようとしています。
ですが、デジタル署名されていないドライバをインストールすると失敗します。Retの値が0であれば成功なのですが、この場合、マイナスの値が戻されます。
ご存知であれば、
デジタル署名のないプリンタドライバを組み込むにはどうすれば良いか
ご教授いただけないでしょうか。
Dim PrtSet As SWbemObjectSet
Dim Prt As SWbemObject
Dim Locator As SWbemLocator
Dim Service As SWbemServices
Dim Ret As Long
Set Locator = New WbemScripting.SWbemLocator
Set Service = Locator.ConnectServer
Set Prt = Service.Get("Win32_PrinterDriver")
Prt.Name = "Canon LASER SHOT LBP-1810"
Prt.SupportedPlatform = "Windows NT x86"
Prt.Version = "3"
Prt.FilePath = "C:\driver"
Prt.Infname = "C:\driver\W2KXPLS4.INF"
Ret = Prt.AddPrinterDriver(Prt) ←ここで失敗する。
owl さん、
そうですそうです、VBScript も文字列のリテラル表現がダブルクォーテーションを使うので話をややこしくしているのですが、run() メソッドに渡す文字列データそのものを指していました。わたしはですからリテラル表現にはそういう事情を持ち込まないで、そのかわりにエスケープ処理やクォーテーションで囲む関数を用意してそれを呼び出すことで、構文上のバグ発生を最小化しています。
いりや
Services for UNIX 3.5 ホーム
http://www.microsoft.com/japan/windows/sfu/
こんなのが出てます。
MS製cygwinと考えるといいんでしょうか。
Perlとかも入ってます。
フリーソフトですが、ダウンロードには.NET Passportと登録が必要です。
すみません。
やっと解りました。
sh.Run """C:\Documents and Settings\owl\デスクトップ\Sample2.vbs"""
いりやさん、
ご指摘ありがとうございます。
すみません、ダブルクォーテーションの入れ方がどうしても解りません。
以下のコードをどのように直せば良いのかご教示頂けないでしょうか?
sh.Run "C:\Documents and Settings\owl\デスクトップ\Sample2.vbs"
つちや さん、
回答ありがとうございます。
| ■PowerPointのデータを抽出
| ...配列は通常0から始まるので、
| For ii = 1 to count
| って、
| For ii = 0 to count-1
| とすべきなように思えるのですが、...
ええ、私も最初はそう思ったのですが、
For ii = 1 to count とすると
指定したコレクションに対するインデックスが境界を越えています。
というエラーが返ってきます。
For ii=1 to count+1とすると、iiがcount+1になると、同様なエラーが発生します。
どうも、PowerPointでは、For ii = 1 to count とするのが正しいようです。
| もしも、テキストの抽出だけであれば、
でも、図形のデータの抽出を行いたいので...
今後ともよろしくお願いします。
owl さん、
> 余談ですが、WScript.ShellのRunメソッドはショートネームじゃないと
> ダメなんですね。
いえ、ロングネームでも大丈夫です。
ではなぜ owl さんの例で失敗するか、それは Windows Shell が引数のパース処理に失敗しているからです。
パース処理において引数の区切り子 (Separator) の存在はご存知だと思います。今回のケースは区切り子を含む引数を Windows Shell に与えるにはどうしたらよいか? に該当します。こうした場合は区切り子をエスケープする指示を与えてやらねばなりません。今回の場合は引数の両端をダブルクォーテーションで括ってやりさえすればうまくいくでしょう。
一般的なエスケープのやるやり方については msdn を照会いただくとよいです。
To いりやさん、
Cc つちやさん、
とても親切な回答ありがとうございます。
Webに関して知識が乏しいため、wsfの意味が解っていませんでした。
> owl さんの投函を拝見すると、同一のプログラム言語で再利用性の
> 高いものをまとめて別ファイルに外だしすることを狙っているよう
> に見受けられました。実行時に動的に読み込むファイルがかわるケー
> スというのは少ないのではないでしょうか。であれば (a) が適当
> かとおもいます。
ご明察の通りです。
(a)の方法で、以下のようにSample1.vbs → Sample1.wsfとする
とうまくいきました。
ありがとうございました。
関数SampleをCallしてもDim args以下も実行されしまうんですね。
「インデックスが有効範囲にありません。」と怒られてしまいました。
*** Sample1.wsf ***************************
<job id="Sample1">
<script language="VBScript" src="Sample2.vbs">
Call Sample("外部引数")
</script>
</job>
*******************************************
> *** Sample2.vbs ***************************
> Dim args
> Set args = WScript.Arguments
> (以下、省略)
>
> Sub Sample(arg)
> MsgBox arg
> End Sub
> *******************************************
余談ですが、WScript.ShellのRunメソッドはショートネームじゃないと
ダメなんですね。
sh.Run "C:\Documents and Settings\owl\デスクトップ\Sample2.vbs"
↓
sh.Run "C:\Docume~1\owl\デスクトップ\Sample2.vbs"
owl さん、つちやさん、
| もっとダイレクトに呼び出す事はできないものでしょうか?
整理しながらちょっと考えてみましょう。
別ファイルに書かれているものを、誰が取り込んでどう実行させる
か、という点でいくつか方式が考えられます。
AYA さんの解説は、(a-1) で、つちやさんの例は (b-1), (b-2) 、
owl さんの例は (c-1) に対応します。
「ダイレクトに」という言葉のニュアンスをきちんと理解している
か不安ですが、「あたかも同ファイルに書き込まれているが如く呼
び出したい」、というお話であれば (a-1) を方式として採用すれ
ばよいとおもいます。ただ (a) には制限があります。
(a) は、Windows Script Host をスクリプトホストとして使えない
場合には適用できません。また (a) において、ファイル名は .wsf
ファイルに静的に記述します。これは実行時に変更できないことを
意味します。実行時にファイル名を変更してそのファイルを読み込
みたい、のであれば (b-1) の採用を検討すればよいでしょう。
(b-2) は、Component Object Model ですから、切り口をもつ任意
のプログラム言語から使用できます。例えば前回の投函で紹介した
UWSC はそういうプログラム言語の一つです。そのように使われる
ことを狙っているのであれば (b-2) を採用すればよいでしょう。
owl さんの投函を拝見すると、同一のプログラム言語で再利用性の
高いものをまとめて別ファイルに外だしすることを狙っているよう
に見受けられました。実行時に動的に読み込むファイルがかわるケー
スというのは少ないのではないでしょうか。であれば (a) が適当
かとおもいます。
(a) スクリプトホストが取り込むことに責任をもつ
(a-1) Windows Script Host (wscript.exe/cscript.exe) の .wsf
ファイルの「インクルードステートメント」機能を利用する
関数の読み出し方は通常と全くかわらず、あたかも同ファイ
ルに書き込まれているが如く呼び出す。
[ 参考 ]
msdn, Windows スクリプト ファイル (.wsf) を使用する
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/wsAdvantagesOfWs.asp
(b) プログラムが取り込むことに責任をもつ
(b-1) 文字列データをプログラムと見なして実行させる
ファイルの内容をすべて読み出して、
VBScript の execute() 関数
JScript の eval() 関数
などを利用して文字列データをあたかもプログラムと見做し
て実行させる。
(b-2) Component Object Model の切り口を利用
Windows Script Component を VBScript/JScript 言語など
で作成して、
VBScript の CREATEOBJECT() 関数
JScript の new ActiveXObject() 関数
などを利用して当該オブジェクトのメソッド呼び出しとして
実行させる。
[ 参考 ]
msdn, スクリプト コンポーネント チュートリアル
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/lettitle.asp
(b-3) スクリプト・コントロール (つちやさんご紹介)
・・・よく知りません (^^; ・・・
(c) 取り込むかわりにプログラムを別プロセスとして実行
(c-1) プログラムの引数を関数の引数にみたてて実行させる
WScript.Shell>>run()、WScript.Shell>>exec() メソッドな
どで VBScript/JScript のプログラムを別プロセスとして実
行させる。その際にコマンドラインの引数を設定する。呼び
出すプログラム側において、引数を受け取って関数の引数に
渡して実行させる。
まつださん、
| Windows2000系PCに管理者権限でインストールする必要が出てきたのですが
| 対象が数百台となっているため、自動でインストールする方法を探しています。
ウィンドウズの操作を自動化するためのソフトウェアをソフトウェ
ア製品と一緒にバンドルして、インストール及びカスタマイズ操作
を利用者のかわりにさせることを検討されている方がいらっしゃい
ました。UWSC という自動化ソフトウェアの掲示板においてお見受
けしました。
よろしければご検討ください。
http://www002.upp.so-net.ne.jp/umiumi/
KTS さん、
> VBもVBSも超超初心者なのですが、仕事で、設定ファイルを書き換えるウィザード(?)を作るように言われました。
つちやさんがすでにコメントなさっているのですが私からも一つコ
メント差し上げます。
その課題を仕事で与えられた方が、あなたにどんなことを考えなが
ら与えられたのか、ほんのちょっぴりでもよいので考えてみてくだ
さい。
実務で余裕がなかなか生まれず考えることが時間的にも精神的にも
困難な状況におかれているかもしれません。でもぜひ。
このような掲示板では、そこまで相手の方にたずねることはまれで
尋ねられたことにすぐ応えることの多い私ですが、KTS さんは仕事
でということを正直にことわってお話されています。そういうこと
であれば KTS さんの指示者の方のおもいも踏まえてお話した方が
ベターであるとかんがえ、このような形でお返事さしあげました。
いりや
余談
INI の取り扱いに関するお問い合わせは、わたしがこちらの掲示板
におじゃまさせていただいてから3度目です。INI を扱う需要って
多いのかな・・・。
いりやさん、
回答ありがとうございます。
VBScriptとしか書かなかったのがいけなかったのかも知れませんが、*.htmでは
なく、*.vbsのコードをご教示頂けないでしょうか?
自分なりに調べた結果、以下のように外部引数を使って別ファイルの関数を実行
する事はできるのですが・・・。
もっとダイレクトに呼び出す事はできないものでしょうか?
*** Sample1.vbs ***************************
Dim sh
Set sh = CreateObject("WScript.Shell")
sh.Run "c:\Sample2.vbs 1 外部引数"
*******************************************
*** Sample2.vbs ***************************
Dim args
Set args = WScript.Arguments
Select Case args.Item(0)
Case 1
Call Sample(args.Item(1))
Case Else
End Select
Set args = Nothing
Sub Sample(arg)
MsgBox arg
End Sub
*******************************************
■インクルード
EvalでなくてExecuteでしたね。バージョンはわかりませんが、
Msg = "あいうえお!"
Msg2 = "かきくけこ!"
Execute "MsgBox Msg:MsgBox Msg2"
Execute "MsgBox Msg" & vbNewLine & "MsgBox Msg2"
とできるので、ひょっとしたら他のファイルの内容をよみとって、そのまま実行することも可能かも。
■別ファイルのインクルード
VBS本体では、別のVBSファイルにある関数を呼び出すことができないので、いりやさんのご指摘の通りWSFファイルにしてインクルードするしかないですね。
あとは、過去ログにあったと思うのですが、WSCコンポーネントにする方法とかScriptControlを使う方法が考えられます。
FileSystemObjectで内容を読み取ってEvalで実行してしまうなんてことも内容によってはできるかも。
(ヒントだけですみませんが)
■ADODB.Stream & Microsoft.XMLHTTP
とあるページからリンクされているファイルをまとめてダウンロードする時とか重宝しますよね。おかげでダウンロードソフトなしで済ませています。
ただ、テキストファイルの処理の場合は、FileSystemObjectを使った方がずっと処理が速い気もしますが。。
■管理者権限でのインストール
昔WMIを使って管理者権限でソフトを実行するサンプルを見たことがありますが、その時はうまく動かなかったので、そのまま忘れてしまいました。
基本的にはWMIを使うことになると思うのですが、これ以上は詳しい人にバトンターッチ。
■INIファイルの読み書き
冷たい言い方ですが、超超初心者を名乗られるからには、設定ファイルやレジストリには手を出されない方がいいと思います。
本当は初心者を名乗られる方にはレスするのはやめようと心に決めていたのですが(初心者と名乗ることは決して皆にやさしくしてもらえる特許状になるわけではなく、逆ではないかと思えます。また、仮にもシステムの一部でも任されているのであれば、自分でとことん調べてテストしてその結果を問い掛けるべきであって、初心者の名のもとに質問丸投げするべきではないと思うです。)、
http://www.serialscripter.com/scripts/class_ini.html
に、INIファイルを使うクラスがあって、サンプルまでついて結構いけると思います。
■PowerPointのデータを抽出
PowerPointはもってはいますが、今後インストールする予定(といおうか度胸といおうか)はないのでお役に立てませんが、配列は通常0から始まるので、
For ii = 1 to count
って、
For ii = 0 to count-1
とすべきなように思えるのですが、違ってたらスルーして下さい。
もしも、テキストの抽出だけであれば、
http://www31.ocn.ne.jp/~h_ishida/xdoc2txt.html
にあるxdoc2txt.exeがバイナリを直接読み取っていて速いかも。(どれだけ実用的かはテストしていませんが、、、)
初めまして。
PowerPointのデータを抽出するために、添付したスクリプトを開発しています。
PowerPointで作成中の "RECT","OVAL","LINE"等のデータをデスクトップの"test.txt"に
書き出すことはできるのですが、"FreeForm"のデータを抽出することができません。
msgboxでNode.Pointsをみると、"Single()"と表示され、配列であると分かりましたので
さらに、Node.Points(1)を見ようとすると
オブジェクトがコレクションではありません。:'Points'
というエラーが帰ってきます。
どなたか、回避策のヒントをご存じでしたら教えていただけませんか。
------getShape.vbs------
Dim ppObj,fp
DoInit
For Each shape In ppObj.ActiveWindow.View.Slide.Shapes
DoShape shape
Next
DoEnd
'******
Sub DoShape(sh)
Select Case sh.Type
Case 1 'AutoShape
With sh
Select Case sh.autoshapetype
Case 1
fp.WriteLine "RECT " & .left & " " & .top & " " & .width & " " & .height
Case 9
fp.WriteLine "OVAL " & .left & " " & .top & " " & .width & " " & .height
End Select
End With
Case 5 'FreeForm
count = sh.Nodes.count
For ii = 1 to count
Set Node = sh.Nodes.Item(ii)
msgbox TypeName(Node)
msgbox TypeName(Node.Points)
msgbox Node.Points(1)
Next
Case 9 'Line
with sh
fp.WriteLine "Line " & .left & " " & .top & " " & .left+.width & " " & .top+.height
End with
End Select
End Sub
'******
Sub DoInit()
Set Shell = CreateObject("WScript.Shell")
fileSpec = Shell.SpecialFolders("Desktop") & "\test.txt"
'
set fso = CreateObject("Scripting.FileSystemObject")
set fp = fso.CreateTextFile(filespec,2)
'open PowerPoint
Set ppObj = WScript.CreateObject("PowerPoint.Application")
ppObj.Visible = True
End Sub
'******
Sub DoEnd()
Set ppObj = Nothing
fp.Close
End Sub
------getShape.vbs------
はじめまして m(__)m
VBもVBSも超超初心者なのですが、仕事で、設定ファイルを書き換えるウィザード(?)を作るように言われました。
やりたい事は
「指定されたINIファイルの指定されたセクションにある、指定されたキーに関連づけられている文字列を書き換える」
です。
こちらのHPの「Lesson15 テキストファイルを読み書きする」で、
検索結果を別ファイルに書き出していますが、
これがInputBoxか何か出して、そこに書かれた値で置換出来たらな〜と思って質問させて頂きました。
ランタイム等のインストールができないので(お客様の環境なので)、
バッチファイルかVBSでやるしかないかな〜と思っています。
超超初心者で、ホントに簡単なスクリプトしか書いた事がないので、
そんなレベル (^_^;でも分るよう教えて頂けたらうれしいです。。。
よろしくお願いします!!
つちや さん、
魔界の仮面弁士 さん、
いりや さん、
ご指導ありがとうございます。
今日は終日レビューがあってマシンをいじれませんでした。
週明けになるかも知れませんが頂いたサンプルをベースにいろいろ試してみます。
ありがとうございました。
owl さん、
http://member.nifty.ne.jp/aya/wsh/wsh203.htm
AYA さんの解説ですが、こちらにヒントが隠されています。
VBScript初心者です。
あるvbsファイルに書かれたコードから別のvbsファイルに書かれている
関数をCallする事は可能でしょうか?
宜しくお願い致します。
魔界の仮面弁士さん、
解説ならびにポインタ情報をご紹介いただきありがとうございます!
さっそく調べてみよう。。
初めて書き込みます。よろしくお願いします。
Windows2000系PCに管理者権限でインストールする必要が出てきたのですが
対象が数百台となっているため、自動でインストールする方法を探しています。
(PC配布済みのため各ユーザー(素人)に実施してもらいたい)
runasでとも考えたのですが、管理者パスワードは周知したくありません。
runas+sendkeys等で可能かな?とは思っているのですが、
何か他に良い方法はないでしょうか?
runas+sendkeysではユーザーがキーボード・マウス操作をしてしまうと
暴走してしまう恐れがあるので、キーボード・マウス操作を不可にする
方法も教えていただけないでしょうか?
(仮に操作を不可にしてsendkeysは有効なのでしょうか?)
以上、長くなってしまいましたが
別アカウントで実行する良い方法がありましたら
お願いします。
≫ うまうま さん
> Windows2003サーバでは、WSH使えますか?
使えますよ。
≫ いりやさん
> バイナリファイルを操作するための切り口を提供するものとして
> ADODB.Stream
ActiveX Data Object と呼ばれるライブラリ(通称:ADO)の、
Version 2.5 以上に含まれるオブジェクトです。
Streamオブジェクトでは、任意の文字コードのテキストデータを扱うことができます。
また、今回のように Type プロパティを切り替える事で、バイナリデータも扱えます。
ADOは、MDAC(Microsoft Data Access Components)と呼ばれるモジュールに
同梱されています。詳細は下記を参照してみてください。
[Microsoft Universal Data Access Japan]
http://www.microsoft.com/japan/msdn/data/default.asp
# 左端にある「UDA関連ダウンロード」の欄から、ヘルプファイル(MDAC 2.6 SDK)を
# 入手することができます。(2.7以上に関しては、MSDN Library にて提供されています)
> HTTP メッセージの処理機構として、
> Microsoft.XMLHTTP
> Msxml2.ServerXMLHTTP
> Msxml2.ServerXMLHTTP.3.0
> Msxml2.ServerXMLHTTP.4.0
(Server)XMLHTTPとは、Microsoft XML Core Services(あるいはMicrosoft XML Parser)と
呼ばれるライブラリ(通称:MSXML)に含まれるオブジェクトです。
# MSXML4、MSXML3、MSXML2.6、MSXML2.0、MSXML などのバージョンがありますが、
# 基本的な使い方は、どれも一緒です。
通信に必要な手順としては、
1. openメソッドで、「方法(GET/POST)」「接続先URL」「非同期/同期」「ユーザ」「パスワード」を指定。
2. 必要であれば、setRequestHeaderで、任意のHTTPリクエストヘッダを指定。
3. sendメソッドでリクエスト送信。(この際、リクエストボディとなるデータを指定可能)
これだけです。あとは、プロパティ/メソッドを使って、HTTPレスポンスを受け取れます。
・getAllResponseHeaders : レスポンスヘッダの全文を返す
・getResponseHeader : 特定のレスポンスヘッダを返す
・responseBody : レスポンスボディをByte配列で返す
・responseText : レスポンスボディを文字列で返す
・responseStream : レスポンスボディをIStreamインターフェイスで返す
・responseXML : レスポンスボディをXMLDocumentとして返す
・status : 状態コード(404とか)を表す整数を返す
・statusText : 状態テキスト(Not Foundとか)を返す
なお、ServerXMLHTTP は、サーバサイドでの利用に適した作りになっており、
XMLHTTPの機能に加え、通信時のタイムアウト時間の指定なども行えるようになっています。
こちらの概要については、下記URLを御覧下さい。
ヘルプファイル(MSXML SDK)の入手先も書かれています。
[ServerXMLHTTP に関してよく寄せられる質問 (FAQ)]
http://support.microsoft.com/?id=290761
激初心者から質問させていただきます。
Windows2003サーバでは、WSH使えますか?
魔界の仮面弁士さん、つちやさん、
お二人のスクリプトの中で、
バイナリファイルを操作するための切り口を提供するものとして
ADODB.Stream
HTTP メッセージの処理機構として、
Microsoft.XMLHTTP
Msxml2.ServerXMLHTTP
Msxml2.ServerXMLHTTP.3.0
Msxml2.ServerXMLHTTP.4.0
の COM オブジェクトを使っていらっしゃいますが、こちらについ
てどこかによい解説ってありますでしょうか。
いぜん msdn を散策したのですがちょっと見つからず、例題スクリ
プトはググってみれば豊富にあるのですが、仕様の全容がわからな
いのでいまだ何者かよくわかっていません・・・。
さとるさん、つちやさん、魔界の仮面弁士さん、
いりやです。
シーケンス図を描くとこんな感じかな?
クライアント A B
| | |
| GET /x.asp | |
|−−−−−−→| |
↑| | |
|| | 照会(PATH) |
|| |−−−−−−→|
|| | 応答(URL) |
T| |←−−−−−−|
|| ↑ | |
|| t応答準備 |
|| ↓ | |
↓| RESPONSE | |
|←−−−−−−| |
| | |
※ 応答準備が、さとるさんの (5) の解説に対応しています。
そうすると、Aは該当ファイルにAのファイルシステムを使ってアクセス可能ですね。
HTTP でわざわざ URL 指定でとることなく。そうするとあとはA上で動作する IIS から
どうやって width/height を得るか。これまでの案を整理すると、
・VBScript (on IIS) の loadPicture() 関数を利用する(つちやさん)
・Component Object Model を利用する
Doodle2.MyCanvas を利用する(つちやさん)
width/height 属性を利用する
ServerXMLHTTP を利用する(魔界の仮面弁士さん)
JPEG 画像フォーマットから width/height 情報を引き出す
InternetExplorer を利用する(いりや)
Dynamic HTML Object Model ツリーの IMG 要素の width/height 属性を利用する
それぞれ特徴があります。IIS プロセスの実行ユーザにしかるべき権限を与えた上でファ
イルシステムへのアクセスを IIS プロセスに許容するのであれば、loadPicture() でしょ
うか。でも IIS プロセスが乗っ取られたリスクがゼロではないのであればその他の方式
を採用すればよいのではないでしょうか。
方式についてはつちやさんと魔界の仮面弁士さんがすでにご説明いただいているので私
からは別の観点でコメントします。一部魔界の仮面弁士さんと重複しています。
★☆
(1) x.asp のアクセス頻度は高いか
(2) x.asp の応答作成時に width/height を毎回読み出す必然があるか?
まず (1) が重要です。もし1時間に1回しかクライアントから問い合わせが来ないので
あればこのインプリメントで問題ないと思いますが、数秒に 1 回あるいはそれ以上の頻
度で来るのであれば、x.asp の負荷を軽くできないか検討する余地がありそうです。
というのは、現在のインプリメントでは応答準備において毎回画像ファイルをメモリに
読み出して width/height を得ていまるからです。また (ロードのために) 一時的に使
用されたメモリ領域の量もそうだし、それらのガベジコレクション処理の費用も無視で
きなくなるのではないでしょうか。
それで (2) に移るわけですが、画像ファイルの width/height が変更するタイミングと
いうものが、AにファイルをアップロードしBの DB に URL を登録・更新するタイミン
グ以外にないのであれば、魔界の仮面弁士さんが指摘されたとおり、そのタイミングに
width/height を計算して DB に登録・更新しておけば、応答準備は単純に DB への問い
合わせるだけになります。処理時間tの短縮化に寄与するでしょう。画像ファイルのアッ
プロード運用時のツールを修正してやることになります。
「それが、実はもう DB の対象テーブルのスキーマを変更できない状況だ」ということ
であれば、一度計算した width/height をキャッシュするアイディアを適用することで
再計算の削減の可能性は残っています。
たとえば、 IIS スタートアップ時に画像ファイルと width/height の辞書 (キャッシュ
に相当) をあらかじめ作っておいて、応答準備では辞書を読むようにする。もう一つは
応答準備で辞書を問い合わせて辞書に載っていなければ計算して辞書に登録しておく、
載っていればそれを読む。
どちらも一回は計算するのですが、それをどの時期に実施しておけばシステム全体でう
れしいか、という基準で方式を選択します。
もっとも、辞書への問い合わせ及び辞書の作成のための費用が、実はもともとのインプ
リメントよりも高かった、という落ちはあります。そこは比較しなくてはなりません。
また画像ファイルが置き換わるタイミングで辞書 (or キャッシュ) をクリアする処理を
組み込まねばなりません。アップロード運用時のツールにおいて辞書 (or キャッシュ)
のクリアを IIS に指示する機能を作りこみます。IIS においてその指示を受けて辞書
(or キャッシュ) をクリアする部分をつくりこみます。
余談ですが、キャッシュのアイディアを適用する対象は width/height だけでなく URL
も可能かもしれません。
★☆
(1) のアクセス頻度が高いのであれば、HTTP セッションを受け持つ IIS プロセス (あ
るいはスレッド?) の単位時間あたりの数が増えるでしょう。応答時間Tを小さくするた
めに、「そのときに計算する必要がないものはなるべく外だしにしておく」方針をたて
ておくのは悪くないと思います。
> ・画像がJpeg固定のようなので、SOFxマーカを読みこませてみる、というのは?
Jpegのバイナリから、直接サイズを読んでみました。
参考にしたのは、このあたり。
http://www.siisise.net/jpeg.html
http://funada11.denshi.numazu-ct.ac.jp/ichikawa/gazo/graphicfile/format/jpeg/jpeg2.html
==== test.asp ====
<%@Language="VBScript"%><%Option Explicit
Dim URL, List
List = Array( _
"http://iriyak.adam.ne.jp/pic/mac.jpg", _
"http://www.microsoft.com/homepage/images/2004/ts_jan21_productivity.jpg", _
"http://www.digitalpad.co.jp/~takechin/pictures/otake16.jpg")
Dim X
Response.Write "<ul>"
For Each URL In List
X = GetJpegSize(URL)
If IsEmpty(X) Then
Response.Write "<li>(不明)="
Else
Response.Write "<li>(" & CStr(X(0)) & "," & CStr(X(1)) & ")="
End If
Response.Write URL & "</li>"
Response.Flush
Next
Response.Write "</ul>"
'正常時は、(横幅, 縦幅) な 1次元配列を返す。
'読取エラー時は Empty を返す。
Public Function GetJpegSize(ByVal URL)
Const adTypeBinary = 1
On Error Resume Next
GetJpegSize = Empty
Dim Stm
Set Stm = Server.CreateObject("ADODB.Stream")
Stm.Open
Stm.Type = adTypeBinary
'ServerXMLHTTPオブジェクトを生成
Dim Req
Set Req = Nothing
Set Req = Server.CreateObject("Msxml2.ServerXMLHTTP.4.0")
If Req Is Nothing Then
'MSXML4が無い時は、MSXML3で代用
Set Req = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
End If
If Req Is Nothing Then
'MSXML3すら無い時
Set Req = Server.CreateObject("Msxml2.ServerXMLHTTP")
End If
If Req Is Nothing Then
'それも無ければ、初期バージョンのMSXMLで
Set Req = Server.CreateObject("Microsoft.XMLHTTP")
End If
'読み取った画像をストリームに格納
Req.open "GET", URL, False
Req.send
Stm.Write Req.responseBody
Set Req = Nothing
Stm.Flush
Stm.Position = 0
'先頭2バイトが FFD8 で始まっているかを確認する
Dim B
B = Stm.Read(2)
'SOIマーカが見つかった場合のみ処理する
If AscW(B) = &HD8FF Then
B = Stm.Read()
Dim Pos
'SOF2マーカ: プログレッシブDCT、ハフマン
Pos = InStrB(1, B, ChrW(&HC2FF))
If Pos = 0 Then
'SOF1マーカ: 拡張シーケンシャルDCT、ハフマン
Pos = InStrB(1, B, ChrW(&HC1FF))
End If
If Pos = 0 Then
'SOF0マーカ: ベースラインDCT、ハフマン
Pos = InStrB(1, B, ChrW(&HC0FF))
End If
If Pos > 0 Then
Dim H, W
'マーカの後ろにあるサイズ情報を取得
'マーカ(2バイト)、マーカサイズ(2バイト)、縦幅(2バイト)、横幅(2バイト)
H = MidB(B, Pos + 5, 2)
W = MidB(B, Pos + 7, 2)
GetJpegSize = Array(LE(W), LE(H))
End If
End If
Stm.Close
Set Stm = Nothing
End Function
Public Function LE(ByVal UINT16)
Dim S
S = Right("0000" & Hex(AscW(UINT16)), 4)
LE = CLng("&H" & Right(S, 2) & Left(S, 2))
End Function
%>
・サーバBのDB上に、URLと共に、予めサイズも格納させておく事はできませんか?
・サイズを取得する部分だけをASP.NETにして、System.Drawing.Imageクラスにて
「指定した画像のサイズを返すページを用意する」というのは駄目ですか?
・画像がJpeg固定のようなので、SOFxマーカを読みこませてみる、というのは?
■画像サイズの取得(ASP)
ここ数年ASPにさわったことがないのですが、
<%
URL = "http://server/image.jpg" 'ダウンロード元
Set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "GET", URL, False
objHTTP.Send
Set d = Server.CreateObject("Doodle2.MyCanvas")
ret = d.LoadFromStream(objHTTP.responseBody)
If ret=0 Then
Responce.Write "幅=" & d.Width & "<BR>高さ=" & d.Height
Else
Responce.Write "画像サイズの取得に失敗しました"
End If
Set d = Nothing
Set objHTTP = Nothing
%>
こんな感じになるのでしょうか。(確認なし・保証なし)
DoodleをASPで使う場合の注意点として、
アクセスが集中した場合、サーバーリソースを大量に消費する恐れがある。
ApplicationやSessionスコープでは使用できない。
などがありますが、詳しくはReadMe(Doodle2.txt)をご覧いただければ。
■暗号化・復号化COM
をつくってしまいました。(誰かに話したかったもので、、、すみません)
2の19937乗-1の周期を持つ擬似乱数生成アルゴリズムMersenne Twisterに、
160ビットのSeedを与えて擬似乱数を生成し、これをxorで暗号化・復号化するストリーム暗号です。
別につくった128ビットの乱数列を暗号文のなかに含ませ、これもSeedに追加して、
同じパスワードでも、生成するごとに違う暗号文ができあがります。
ファイルに書き込むときに、Bitmapのヘッダをつけて、暗号化した中身を画像として確認することもできます。
できた暗号文の文字の頻度はほぼ均一になりますので、どれも似たような均一の画像になります。
WSHで、フォルダ内のファイルを暗号化するスクリプトを作って試してみましたが、
5.5GB(52561ファイル)でおおよそ51分でした。(1分あたり約100MB)
これで、お父さんも、家族に見られたくない画像ファイルを堂々とハードディスクに置けるかも。
(もちろんこれが目的で作ってたわけではありませんが、、、)
で、公開の最大の妨げは何か。
もちろんヘルプ(または解説)の作成なのでした。
(おかげで、クリップボード関連・ダイアログ関連・PDFやWordからテキストを抽出・StringListのラッパー・圧縮解凍など、
結構いろいろ作ってみたのだけれど、眠っているのがいっぱい。。。)
いりやさん、ご指導ありがとうございます。
自分の頭の中に「やりたいこと」はあるんですが、業務上のこともあって要件に落とし込む必要があるのですが、そこができてなかったようです。
若干冗長ですが整理してみます。
(1) サーバAにjpegファイルがあります。
(2) そのファイルの場所はサーバBにあるDBにURLで格納されています。
(3) サーバAにaspファイルを置きます。
(4) クライアントから(3)のaspを呼び出します。
(5) (3)のaspは、以下の動作をします。
a)サーバBのDBからjpegファイルのURLを取り込みます。
b)IMGタグを生成し、SRCフィールドにURLを格納します。
c)IMGタグのHEIGHTとWIDTHフィールドにjpegファイルのサイズを
明記します。
(6) クライアントにイメージが表示されます。
IMGタグにWIDTHやHEIGHTを指定しなければ原寸で表示できるのは承知していますが、諸般の事情でどうしてもWIDTHやHEIGHTを明示指定する必要があるのです。
指定サイズで表示することでなく「IMGタグ内に値を入れる」ことが重要なので、クライアントサイドで動作させるわけには行きません。
こういった状況なのですが、いい手段ありそうでしょうか?
さとるさん、
> まだ自分で穴開け(とりあえず動作するもの)が作れてないので技術不足を感じて歯がゆいです。
こういう時は要件を整理すると加速します。最初にお話いただいたときに確
認するべきだったかもしれません。
(1) 画像ファイルの幅 (width) と高さ (height) を得て、width, height の
情報を使ってある処理を行いたい。
(2) (1) のある処理はどこのマシン資源を使って行いたい
マシン資源:
(a) サーバ PC 上
(b) クライアント PC 上
(3) 画像ファイルはどういう形態で誰が誰に渡すのか
形態:
(a) インターネット上に公開されているファイル (URL) を指
定して
(b) クライアント PC 上のローカルファイル (パス情報) を
指定して
(c) サーバ PC 上のローカルファイル (パス情報) を指定し
て
誰が:
(a) クライアント PC が
(b) サーバ PC が
(c) 第三者のサーバが
誰に:
(a) サーバ PC に
(b) クライアント PC に
こんな感じでしょうか。これが分かれば (1) の実現方式として何を選べばよ
いのか、ということもクリアになってくるのではないでしょうか。
わたしの例は、
(2) マシン資源 → (a)
(3) 形態 → (a)
誰が → (c)
誰に → (a)
という前提を仮において (1) の実現方式として COM Object の
(InternetExplorer.Application) を利用するというものです。実行環境とし
て IIS がなかったので WSH/JScript で使用してご説明しました。ですので
IIS に切り替えるときは JScript から VBScript に移植する、visible 属性
を true にしない、WScript ホスト変数は使わないよう微調整がたぶん必要
と思われます。。。
今回のさとるさんの場合は上記のどれに該当するのでしょうか。
すいませんが件数増えてしまいそうですので一緒にコメントさせて頂きます。
つちや さん
最初にコメント頂いたのに返答遅くなり申し訳ありません。
Doodleは結構有名なんですね。
ちょっとまだ環境構築できてないんですが、aspで使う場合に注意が必要という言葉が引っかかります。
サンプルもMsgBoxとか使われているのでローカル用かと思ってるのですが、aspでも使えるものでしょうか?
いりや さん
サンプルありがとうございます。
ご教授頂いたスクリプトですが、これはローカルに置くWSHで他のサーバにあるイメージの情報を取得するサンプルと思いますがあってますか?
実はサーバに乗っからないかとaspにしてみたのですがうまく動かせていません。
魔界の仮面弁士 さん
いろいろありがとうございます。
サーバ側で何かするというのはなかなか難しいようですね。
あ、スペルミスのご指摘までありがとうございました。
(その行まで進めてなくて気づきませんでした)
Admin権限だと実行できるということで、どこが引っかかるのかがポイントですが、調べるのは難しそうですね。危険な構成の実験までして頂きありがとうございました。
皆さんのおかげでいろいろ手がありそうだとわかりつつ、まだ自分で穴開け(とりあえず動作するもの)が作れてないので技術不足を感じて歯がゆいです。
頂いたポイントをもう少し調べてみます。
皆様親切なコメントありがとうございました。
解決まではまだかかりそうですので、まずは糸口を頂いたお礼まで。
追進:
何か私が勘違いしてるところとかあればご指導頂ければ幸いです。
■画像サイズの取得
LoadPictureって、そのままではいま一つだったかな。
では、たとえばSIGNAL9さんのDoodleを使ってみるのはどうでしょう。
http://www.vector.co.jp/soft/winnt/prog/se219120.html
(ただしASPで使う場合は注意が必要ですが)
これとXMLHTTPを併用したWSH用スクリプトです。
'========================================================
URL = "http://server/image.jpg" 'ダウンロード元
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "GET", URL, False
objHTTP.Send
Set d = CreateObject("Doodle2.MyCanvas")
ret = d.LoadFromStream(objHTTP.responseBody)
If ret=0 Then
MsgBox d.Width & vbNewLine & d.Height
Else
MsgBox "画像サイズの取得に失敗しました"
End If
Set d = Nothing
Set objHTTP = Nothing
'========================================================
こういう方法を使わないとすると、あとは いりやさんの方法くらいしか思いつかないですね。。
LoadPictureって、ver 2.0の頃からサポートされていたんですね。φ(.. )
ただ、Visual Basicの同名関数とは、動作が若干異なるみたいですけれども。
> 09 Call Responce.Write("x=" & x & "y=" & y & "<BR>")
あ。スペルミスですね。(^^;)
> Microsoft VBScript 実行時エラー(0x800A0046)
ASP上でMsgBox関数を使った場合なども、同様の結果になりますね。
このエラーコードが示す意味は、「Permission denied」です。
IISの実行ユーザ(既定の設定だと IUSR_ComputerName ですね)に対して、
必要なセキュリティ許可が設定されていない、という事を意味します。
とりあえず、権限設定をAdministratosグループに変更したら(危!)、
当方IIS5.1環境でも LoadPicture が動作しましたが、
標準設定のままで使えないという事は、何か理由があるのかも。
# スレッドセーフじゃなかったりして。。。
> 他サイトから持ってくることについても、ググッて出てくるのは
> Inetを使えるという解ですが、こちらもサーバサイドでサーバの
Inetとは何でしょうか。VB6付属のInetコントロールの事でしょうか?
> サーバのディスクにダウンロードなんて話はセキュリティ上危険そうで
OleLoadFromStream APIを使うようなコンポーネントを作成すれば、メモリストリームから
直接、Pictureオブジェクトを作成することができますけれども、そこまでいくと、
この掲示板の範疇を超えてしまいますね…。
魔界の仮面弁士 さん、早速のフォローありがとうございます。
unibonさんのサイトは一応見ていました。というか、これだけが頼りでした。
以下のようなサンプルを作って(いや全くそのままです)試していたのですが...
------test.asp------
01 <%@Language="VBScript" %>
02 <HTML>
03 <%
04 Dim x
05 Dim y
06
07 Call GetImageSize("C:\inetpub\wwwroot\win2000.gif",x,y)
08
09 Call Responce.Write("x=" & x & "y=" & y & "<BR>")
10
11
12 Sub GetImageSize(ByVal f, ByRef x, ByRef y)
13 Dim p
14 Set p = LoadPicture(f)
15 x = CLng (CDbl(p.width) * 24/635)
16 y = CLng (CDbl(p.Height) * 24/635)
17 Set p = Nothing
18 End sub
19 %>
20 </HTML>
------test.asp------
aspのエラーになってしまいます。
gifファイルは元々入っているものなのですが...
>Microsoft VBScript 実行時エラー(0x800A0046)
>書き込みできません。:'LoadPicture'
>/test/test.asp line 14
VBScriptとはいえサーバ側で実行することに無理があったのかと思った訳なのですが、正直エラー原因のアタリが付くほど経験がないもので...
他サイトから持ってくることについても、ググッて出てくるのはInetを使えるという解ですが、こちらもサーバサイドでサーバのディスクにダウンロードなんて話はセキュリティ上危険そうで、いい手が見いだせていません。
まずはLoadPictureの部分だけでも何とかなればと思っているのですが、何か心当たりありますでしょうか?
> unibonさんのサイトはご覧になられました?
ぉぉっ。VBSでもLoadPictureが使えるとは知りませんでした。(汗)
[unibonさんのサイトより引用]
≫ 経験的に求めた値として 0.0378 を使っていましたが
LoadPictureで得られるオブジェクト(Pictureオブジェクト)の
Widthプロパティは、HIMETRIC 単位系です。(つまり、0.01mm単位)
ここで、Visual Basic 6.0の資料を見てみると、
VB6で標準的に使われる「Twip 単位系」に換算した場合に、
1 cm = 567 Twip
1 inch = 1440 Twip
と定義されるのだそうです。
また、一般的なモニタの設定は、96 dpi なので「1 inch = 96 dot」。
これらより、
1 HiMetric
= (567 * 96) / (1440 * 1000) Dot
= 0.378
となりますね。
クライアントサイドでも良ければ、とりあえずサイズ未指定で画像を
表示して、onload後に表示サイズを読み取る、という手があります。
似たような事をサーバサイドで、(ASPで)行った事もありますが、
そのときは、画像情報を読み込むというActiveX ExeをVB.NETで作成し、
それをVBScriptから利用していました。
> 他サイトからデータを取るのがセキュリティ上問題なのかも
このあたりは、ServerXMLHTTP等を使えばどうにかなりそうですが、
x,yの読み取りは厄介かも知れません。画像形式が固定されているならば、
バイナリを読み取って、サイズ情報を得るという手も使えそうですが…。
unibonさんのサイトはご覧になられました?
http://www.geocities.co.jp/SiliconValley/4334/unibon/asp/getimagesize.html
さとるさん、
要は他サイトに置かれているイメージファイルのURLを与えてその高さと幅を知る方法がないか?という理解でよろしいんでしたっけ。例えば WSH/JScript で書くとこんな感じですが。
// msdn, HTML and Dynamic HTML, IMG Element | img Object
// http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/img.asp
print('http://iriyak.adam.ne.jp/pic/mac.jpg');
function print(url) {
var e = new ActiveXObject('InternetExplorer.Application');
e.visible = true;
e.navigate(url);
while (e.busy || e.readyState != 4)
WScript.sleep(0.1);
var targetImage = e.document.images[0];
var output = 'targetImage.height ='
.concat(targetImage.height, '\n',
'targetImage.width = ',
targetImage.width);
WScript.echo(output);
}
初めての書き込みが質問で申し訳ありません。
現在、サーバサイドでイメージの画素数を判定する方法について検討しています。
具体的には、あるaspの引数にイメージファイルのURLを渡すと、そのイメージファイルと一緒にイメージファイルのx,yの画素数を表示するようなことを、サーバーサイドのスクリプトで実装したいのです。
Webでサンプルを探しましたが見つけられず、書き込みを決心した次第です。
考えようでは、他サイトからデータを取るのがセキュリティ上問題なのかも知れないと思いつつ、まずはご意見を伺ってみたいと思い、書き込ませて頂きました。
技術的可能性と、どこかによいサンプルがあればご教示頂ければ幸いです。
よろしくお願いします。
【魔界の仮面弁士さんへ】
JetProviderをインストール後、無事作動しました。
ありがとうございました。
> 掲示板を読み、MDAC2.8をインストールしましたが、現象は変わりませんでした。
MDAC 2.8には、Jet Providerが含まれていませんから…。
http://support.microsoft.com/default.aspx?scid=kb;JA;271908
始めまして。以下の事で困っております。
ACCESSのMDBがあるパソコンに共有接続して、
ACCESSもVBも入っていない端末からEXCELのVBAでそのMDBを読みたいのですが、
Microsoft.JET.OLEDB.4.0の所で
”プロバイダが見つかりません”と叱られます。
掲示板を読み、MDAC2.8をインストールしましたが、現象は変わりませんでした。
UDLファイルを作成すると、アイコンは変わるのですが、開こうとすると、
”ファイルが開けません。データリンクファイルが有効である事を確認して下さい”と言われます。 OSはWIN98です。
宜しくお願いいたします。
初めまして、以下のことで困っております。
グループの作成をしているのですが、
ユニバーサルグループの作成だけが以下のエラーがかえって実行できません。
「サーバーがプロセスを実行しようとしません」
ソースは以下の通りです。
set obj = GetObject("LDAP;//CN=Users,DC=test,DC=com")
set gpobj = obj.Create("group", "CN=" & groupName)
gpobj.Put("samAccountName", "" & groupName)
gpobj.Put("groupType", &H8 Or &H80000000)
gpobj.SetInfo()
エラーはsetInfoで返ってきます。
ちなみにローカルグループ、グローバルグループは
このソースで作成できました。(grouptypeを変更するだけ)
何かアドバイスがございましたらどうぞよろしくお願いいたします。
To: 【おじさま】 さん
ご無沙汰しております。
件のワームですが、こちらのPCに感染の痕跡はありませんでした。
よって、おそらくですが、感染者のPCで、ここの掲示板のキャッシュから
アドレスを採取し、FromとToにランダムに付加してばら撒かれて
いるのでしょう。
この手のワームがここ数年で流行りだしたこともあり、私も
メールアドレスをネットに書くのを最近は止めています。
ここの掲示板やサイトでも、こっそりメールアドレスを消してることに
お気づきでしょうかw
といっても既に手遅れに近く、ワーム添付メールが日に20通以上来ます。
spamと合わせると50通くらいでしょうか。
そろそろここの容量も一杯なので、サーバー移転を考えているわけですが、
その際、昔のログに書かれたメールアドレスをどうしようか迷っています。
自分のだけを消すのは卑怯ですし、かといって勝手に他の方のアドレスを
消すわけにもいかない気がするし、難しい問題です。
Google/Internet Archiveなどのキャッシュもありますし…。
1999年当時では、このサイトがここまで参照数の多いサイトに
なるとは思ってなかったですし、メールアドレスがspam…はともかく、
wormのエサになるなんてまったく想定してなかったですからねえ。
しかし、「電子メール」のシステムそのものが、崩壊しつつあるような
気がします。
アドレスを公開してこそ通信が可能になるというのに、まともに公開する
と機能不全に陥るというのは異常です。
S/N比がどうしようもなく悪い。
フィルタリングにも限度がありますしね。困ったもんです。
お久しぶりです。
WSH の話ではないのですが、どうもこちらの掲示板に書き込まれたメール
アドレスを対象に WORM_BAGLE.A が送信されているようです。
今朝はむたぐちさんからという事で私のところに届いていましたし、以前
こちらに書き込まれたやっさんさんに私が送信した事になっているメール
が宛先不明で戻って来ていました。
http://www.nai.com/japan/security/virB.asp?v=W32/Bagle@MM
http://www.trendmicro.co.jp/vinfo/virusencyclo/default5.asp?VName=WORM_BAGLE.A
http://www.symantec.com/region/jp/sarcj/data/w/w32.beagle.a@mm.html
これらの情報には偽名を使うかどうかの記載がありませんが、いかにもウ
ィルスっぽくて、しかもわざわざ添付ファイルを実行しなければ感染しな
いウィルスにむたぐちさんが感染するとは思えませんし、感染していない
のを確認した私のメールアドレスでもやっさんさんに送信されていますの
で偽名を使うのかもしれません。もしそうならば Return-Path にも偽名が
使われています。
関係ない話ですいません。一応ご連絡です。