新米MCP さん 2005年 12月 20日 19時 19分 17秒

>9ball さん 2005年 12月 19日 10時 03分 07秒

私はJScriptが全然わからないので、具体的にどう書けばいいのか説明できませんが
英語のほうのスクリプトセンターでWMIのクラスを列挙する方法が出ていました。
http://www.microsoft.com/technet/scriptcenter/resources/guiguy/default.mspx#EFAA

ここの例に出てるのはVBScriptなんですが、ちゃんとWin32_Productがあるかどうか判別できました。
でもちょっと時間がかかるみたいで、WindowsXP Proで試したら1〜2秒かかります。
参考になればいいのですが。

簡単WSHに感嘆 さん 2005年 12月 20日 00時 59分 19秒

新米MCP さん、情報有難うございます。

とにかく、超新米なので「レジストリ番犬ロン」という便利なツールを使いこなすのに精一杯。でも、それはそれで勉強になりました。
今日はキーを見つけたところで終わりです。

実はWMIがなにかと言うことも知りません。
でもレジストリを直接いじるより安心みたいですね。
参考にさせてもらいます。またよろしくお願いします。

新米MCP さん 2005年 12月 20日 00時 05分 52秒

>簡単WSHに感嘆 さん 2005年 12月 19日 21時 49分 04秒

もう少し早く気付いていればご紹介できたのですが、
こちらのサイトのリンクから行けるWMI Fun!!というサイトに、
WMIを使用してリモートデスクトップをON/OFFする方法が出ています。

でももうレジストリでできちゃったんですね(^^;
調査お疲れ様でした。

簡単WSHに感嘆 さん 2005年 12月 19日 21時 49分 04秒

レジストリの「リモートデスクトップ許可」の設定キーは

HKEY_LOCAL_MACHINEのSYSTEM\CurrentControlSet\Control\Terminal Server の fDenyTSConnections で
1 =許可しない(デフォルト)/0=許可する
のようですね。

ちゃっぴさん。ありがとう。
レジストリ番犬ロンが大いに役に立ちました。
またよろしくお願いします。

9ball さん 2005年 12月 19日 10時 03分 07秒

初めての投稿です、よろしくお願いします。

現在WSH(Win32_ProductのInstall/Advertise/Uninstall
メソッド)でmsiインストーラによるインストールや、ア
ンインストールを行うスクリプトを組んでいます。

先日Windows2003で試験したところ、Win32_Productクラ
スが存在しない旨のエラーが出ました。。
調べてみると、「Windows 2003 では Win32_Product ク
ラスが既定でインストールされない」という事が分かり
ました。

(参考URL)
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/jan05/hey0110.mspx

下記を実行するとエラーで処理が終了してしまいます。

 var obj = GetObject("winmgmts:").InstancesOf("Win32_Product");

上記クラスがインストールされていないWindows2003を
対象外としたいのですが、Win32_Productクラスが存在
するか否かを判定する方法はあるのでしょうか?

以上です、よろしくお願いします。

簡単WSHに感嘆 さん 2005年 12月 18日 23時 49分 43秒

ちゃっぴさん。外出していたので遅くなりました。
ご返事有難うございます。なかなか厳しい先生ですね。

とにかく、HKLM\SYSTEM\、、、の意味も分からないレベルですので、
どこから手を付けるか、迷いました。
でも図書館で調べ、なんとなくイメージがつかめました。
(と言っても、レジストリはキーというフォルダっぽいものの階層構造だという事が分かったぐらいですが)

TOOLを教えてもらったし、ひとつ挑戦してみます。
分からなくなったらまたお願いします。

ばんのしゃーによかばんた さん 2005年 12月 18日 16時 42分 27秒

>ばんのしゃーによかばんた さん 2005年 12月 14日 17時 29分 42秒
>スクリプトでも、ExcelVBAのときは、OCXを貼り付けるときに開発ライセンスが必要ですが、
>XLSファイルを実行するときは不要ですよね。

SYSINFOを貼り付けて試してみました。これは問題なく動きました。
これについては、以下のような記事があるので、認められているようです。
|サポート技術情報 
|コモン ダイアログ コントロール (Comdlg32.ocx) を呼び出すコードを実行するとエラー メッセージ "ActiveX コンポーネントはオブジェクトを作成できません" が表示される
|文書番号: 281848
|最終更新日: 2004/12/17

>また、HTAも、ライセンスマネジャをHTAに組み込んで、LPKファイルを作成同梱すれば、
>実行時には不要なようです。例えば、
>http://msdn.microsoft.com/downloads/samples/internet/author/html/htmleditor/default.asp

これも試してみました。問題なく動きました。
あと気になるのは、LPKファイルの同梱配布の許可が明文化されているかですね。
htmleditorのような例はありますが、特例かもしれないし。
HTAとLPKファイルの関係についての記事が全然見付からない。。。

>すると、WSHだけが駄目なのでしょうか?
>VBのOCXを使うスクリプトを開発ライセンスのない環境で動かすにはHTAにしろってことかな。
>ひょっとして、WSFならHTAと同様に出来るのかも知れません。

WSFはライセンスマネジャが組み込めないようですね。残念。
なので、HTAにするか、さもなくば、XLSにして、WSHから駆動するか、ですね。


ちゃっぴ さん 2005年 12月 18日 16時 05分 52秒

To 簡単WSHに感嘆 さん 2005年 12月 18日 15時 07分 11秒

> レジストリのどこが「リモートデスクトップ項」の設定項目に
> るのでしょうか

教えるのは簡単ですが、それでは応用が利きませんよね。なので、

>> まあ、変更前、変更後の Registry を Compare かけてみて
>> いろいろ調べてみてください。

ということになります。
この手の Tool はいろいろあって、たとえばこんなのがあります。

レジストリ番犬ロン
http://www.vector.co.jp/soft/win95/util/se271528.html

そんなことで、自身で調査してみてください。

>> 設定後は Terminal Servie の再起動が必要かな?

と書いてしまいましたが、下記の文章を読んだ感じでは必要なさそうです。

[HOW TO] Windows XP でリモート アシスタンスを有効にする方法
http://support.microsoft.com/kb/305608/JA/

まあ、こちらも調査してみてくださいな。

簡単WSHに感嘆 さん 2005年 12月 18日 15時 07分 11秒

ちゃっぴ さん。早速のご返事、有難うございます。
初心の私にはとても大変そうですね。
レジストリにも興味がありますので勉強してみようと思います。
またご教示お願いします。
ーーーーーー
ところで最終的にはXPプロでのリモートデスクトップもやってみたいと思っています。
その際、同じように「リモートデスクトップ項目のチェックのon/off」を
WSHで自動的にしてしまうプログラムは可能でしょうか。

もしこの場合もInterface が存在しないなら
レジストリのどこが「リモートデスクトップ項」の設定項目になるのでしょうか。教えてくださいませんか。
よろしくお願いします。



ちゃっぴ さん 2005年 12月 18日 13時 43分 22秒

To 簡単WSHに感嘆 さん 2005年 12月 18日 11時 44分 29秒

> 「リモートアシスタント項目のチェックのon/off」を
> WSHで自動的にしてしまうプログラムは可能でしょうか。

WMIには Terminal Service 用の Interface は存在しますが、
Remote Assistance 用の Interface は存在しないようですから、
Registry を変更してやることになりそうです。

[HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server]
fAllowToGetHelp

ここが Remote Assistance の設定項目になります。
まあ、変更前、変更後の Registry を Compare かけてみて
いろいろ調べてみてください。

設定後は Terminal Servie の再起動が必要かな?
WMI Win32_Service Class を使用してやればできるでしょう。でわ

簡単WSHに感嘆 さん 2005年 12月 18日 11時 44分 29秒

WSHに関心があったので感嘆なマニュアルを購入したのが、3年前。
とっつきにくくて、そのまま書棚の肥やし、、、
昨日、必要あって久しぶりに取り出し、挑戦し始めました。
WSHって魅力的ですね。簡単そうで奥深いような気がしています。
前口上はそのくらいにして、先輩方、教えてください。

WINDOW XPの「システムのプロパティ」の「リモート」画面の
「リモートアシスタント項目のチェックのon/off」をWSHで自動的にしてしまうプログラムは可能でしょうか。

現在、「リモート」の画面の表示まで出来たのですが、、、
よろしくご教示お願いします。


ばんのしゃーによかばんた さん 2005年 12月 17日 17時 23分 15秒


WSHで常駐監視などを作ると、停止インターフェースがなくて困ります。
タスクマネジャだと区別が付かないし。
停止インターフェースのためだけにHTAにするのも。。。

そこで、停止インターフェースの簡便な(手抜き)インプリメントのアイデアです。

Set fso=CreateObject("Scripting.FileSystemObject")
Do While fso.FileExists(WScript.ScriptFullName)
 '何かの処理
 WScript.Sleep 1000
Loop

停止するときは、スクリプトファイルを移動/改名/削除します。

HTAとWSHは、ファイルを削除しても関係ないみたいですが、
HTMは、ファイルを削除すると、なぜか、IEが終了します。
オープンしてる訳ではないので、同じような存在確認をやってるのでしょうか。
なぜだろう。
HTAとWSHでも、IEと同じように存在確認すれば、停止インタフェースに使えます。


AKA さん 2005年 12月 17日 06時 48分 13秒

>>管理人むたぐち さん 2004年 11月 11日 22時 02分 27秒
>WSH用コンパイラ+(WindowsNT/2000/XP/プログラミング)
>http://www.vector.co.jp/soft/winnt/prog/se344839.html
>これがぜんぜん動作しないんですけど、うまく動いた方は
>いらっしゃいませんか?

>【ソフト名】WSH用コンパイラ
>【作製者】飯岡 淳

これ、動くように出来てないですね。

そこで、一応動くようにしてみました。

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=SCRC001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

テストよろしく。特に>>管理人さん。まあ今の時期は忙しいかもしれませんが・・・

なお、WScriptオブジェクトは使えません。アクティブスクリプトとしてのVBScriptとJScriptの組み込み構文とオブジェクトはすべて使えるはずです。(無論オートメーションオブジェクトも登録さえされていれば可)

それと、(飯岡さんが)デタラメに作ってあるので、VBScriptの場合、サイズ0824h以上のスクリプトは潜在的クラッシュ、09B8h以上だと即死です(^^;)

>出力したファイルと一緒にdataフォルダにある
>(msscript.ocx)を配布してください。
>注意:必ず2つを同じところに置いてくださいエラーの原因になります。

この記述を冷静に考えると危険な人だというのがわかる(^^;;)



>>さえ さん 2005年 12月 07日 22時 52分 44秒

Shell.Applicationというのが使えます。

このサイトの過去ログにあるのでGoogleサイト内検索をやってみては?




初心者とみなすと完全無視。冷たい上級者・・・そしてみんな無反応に・・・今の日本の現状だ・・・

書くんならついでに教えてやれば?

ばんのしゃーによかばんた さん 2005年 12月 16日 18時 38分 57秒

スクリプトから、IEの終了を検知するのに、
WScript.CreateObject(,"IE_")でIE_OnQuit()を使えば問題ないですが、
TypeName(ie)がIWebBrowser2からObjectに変化するのを利用した場合、
うまく行かないケースがあります。
――――――――――――――――――――――――――――――――――――――
Set ix=CreateObject("InternetExplorer.Application")
ix.Navigate "about:blank"
ix.Visible=True
Do While ix.Busy Or ix.ReadyState<>4
 WScript.Sleep 1000
Loop
Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 1000
Loop
MsgBox "IEを閉じてから、OKボタンを押す。",,TypeName(ix)
MsgBox "なぜか、終了が認識できない",,TypeName(ix)
――――――――――――――――――――――――――――――――――――――
IEの起動順序を逆にするとうまく行きます。なぜだろう?
――――――――――――――――――――――――――――――――――――――
Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 1000
Loop
Set ix=CreateObject("InternetExplorer.Application")
ix.Navigate "about:blank"
ix.Visible=True
Do While ix.Busy Or ix.ReadyState<>4
 WScript.Sleep 1000
Loop
MsgBox "IEを閉じてから、OKボタンを押す。",,TypeName(ix)
MsgBox "終了が認識できる。",,TypeName(ix)
'ie.Quit     '←不要
――――――――――――――――――――――――――――――――――――――
どうも、後から起動したIEが、先に起動したIEへの参照を持っているみたいです。
こういう変な振る舞いは、障害か、脆弱性の元になるかで、困ったものです。

ここで、ieは、ほったらかしですが、非表示で参照がなくなると勝手に消えます。


ばんのしゃーによかばんた さん 2005年 12月 16日 18時 38分 40秒

ファイルの生成監視はWMIや.NETを使わずとも、以下で出来そうです。
――――――――――――――――――――――――――――――――――――――
arg="C:\Documents and Settings\ユーザ名\Local Settings\Temp\"
Set ix=CreateObject("InternetExplorer.Application")
ix.Navigate arg
Do While ix.Busy Or ix.ReadyState<>4
 WScript.Sleep 1000
Loop
Set Folder=ix.Document.Folder

Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
ie.Visible=True
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 1000
Loop

Count=Folder.Items.Count
Do While TypeName(ie)="IWebBrowser2"
 If Count<Folder.Items.Count Then
  For Count=Count To Folder.Items.Count-1
   ie.Document.body.insertAdjacentText "AfterBegin",Folder.Items.Item(Count).ModifyDate&vbTab&Folder.Items.Item(Count)&vbCrLf
  Next
 ElseIf Count>Folder.Items.Count Then
  Count=Folder.Items.Count
 End If
 WScript.Sleep 1000
Loop
MsgBox "Ended.",,WScript.ScriptName
――――――――――――――――――――――――――――――――――――――
ポイントは、
○FileSystemObjectのFolder.Filesには、数字インデックスがないので、
全件をDictionaryに転写して、毎回全件検索が必要なので駄目。
○Shell.ApplicationのNameSpaceのFolderは、名前順に整列されるので駄目。
○IShellFolderView*のFolderは、新しいItemがItemsの末尾に付くので、
数字インデックスで取り出せる。

のん さん 2005年 12月 16日 09時 47分 19秒

>ちゃっぴさn

お返事ありがとうございます。
やはり無理そうですかね。
ADSIスクリプトだと、ユーザアカウントのステータスを設定したり出来るので
「多分駄目だろうけど、もしかしたら・・」
と思ったのですが・・。

もう少し調べてみて出来るようだったらまた報告しますね。

ちゃっぴ さん 2005年 12月 16日 02時 38分 44秒

To のん さん 2005年 12月 15日 21時 36分 13秒

> WMIを使用してリモートコンピュータのデバイスの有効、無効を設定することは> > 可能でしょうか?
> リモートコンピュータのデバイスのステータスを取得する方法は
> 知っているのですが、設定までするとなると、スクリプトでは不可能でしょうか。

まあ、ご存知だとは思いますが、WMI のほとんどの Property は
Read-Only です。したがって、それを変更する Method がない限り、
変更はできません。

どの Class を対象にしているのか知りませんが、
おそらく Script からでは無理ではないかと・・・

のん さん 2005年 12月 15日 21時 36分 13秒

よろしくお願いします。

WMIを使用してリモートコンピュータのデバイスの有効、無効を設定することは可能でしょうか?
リモートコンピュータのデバイスのステータスを取得する方法は知っているのですが、設定までするとなると、スクリプトでは不可能でしょうか。

魔界の仮面弁士 さん 2005年 12月 15日 00時 05分 13秒

》ばんのしゃーによかばんた さん 2005年 12月 14日 17時 29分 42秒
> SYSINFO.OCXはVBのOCXですね。
厳密には、VB 以外の製品にも付属していますので、VB用と言い切ってしまうと、
誤解を生んでしまうかも知れませんが、主に VB 用として使われる事が多いと
いう意味であれば、確かにその通りですね。


> VBのOCXを使うスクリプトを「作る」ときに開発ライセンスが必要なのは分かりますが、
> 「実行する」ときに開発ライセンスが必要なのはどうも釈然としません。

SYSINFO.OCX に限って言えば、実行時ライセンスは無料ですけれどね。

「作る」と「実行する」で言えば、CreateObject はむしろ「作る」側の
機能なので、ライセンスについては仕方の無い所であるとも言えそうです。
# もし、生成制限が無かったとすれば、多くの市販コントロールは、
# 再頒布のために、追加のライセンス料が必要になっている事でしょう。


ちなみに、SysInfoを開発時ライセンスの無い環境で CreateObject した場合には、
エラー 0x80040112『クラスを使用する使用許可がありません』等が発生しますが、
そのような環境であっても、VB6 で作った ActiveX DLL などを介して、
既に生成されている SysInfo のインスタンスを受け取るような形にすれば、
開発ライセンス無しでも動作する事を確認しています。

もっともそれは、下記の「Excel を所有する証券アナリストが〜〜」の項と
同じ状況となりますので、公式には認められないかも知れませんけれども。
http://www.microsoft.com/japan/developer/library/vbcon98/vbconcontrolsyoucanuseasconstituentcontrols.htm



> スクリプトでも、ExcelVBAのときは、OCXを貼り付けるときに
> 開発ライセンスが必要ですが、XLSファイルを実行するときは不要ですよね。

これは微妙なところです。確かに、そのような仕様のコントロールもありますが、
残念ながら、すべての ActiveX コントロールがそうだというわけではありません。
むしろ基本的には、Office VBA であっても、開発時ライセンスは必要とされます。

実際、VB6 のヘルプには、以下のような記述があります。
http://www.microsoft.com/japan/developer/library/vbcon98/vbconlicensingissuesforolecontrols.htm

》 Microsoft Word for Windows、Excel などのデスクトップ アプリケーションを使って、
》 文書またはユーザー フォームの上にコントロールのインスタンスが作成されると、
》 それらのアプリケーションからコントロールに、レジストリのライセンス キーを使って
》 自身のインスタンスを作成するように、指示が出されます。つまり、コントロール
》 コンポーネントを購入してセットアップしておかなければ、エンド ユーザーは
》 ライセンス付きのコントロールを使うことができません。

》 ユーザーの文書には、ライセンス キーを組み込むことはできません。デスクトップ
》 アプリケーションのユーザーが、コントロール コンポーネントのコピーと、
》 そのコンポーネントに含まれるコントロールを配置した文書を、一緒に同僚に渡す
》 場合を考えます。この文書を開くと、レジストリ キーを使って実行時インスタンスを
》 作成するように、そのコントロールに指示が出されます。

》 つまり、この同僚もコントロール コンポーネントを購入してセットアップしておく必要が
》 あります。セットアップしておかないと、文書をオープンしたときに、コントロールの
》 インスタンスを作成することができません。

ちなみに、開発ライセンスの無い環境で開かれた xls ファイルは、
『'hogehoge1'コントロールは作成されていないため、
 デザインモードを終了できません。』
という警告が VBA によって放たれ、処理を実行できなくなります。



> VBのOCXを使うスクリプトを開発ライセンスのない環境で動かすにはHTAにしろってことかな。
問題点の一つは、SysInfo が「ActiveX コントロール」である事ですね…。


> ひょっとして、WSFならHTAと同様に出来るのかも知れません。
*.wsf では駄目かも。*.wsc であればどうかな? 調べてみます。

ばんのしゃーによかばんた さん 2005年 12月 14日 17時 29分 55秒

スクリプトからシフトキーの押し下げ状態を検知する方法は如何でしょう?

Dim keys
Dim ie
Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 100
Loop
ie.Document.body.onunload=GetRef("shiftKeys")
ie.Quit
Do While TypeName(ie)="IWebBrowser2"
 WScript.Sleep 100
Loop
MsgBox keys

Sub shiftKeys()
keys=Join(Array(Array("","+shiftLeft")(-Me.event.shiftLeft),_
Array("","+shiftKey")(-Me.event.shiftKey),_
Array("","+altLeft")(-Me.event.altLeft),_
Array("","+altKey")(-Me.event.altKey),_
Array("","+ctrlLeft")(-Me.event.ctrlLeft),_
Array("","+ctrlKey")(-Me.event.ctrlKey)),"")
End Sub



ばんのしゃーによかばんた さん 2005年 12月 14日 17時 29分 42秒

>魔界の仮面弁士 さん 2005年 12月 12日 03時 03分 32秒
>SYSINFO を使うには、SYSINFO.OCX が必要です。しかもこれは、
>開発ライセンスが無いと CreateObject が失敗する可能性があります。

SYSINFO.OCXはVBのOCXですね。てことは、VB.NETかVS.NETを買えってことですね。
VBのOCXを使うスクリプトを「作る」ときに開発ライセンスが必要なのは分かりますが、
「実行する」ときに開発ライセンスが必要なのはどうも釈然としません。

スクリプトでも、ExcelVBAのときは、OCXを貼り付けるときに開発ライセンスが必要ですが、
XLSファイルを実行するときは不要ですよね。
また、HTAも、ライセンスマネジャをHTAに組み込んで、LPKファイルを作成同梱すれば、
実行時には不要なようです。例えば、
http://msdn.microsoft.com/downloads/samples/internet/author/html/htmleditor/default.asp
すると、WSHだけが駄目なのでしょうか?
VBのOCXを使うスクリプトを開発ライセンスのない環境で動かすにはHTAにしろってことかな。
ひょっとして、WSFならHTAと同様に出来るのかも知れません。


魔界の仮面弁士 さん 2005年 12月 12日 03時 03分 32秒

》ばんのしゃーによかばんた さん 2005年 12月 10日 16時 40分 28秒
> Set SI=WScript.CreateObject("SYSINFO.SysInfo","SI_")

SYSINFO を使うには、SYSINFO.OCX が必要です。しかもこれは、
(REGSVR32.EXEで)レジストリ登録してあるだけでは利用できず、
開発ライセンスが無いと CreateObject が失敗する可能性があります。
http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?mode=allread&no=2275&pastlog=0001&act=past#2278


代替案としては、WMI の Win32_OperatingSystem という手もありますが、
WMI が標準でサポートされていない OS もあるので、注意が必要です。

それ以外のOS判定法としては、「VERコマンドの標準出力結果を受け取る」
あるいは、「レジストリから判定」という手法が知られていますね。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24271&forum=6&3

ばんのしゃーによかばんた さん 2005年 12月 10日 16時 40分 28秒

スクリプトでのOS Version判定方法は、以下が標準的に使えてよさそうです。
ただし、各OSの値は不明。以下はXPの値です。

Set SI=WScript.CreateObject("SYSINFO.SysInfo","SI_")
MsgBox SI.OSPlatform     '2
MsgBox SI.OSVersion     '5.01
MsgBox SI.OSBuild     '2600
Sub SI_SettingChanged(Item)
MsgBox Item
     '0/31
End Sub

後半部分は、スクリプトから、システム設定の変更を検知する方法です。

レジストリを変更しただけでは、実行中アプリに反映されませんよね。
unixだとSIGHUPシグナルをそのdaemonにkillで飛ばすところですが、
Windowsでは、WM_WININICHANGE/WM_SETTINGCHANGEメッセージを
HWND_BROADCASTで飛ばすんですね。
このとき、変更セクション名/レジストリキー名を指定するか省略する。
上のItemはこれに対応しているようですが、詳細は不明。
省略すると0、カーソルの点滅速度は23、インターネットオプションは31でした。
タイムゾーンの変更は、TimeChanged()のほうでした。

CreateObject("WScript.Network").SetDefaultPrinterは2、
Shell.ApplicationのInvokeVerbで「通常使うプリンタに設定」は0。
前者が駄目で、後者で反映されるアプリは、デフォルトプリンタは0と
決め付けて、2を無視しているのかも知れません。

スクリプトから、システム設定の変更を通知する、直接的な方法は、
なさそうですが、間接的には、例えば、shell.applicationで
デフォルトプリンタを変更したり、してやればよさそうです。
或いは、TrayProperties()で、OKボタンをSendkeysするとか。
もう少し使い勝手のよいのがあればよいのですが。。。

VB.NETで、WM_WININICHANGEをHWND_BROADCASTで飛ばすだけのアプリを作って、
wShell.Runするのが、簡単で確実そうですが、サンプルコードは、
VB.NETの話になるので、省略。


土田 さん (tuchida_toshiyuki@yahoo.co.jp) 2005年 12月 09日 23時 33分 50秒

ありがとうございました。
OKでした。

ちなみにでっかいパッケージソフトを一人でこつこつ作っとります。
そのうちどこかで「Estate7」(賃貸不動産のソフトです)
なんて名前きいたら、犯人は私だと思ってください。
(結構はずかしいけど、1月から売り出しです)

魔界の仮面弁士 さん 2005年 12月 09日 13時 24分 26秒

》土田 さん 2005年 12月 09日 01時 04分 50秒
もしかして、スクリプトではなく VB6 かな?

> 結果としてWs_Runの中身は
> C:\Program Files\VikingEgg\Estate7\Firebird_ODBC_1.2.0.69-Win32.exe /SILENT

これだと、"C:\Program" (program.exe, program.bat 等) に対して、
"Files\VikingEgg\…" というパラメータを渡している事になるのでは。


『C:\Program Files\VikingEgg\Estate7\Firebird_ODBC_1.2.0.69-Win32.exe /SILENT』ではなく、
『"C:\Program Files\VikingEgg\Estate7\Firebird_ODBC_1.2.0.69-Win32.exe" /SILENT』
という文字列を渡すようにしてみては如何でしょう?

土田 さん (tuchida_toshiyuki@yahoo.co.jp) 2005年 12月 09日 01時 04分 50秒

はじめまして

現在、WScript.Shellのrunスクリプトを利用しているのですがどうも以下の名前ではー2147024894エラー(ファイルが存在しません)のエラーとなってしまっています。
\マークを2つにするとかの方法で対応が可能でしょうか?


Set WsShell = CreateObject("WScript.Shell")
       
Ws_Run = App.Path + "\Firebird_ODBC_1.2.0.69-Win32.exe /SILENT"
                
WsShell.Run Ws_Run, 0, True

ちなみにApp.Pathの内容は「C:\Program Files\VikingEgg\Estate7」であり

結果としてWs_Runの中身は

C:\Program Files\VikingEgg\Estate7\Firebird_ODBC_1.2.0.69-Win32.exe /SILENT

となっています。
ずうずうしい質問ですみません。

ちゃっぴ さん 2005年 12月 09日 00時 12分 29秒

To キタシナガワ さん 2005年 12月 08日 01時 36分 49秒

> ある業務を行うユザーが100人弱居る。
> 更新するファイルが掴まれていた場合には、
> 時間をおいて遣り直す、ということになってます。

ということであれば、ちゃんとした排他制御を有した
DBMS 製品に乗り換えるというのが現実的ですね。

9X系の Client がないようなく、同時更新を認めていないようですから、
破損の可能性は若干低下しますが、それでも無ではないです。

複数人で同時に作業を行うものであるならば、
排他制御を標準で実装している DBMS を使用するのが
もっとも近道です。
# 裏技的なものがないわけではありませんが、
# そちらのほうが工数がかかり結果として高くつきます。

キタシナガワ さん 2005年 12月 08日 01時 36分 49秒

ちゃっぴ様

ありがとうございます。いずれかのユーザーがローカルに複製したコピーを使う可能性もありますので、

>共有Folder 上でNetwork経由で Access していると限定できるなら、

という前提は置けません。せっかく教えていただいたのに残念です。

====

再度行き詰まってしまい、お知恵を借りに参りました。

Excel.Application ですが、稼動中のインスタンスと通信をしてその状態を知るにはどうすればよろしいのでしょうか?
Excelインスタンスを新たに起動する例は多く見つかるのですが、起動中のそれと通信する例を見つけられずにおります。
Excel は複数インスタンス起動可能ですから、総当りで調べて回ることになるかと思います。

====

これまで環境すら書いておりませんでした。おおむね以下のような状況です。

- クライアントPCは、Windows 2000, XP Pro 混在
- どこにあるどのファイルを掴んでいるかを調べる対象 MS Office 2000

ある業務を行うユザーが100人弱居る。

その業務では

\\server\honmono\hogehoge.xls
あるいは
\\server\honmono\hogehoge.mdb
を参照する−ということになっています。ファイルは1つだけでなく、1業務について複数件存在し
うち、いくつかは readonly になっていますが、更新可のものもあります。
更新するファイルが掴まれていた場合には、時間をおいて遣り直す、ということになってます。
若干無理も出てきておりますが、現時点ではこの運用です。

で、実際に調べてみると
ネットワーク上の別のフォルダに複製して
\\server\kossori_copy\hogehoge.xls
\\server\kossori_copy\hogehoge.mdb
を参照していたり、あるいは、各自のパソコンに複製して

c:\localcopy\hogehoge_20051207.xls
c:\localcopy\hogehoge_20051207.mdb
を参照していたり、という状況が起こっております。

ロギング機構を含む起動時読み込みの自動マクロの類が各ファイルにあれば..というところですが、現時点ではそうなってはおりません。

各自に申告して貰うことにしてはおりますが、抜け漏れの無いよう手当てをしたほうが
よかろうという話になり、今回の話になりました。

完全とは言えませんが、ある程度の時間間隔で起動するスクリプトを各PCに仕込み、
各PCでの稼動状況をそのPCでの状況を記録する。記録したものは別途収集して解析。
というように考えておりました。

WMIからの攻め口がないとご教示いただいた今、ユーザーが操作中の excel に情報を求めるほかないと考えております。

再々となる話で恐縮ですが、どなたかご教示いただければ幸甚です。

さえ さん 2005年 12月 07日 22時 52分 44秒

WSHの質問です。

@objIE.Navigateであるホームページを開き
 ※Set objIE = CreateObject("InternetExplorer.Application")
Aフォームを操作し、ログイン
B新しくIEが立ち上がり(IEが2つ存在することに)
C新しく立ち上がったIEを操作

ということをWSHで行いたいのですが、objIEで操作できるのは@Aまでで、
Bで立ち上がったIEを操作することができませんでした。

このように新たに立ち上がったIEを操作するにはどうしたら良いでしょうか?
どなたか教えて下さい。よろしくお願いします。

YU-TANG さん 2005年 12月 06日 14時 39分 06秒

> ばんのしゃーによかばんた さん 2005年 11月 30日 16時 01分 36秒
> 需要があるなら、もう少し続けますかね。

ぜひぜひ。

> なので、こちらで割愛したWindows/障害の話は、どこか余所で聞いてください。

見つけました。
割と知られているバグ(?)だったのですね。
たしかにローカルページを使ってましたわ、自分。
勉強になります。

バイナリの Base64 エンコードスクリプトも、興味深く拝見しました。
大方 ROM ってますが、「へー」とか「ほー」とか言っている人間が
少なくとも一人は居るということで、モチベーションの足しになるよう
でしたら幸いです。

それでは。

ばんのしゃーによかばんた さん 2005年 12月 06日 13時 54分 27秒

ローカルのHTMLファイルを「信頼済みサイトゾーン」で開く方法がありました。

HTMファイルをドロップすると「信頼済みサイトゾーン」で開く.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim ie
Dim HTML
Dim Base
Dim fso
Dim htmfile
Dim mhtfile
Dim TextFile

htmfile=WScript.Arguments.Item(0)
mhtfile=htmfile&".mht"

Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 1000
Loop
ie.Document.designMode="On"
ie.Navigate htmfile
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 1000
Loop
ie.Document.charset="shift_jis"
HTML=ie.Document.documentElement.outerHTML
Set fso=CreateObject("Scripting.FileSystemObject")
Set TextFile=fso.CreateTextFile(mhtfile)
TextFile.WriteLine "MIME-Version: 1.0"
TextFile.WriteLine "Content-Type: text/html;charset=""shift_jis"""
TextFile.WriteLine "Content-Transfer-Encoding: 8bit"
TextFile.WriteLine "Content-Location: http://www.microsoft.com/"
TextFile.WriteLine ""
TextFile.Write HTML
TextFile.Close

ie.Document.designMode="Off"
ie.Visible=True
ie.Navigate mhtfile
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 1000
Loop
――――――――――――――――――――――――――――――――――――――
ここで、http://www.microsoft.com/は「信頼済みサイト」のURLに変えてください。

このスクリプトは、Windowsのセキュリティの問題を、WSH/スクリプティング話に
仕立て直したものなので、実用的でないかも。
詳細は割愛しますが、良くも悪くも、MHTMLを使って、ローカルのHTMLファイルを
「信頼済みサイトゾーン」で開くことが出来るってことです。
他人の作ったMHTMLファイルはとても危険なので、IEへのデフォルトの関連付けを
外しておくことを強く推奨します。


ちゃっぴ さん 2005年 12月 06日 01時 51分 51秒

To キタシナガワ さん 2005年 12月 06日 01時 41分 10秒

共有Folder 上でNetwork経由で Access していると限定できるなら、
NET FILE Command とか、ADSI の IADsResource を利用する方法もありますね。

そうでなければ、Openfiles.exe を利用してやることになるでしょう。

オープンしているファイルを調査する
http://www.atmarkit.co.jp/fwin2k/win2ktips/306openfiles/openfiles.html

キタシナガワ さん 2005年 12月 06日 01時 41分 10秒

ばんのしゃーによかばんた 様

ご教示いただきありがとうございます。本年八月十九日の記事も拝見いたしました。

>MS自身がSysIntrnalsやoh.exeを参照しているところを見ると、きっとないのでしょう。>標準状態のカーネルには、そもそも情報がないようですし。

 ありがとうございます。捜し物無間地獄から解放されたかのようです。

 私の抱えているのはおおよそこんな話です。

 原盤管理というかそういうべきものの牽制が無いままここまで来てしまったあるLAN内での話です。
 本来皆が a.xls という同じファイルをもとに作業をしている筈なのですが、違うディレクトリにそのコピーを作って一部の人たちの間で共有されており、更に、それが、少しずつ改変を受けて今に至る−という状況が発覚しました。

 全員に正しいものを使うように再度促すことになりますし、訳あって誰がどれを掴んでいるのか(いたのか)を特定する必要があります。これもWSHではなく、各自に自己申告して貰うのが正攻法なのですが、思い違い・勘違いというのもありましょうから、IT側で裏を取る仕掛けを用意できないだろうか。プロセスが掴んでいるファイルハンドルには載ってくる情報だし...

というような具合で、情報を取ろうと足掻いていたわけです。

>このケースなら、普通は、と限定付きですが、スクリプトでExcel.Applicationから辿れば分かります。

 この方式は気づきませんでした。ご教示いただいたことに重ねてお礼申し上げます。


 

はた さん 2005年 12月 05日 18時 36分 54秒

初めて質問します。
WSHにてFTP転送を行っているのですが、やり方としてはShellをつかって以下のように行っています。
lngFtpRtn = objShell.Run("cmd /c ftp -s:ファイル名 >>ftp.log", 0, True)

所が正常でも、エラーでもShellの戻り値は正常となってしまいます。
今の所、FTPのログを出力してるのでそれを見れば判断は付くのですが、
戻り値としてエラーを取得できないでしょうか?

ばんのしゃーによかばんた さん 2005年 12月 05日 16時 41分 17秒

>キタシナガワ さん 2005年 12月 01日 03時 31分 34秒
>あるアプリケーションが利用しているファイルを知りたいのですが、WMI で取得する方法をご存知の方はいらっしゃるでしょうか。

過去にも話題になってますね。

|ばんのしゃーによかばんた さん 2005年 08月 19日 16時 15分 40秒

MS自身がSysIntrnalsやoh.exeを参照しているところを見ると、きっとないのでしょう。
標準状態のカーネルには、そもそも情報がないようですし。

SysIntrnalsでなくても、MS/OS「準」標準に、oh.exeがありますが。。。
http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/oh-o.asp
しかし、日本語ファイル名が通らないようです。これじゃ使いものにならない。残念。
oh.exeのソースでもあればよいのですが。
3rd Party製だと、業務システムでは、なかなか使えないでしょうし。困ったもんです。

ところで、使用目的はなんでしょうか?
上記の通りで、業務システムで使える一般解はなさそうですが、
個別解なら、スクリプトで可能かも知れません。例えば、

>例えば Excel で c:\temp\hogehoge.xls を開いているとき、これを知りたいわけです。

このケースなら、普通は、と限定付きですが、スクリプトでExcel.Applicationから
辿れば分かります。


hongkong さん 2005年 12月 05日 15時 18分 59秒

下の質問に対しての補充です。
やりたいことはいまフォルダにある
昨日の日付で名前を付けたLOGファイルを
新たに作ったバックフォルダの中に昨日の日付で
名前を付けたZIPファイルをつくりたいです。
どうかよろしくお願いいたします。

ムスタファ さん 2005年 12月 05日 13時 35分 09秒

のんさん、ありがとうございます!
ADSysteminfoなんてあるんですね。そのままコピペで頂きました。

他のクライアントマシンとパスワードの同期をとっていましたので、最後にフラグを立たせて他のマシンに知らせたいと思います。
本当にありがとうございました。



hongkong さん (pangzai1@yahoo.co.jp) 2005年 12月 05日 12時 06分 02秒

初めまして、VBSの初心者です。
いきなりで申し訳ありませんが 誰か助けていただけないでしょうか?
いまVBSを使ってLOGファイルを 圧縮させてほかのフォルダに保存して
置く機能を実現したいものですが
初心者で与えられた時間が短いので
一人の力ではどうも不可能なので、
助けてほしいです。
よろしくお願いいたします。

AKA さん 2005年 12月 04日 01時 49分 09秒

>>たか さん 2005年 12月 02日 01時 48分 12秒
>popupで表示しているOKを押すと終わる処理をウィンドウを表示したままOKを押すまでwavの再生を繰り返すことは可能でしょうか?

これは、誰でもぶつかる当然の疑問で、FQ(Frequent Question)だと思うのですが、スクリプト関係でこの質問にまともに答えている人が少ないので、答えさせて頂きます。

Windowsにおいて、ウィンドウを表示し続けるためには、自動的にこれを行うことができません。かならずユーザープログラム自身が、次々送られてくるメッセージをループで処理し続けなければなりません。(メッセージループ、と言います)
メッセージボックスにおいては、その処理を行うルーチンがUSER32内に置いてあるので、そこに制御を移すことによって、メッセージボックスを表示し続けることができるわけですが、制御が戻ってしまうとメッセージボックスの表示ができなくなり、表示がおかしくなってしまいます。
制御が戻ってもメッセージボックスの表示をきちんとし続けるためにはユーザープログラムがメッセージループを回さなければなりません。
メッセージループを回すには、Win32API関数のGetMessage()/DispatchMessage()をコールし続けなければならず、スクリプトからでは通常不可能になります。(DWならできる。ただしウィンドウの生成もしなければならない。MessageBoxを実行するスレッドを生成する方が簡単かも・・・)

ただし、もう一つスクリプトを同時に起動してもよいのなら話は別です。
WshShell.Exec()メソッドによってメッセージボックスを表示するだけのスクリプトを同時に起動し、これが終了したかどうかを調べることで目的の処理を実現できると思います。(WSHのバージョンは5.6以上でなければなりません。)

AKA さん 2005年 12月 03日 06時 21分 49秒

DynamicWrapperですが、構造体をオブジェクトとして使えるようにする機構を実装しました。

なぜ突然やる気になったのか、と言えば、実はすごい歯科治療「3Mix-MP法」を受けてきたからです。

新潟大学病院歯科では、神経抜くって言われてがっかりしてたんですが、仙台に行って抜かないで直してもらいました! しかも安かったし!

「3Mix-MP法」もすごいんだけど、宅重先生(70才くらい?)の話はもっとすごかった!

おかげでやる気が出ました。

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=DW95702.ZIP&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

これでWin32APIを呼び出すための「定義」コーディングの量は大幅に減ることでしょう。

新しいサンプルの何とすっきりしたことか!

これでJScriptでプロパティがメソッドになってしまう件も、デストラクタがない件も解決です。(本当はスクリプトだけで何とかできたらよかったんですが・・・)

(デストラクタがない・・・というか、どうもJScriptは一度生成したオートメーションオブジェクトをプログラムが終了するまで一切解放しないみたいです。参照を代入した変数が、deleteされようが、別の値が入ろうが、スコープから外れようが一切Releaseが呼び出されないというメモリリークな仕様はいったい何でなのか・・・)

しかし、構造体定義の仕様についてはいくらか疑問もあります。

まず、もともとのDWのRegisterの仕様もそうですが、基本的に組み込み型と文字列型以外は扱えず、構造体自体をメンバにする事(入れ子構造体)はできません。(VB/VBAは可能・・・)
その場合、ユーザーが自分で子構造体を展開、メンバ名を変える必要があります。

配列は2バイト整数と1バイト整数だけ(文字列型共用)で、しかも一次元しかできません。

あと、C寄りの仕様ですが・・・

ポインタメンバはすべて実質Long値メンバになってしまいます。

共用体については完全に無視しました(^^;)

生成メソッドに引数を与えてメンバを初期化できるようにするかどうかは現在考慮中です。

Win32APIの大半ではそれほど致命的な問題は起きないのではないか、と思うのですが・・・

それで仕様について、何か皆さんのご意見がいただけたら嬉しいです。

VB/VBAではできるのに、これはできない、とかもお願いします。

そうそう、VB系の言語で、DeclareでDLL関数にユニコード文字列を渡すように定義できるものってありますかね?

なお、バージョンは7に上げてみました。

たか さん 2005年 12月 02日 01時 48分 12秒

とりあえず下記のようなコードを考えたのですが以下の点について教えていただけないでしょうか?
・引数が指定されていない場合引数の変数には何が入るのでしょうか?
・wavファイルがぞんざいするか確認し存在しない場合はエラーを表示することは可能でしょうか?
・popupでウィンドウが表示される際の音を消すことは可能でしょうか?
・popupで表示しているOKを押すと終わる処理をウィンドウを表示したままOKを押すまでwavの再生を繰り返すことは可能でしょうか?

どなたかご教授していただければたすかります。
よろしくお願いいたします。

Set named = WScript.Arguments.Named

pc1x = named("pc1")
pi1x = named("pi1")
pc2x = named("pc2")
pi2x = named("pi2")

Do While pc2x > 0
     temp = pc1x
     Do While temp > 0
          strSoundFile = named("wav")
          Set objShell = CreateObject("Wscript.Shell")
          strCommand = "sndrec32 /play /close " & chr(34) & strSoundFile & chr(34)
          objShell.Run strCommand, 0, False
          Wscript.Sleep 1000

          Set WSHShell=Wscript.CreateObject("Wscript.Shell")
          intMsg=WSHShell.Popup ("予定のお時間です。" & chr(13) & named("msg"),pi1x,"予定のお時間です",vbOKOnly)

          Wscript.Sleep 2000

          If intMsg = 1 Then
               temp = 0
               pc2x = 0
               pi2x = 0
          End If
          temp = temp - 1
     Loop
     pc2x = pc2x -1
     If pc2x > 0 Then Wscript.Sleep 1000 * pi2x
Loop

のん さん 2005年 12月 01日 20時 17分 41秒

すみません ちょっとコードがぬけていました。
拡張子.vbsで実行してください。


Main()

Private Sub Main()
   '処理を実行するユーザ名とコンピュータ名を取得
   Set objNetwork = CreateObject("Wscript.Network")
   strUserName = objNetwork.UserName
   strDomainName = objNetwork.UserDomain
   Set objNetwork = Nothing

   '現在使用しているパスワードを入力する
   strCurPass = InputBox( strDomainName & "\" & strUserName & "のパスワードを入力してください。" )
     if ( strCurPass = "" ) then
     Exit Sub
   End if

   '変更後のパスワードを入力する。
   strChgPass = InputBox( strDomainName & "\" & strUserName & "の変更後のパスワードを入力してください。" )
   if ( strChgPass = "" ) then
     Exit Sub
   End if

のん さん 2005年 12月 01日 19時 56分 39秒

>ムスタファ さん 2005年 12月 01日 10時 25分 42秒
>ドメインに属するユーザーhost001が自分のパスワードを変更できるスクリプトを探しています。


別サイトに書いてしまったスクリプトをちょっと変更したものなのですが、これでドメインに属するユーザのパスワードが変更できると思います。
難点はパスワードにマスクがかけられないこと、ユーザに設定されているパスワードポリシー等の制限が、パスワード変更メソッドを発行するまで判定できないこと(パスワード変更メソッドが失敗してみてはじめて分かる)です。


Main()

Private Sub Main()
     '処理を実行するユーザ名とコンピュータ名を取得
     Set objNetwork = CreateObject("Wscript.Network")
     strComputer = objNetwork.ComputerName
     strUserName = objNetwork.UserName
     strDomainName = objNetwork.UserDomain
     Set objNetwork = Nothing

     '現在使用しているパスワードを入力する
     strCurPass = InputBox( strDomainName & "\" & strUserName & "のパスワードを入力してください。" )
          if ( strCurPass = "" ) then

     End if

     '変更後のパスワードを入力する。
     strChgPass = InputBox( strDomainName & "\" & strUserName & "の変更後のパスワードを入力してください。" )
     if ( strChgPass = "" ) then
          Exit Sub
     End if


     'ADへの接続パスを取得
     Set objSysInfo = CreateObject("ADSystemInfo")
     arrDirectoryLocation = Split(objSysInfo.UserName, ",")
     For i = 1 to Ubound(arrDirectoryLocation)
          If i = 1 Then
               strLocation = arrDirectoryLocation(i)
          Else
               strLocation = strLocation & "," & arrDirectoryLocation(i)
          End If
     Next
     strOU = "LDAP://CN=" & strUserName & "," & strLocation
     Set objUser = GetObject( strOU )
     set oSD = objUser.Get("ntSecurityDescriptor")

     On Error Resume Next
     'パスワード変更メソッドを発行し、変更後のパスワードをセット
     objUser.ChangePassword strCurPass, strChgPass

     if (Err.Number = 0) then    
          MsgBox strDomainName & "\" & strUserName & "のパスワードは変更されました。"
     Else
          '発生するエラーをキャッチ
     End If
     Error.Clear
     On Error GoTo 0

     Set objSysInfo = Nothing
     Set objUser = Nothing
     set oSD = Nothing
End Sub

たか さん 2005年 12月 01日 17時 02分 12秒

初めて質問させていただきます。
メッセージボックス等で画面にOKボタンのみの表示のウィンドウを表示させてOKボタンをクリックするまで他の処理をループさせることは可能でしょうか?
入力待ちになってしまいメッセージボックスではうまくいきませんでした。ポップアップでは一度ウィンドウが消えてしまうので目的どおりにはいきません。
どなたかご教授していただければたすかります。
よろしくお願いいたします。

ばんのしゃーによかばんた さん 2005年 12月 01日 15時 49分 38秒

昔、バイナリをメールや掲示板に載せるとき、ishやuuencodeなんてのがありましたが、
同様に、バイナリなどをBase64エンコードして、テキスト化します。
ただ、それだけだと、デコード時に別途ツールが必要になるので、それが不要な、
自己解凍(デコード)型WSFファイルを作成します.WSF
――――――――――――――――――――――――――――――――――――――
<package>
<job>
<script language="VBScript">
Option Explicit
Dim fso
Dim arg
Dim ParentFolderName
Dim FileName
Dim BaseName
Dim ExtensionName
Dim sFile
Dim dFile

Set fso=CreateObject("Scripting.FileSystemObject")
Select Case WScript.Arguments.Count
Case 2
 sFile=WScript.Arguments.Item(0)
 dFile=WScript.Arguments.Item(1)
Case 1
 sFile=WScript.Arguments.Item(0)
 ParentFolderName=fso.GetParentFolderName(sFile)
 FileName=fso.GetFileName(sFile)
 BaseName=fso.GetBaseName(FileName)
 ExtensionName=fso.GetExtensionName(FileName)
 FileName=BaseName&".WSF"
 dFile=fso.BuildPath(ParentFolderName,FileName)
 FileName=fso.GetFileName(sFile)
Case Else
 WScript.Echo "Usage: Start MakeBase64Self.VBS infile [outfile]"
 WScript.Quit
End Select

Const adTypeBinary=1
Dim Src
Dim Dst
Dim Bin
Dim Dom
Dim Tmp
Dim TextFile

Set Src=CreateObject("ADODB.Stream")
Src.Type=adTypeBinary
Src.Open
Src.LoadFromFile sFile
Src.Position=0
Bin=Src.Read
Src.Close

Set Dom=CreateObject("Microsoft.XMLDOM")
Set Tmp=Dom.CreateElement("tmp")
Tmp.DataType="bin.base64"
Tmp.NodeTypedValue=Bin

Set TextFile=fso.CreateTextFile(dFile)
TextFile.Write getResource("s1")
TextFile.Write getResource("s2")
TextFile.WriteLine getResource("s3")
TextFile.Write getResource("f1")
TextFile.Write FileName
TextFile.WriteLine getResource("f2")
TextFile.WriteLine getResource("b1")
TextFile.WriteLine Replace(Tmp.Text,vbLf,vbCrLf)
TextFile.WriteLine getResource("b2")
TextFile.Close
</script>
<resource id="s1">&lt;package&gt;
&lt;job&gt;
&lt;script language="VBScript"&gt;</resource>
<resource id="s2">
Option Explicit
Const adTypeBinary=1
Dim dFile
Dim Dom
Dim Tmp
Dim Bin
Dim Dst
If WScript.Arguments.Count=1 Then
 dFile=WScript.Arguments.Item(0)
Else
 dFile=Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))&amp;getResource("filename")
End If
Set Dom=CreateObject("Microsoft.XMLDOM")
Set Tmp=Dom.createElement("tmp")
Tmp.DataType="bin.base64"
Tmp.Text=getResource("base64")
Bin=Tmp.NodeTypedValue
Set Dst=CreateObject("ADODB.Stream")
Dst.Open
Dst.Type=adTypeBinary
Dst.Write Bin
Dst.SaveToFile dFile
Dst.Close
</resource>
<resource id="s3">&lt;/script&gt;</resource>
<resource id="f1">&lt;resource id="filename"&gt;</resource>
<resource id="f2">&lt;/resource&gt;</resource>
<resource id="b1">&lt;resource id="base64"&gt;</resource>
<resource id="b2">&lt;/resource&gt;
&lt;/job&gt;
&lt;/package&gt;</resource>
</job>
</package>
――――――――――――――――――――――――――――――――――――――
例えば、notepad.exeをエンコードするなら、
〜.WSF notepad.exe [hoge.WSF]
第2引数を省略すると、第1引数から生成します。notepad.WSF
デコードするときは、
hoge.WSF [hogehoge.exe]
引数を省略すると、元の名前で復元します。notepad.exe


ばんのしゃーによかばんた さん 2005年 12月 01日 15時 49分 20秒

>魔界の仮面弁士 さん 2005年 11月 29日 16時 55分 27秒
>1. Win32_Process にて、対象のプロセスが存在するかチェック。
>2. 存在している場合には、__InstanceDeletionEvent にて待機。
>3. プロセスの終了を検知したら、再度 1 に戻ってチェック。
>4. プロセスが存在しなくなったら、処理開始。

この前、言ったばっかりなのにー。

>ばんのしゃーによかばんた さん 2005年 11月 20日 16時 46分 27秒
>よくやりそうなミス。

マルチプロセシング環境では、
AAAAAAAAAA
BBBBBBBBBB
と2行を書けば、その間に0〜無限大の隙間があると思わないといけません。

AAAAAAAAAA     存在チェック。ここでは有った。
隙間、0〜無限大の隙間     ここで終わった。
BBBBBBBBBB     終了監視。待ちぼうけ。みたいに。

この隙間を塞ぐには、隙間を跨ぐように、鎹(かすがい)を掛けます。
BBBBBB
B AAAAAAAAAA
B 隙間、0〜無限大の隙間
BBBBBB

みたいに。つまり、

2.1 __InstanceDeletionEvent にて監視開始。
>1. Win32_Process にて、対象のプロセスが存在するかチェック。
4. プロセスが存在しなくなったら、ループ脱出、処理開始。
2.2 存在している場合には、次の事象待機。ExecNotificationQuery.NextEvent
>3. プロセスの終了を検知したら、再度 1 に戻ってチェック。

これでOKです。

とは言え、実用的には、お勧めは、

Do
>1. Win32_Process にて、対象のプロセスが存在するかチェック。
>4. プロセスが存在しなくなったら、ループ脱出、処理開始。
 WScript.Sleep 適当な精度
Loop

です。

他のOSなら、事象監視はカーネルレイヤに近いところで、
性能クリティカルに作ってあるので、0.n+0 対 0.n+1
システムに任せたほうが有利。
WindowsのWMIの事象監視は、アプリレイヤで作ってるみたいで、
(n+1)+0 対 n+1 てな感じでしょうか。
OSがWindowsの場合、アプリでやっても性能的にあまり変わらない
ように思います。かえって軽いかも知れません。
それなら、単純なほうがいいや。との判断です。
「よくやりそうなミス」の心配もないし。

>頻繁に起動と終了を繰り返すプロセスでなければ、

と言うか、
いずれの場合も、対象のプロセスが存在しない切れ目、ただし、
初めての切れ目とは限らない、は検出できますが、当然ながら、
いざ処理開始したときに、新たなプロセスが存在しないこと、
を保証するものではありません。それでも構わないか、或いは、
一般的には難しいですが、入り閉塞の手立てを運用的にでも
考えないといけません。


kagilinn さん 2005年 12月 01日 11時 46分 41秒

>>魔界の仮面弁士 さん 2005年 11月 29日 16時 55分 27秒
ありがとうございます。
WMIは使った経験が無いので、示されたサイトや
ここのリンク集など資料を当たってみます。

ムスタファ さん 2005年 12月 01日 10時 42分 56秒

下記の質問に追記いたします。
ホスト名もhost001です。

ムスタファ さん 2005年 12月 01日 10時 25分 42秒

ドメインに属するユーザーhost001が自分のパスワードを変更できるスクリプトを探しています。
cmdexeが楽かなと思い、net userコマンドで試しましたが、ローカルアカウントのパスワードしか反映されず、/domainオプションを付けると当然権限がないため蹴られます。
MSのサイトを探し、次のようなスクリプトを書いてみましたが、うまくいきません。
set objuser = getobject("LDAP://cn=host001,dc=xxx.xx.xxx")
objuser.set password("abcdefg")

背景には、ドメインコントローラ側で30日毎にユーザーが自身のパスワード更新を強制する設定になっているのですが、毎回毎回、手動で変更する手間を省きたいという狙いがあります(この際セキュリティ云々は無視します)。

アドバイス頂けますと誠に助かります。よろしくお願いいたします。

キタシナガワ さん 2005年 12月 01日 03時 31分 34秒

はじめまして。

 あるアプリケーションが利用しているファイルを知りたいのですが、WMI で取得する方法をご存知の方はいらっしゃるでしょうか。是非にもご教示いただきたく御願いする次第です。
 
 例えば Excel で c:\temp\hogehoge.xls を開いているとき、これを知りたいわけです。SysIntrnals の Process Explorer (http://www.sysinternals.com/Utilities/ProcessExplorer.html)や handle.exe (http://www.sysinternals.com/Utilities/Handle.html)では取得できる情報です。欲しいそのファイルだけが表示されるわけではないのですが、Type = File のエントリで見つけることができます。

 WMI で何とかなるかとWMI Object Browser で当たりをつけようとしているのですが、
WIN32_Processにぶら下がっている
CIM_ProcessExecutable.Antecedent

CIM_DataFile
には現れて来ません。
 WMI関係のスクリプトで Win32_Process 関係のものが掲載されているウェブサイトも幾つか巡ったのですが、該当するものに巡り会えぬ状況です。

何卒宜しく御願い致します。

Return