さっきのはデバイスの列挙だけでした。
特定のデバイスの値の一覧を取得するコードも入れるとこんな感じですね。
Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer(vbNullString, "root\default")
Set Reg = Service.Get("StdRegProv")
Const HKEY_LOCAL_MACHINE = &H80000002
rootKey = "SYSTEM\ControlSet001\Enum\USBSTOR"
searchString = "A-DATA USB Flash Drive USB Device"
Reg.EnumKey HKEY_LOCAL_MACHINE, rootKey, keys
For I=0 To UBound(keys)
Reg.EnumKey HKEY_LOCAL_MACHINE, rootKey & "\" & keys(i), subKeys
Reg.GetStringValue HKEY_LOCAL_MACHINE,rootKey & "\" & keys(i) & "\" & subKeys(0), "FriendlyName", value
If value=searchString Then
Reg.EnumValues HKEY_LOCAL_MACHINE,rootKey & "\" & keys(i) & "\" & subKeys(0),values,types
For J=0 To UBound(values)
Select Case types(j)
Case 1
TypeStr = "REG_SZ"
Reg.GetStringValue HKEY_LOCAL_MACHINE,rootKey & "\" & keys(i) & "\" & subKeys(0),values(j),strValue
Case 2
TypeStr = "REG_EXPAND_SZ"
strValue=""
Case 3
TypeStr = "REG_BINARY"
strValue=""
Case 4
TypeStr = "REG_DWORD"
strValue=""
Case 7
TypeStr = "REG_MULTI_SZ"
strValue=""
End Select
usbInfo=usbInfo & values(j) & " (" & TypeStr & ") : " & strValue & vbCrLf
Next
End If
out = out & value & vbCrLf
Next
msgbox out
msgbox usbInfo
Set Reg = Nothing
Set Service = Nothing
Set Locator = Nothing
>Gowasu_na さん
まずUSBSTORキーの下にあるサブキーの一覧をEnumKeyメソッドで列挙して、
それぞれのサブキーの下にあるシリアルNOのキーをEnumKeyメソッドで取得、
ここでシリアルNOのキーは一つだけなので配列の(0)を取ってくる。
そのシリアルNOのキーに含まれるFriendlyNameというエントリの値をGetStringValueメソッドで読む。
という感じになるでしょうか。
UBound関数は配列の要素数-1の値を返します。
またVBSの配列は0から始まるので、0からUBoundの戻り値までループを回せば、配列のすべての要素を列挙できます。
Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer(vbNullString, "root\default")
Set Reg = Service.Get("StdRegProv")
Const HKEY_LOCAL_MACHINE = &H80000002
rootKey = "SYSTEM\ControlSet001\Enum\USBSTOR"
Reg.EnumKey HKEY_LOCAL_MACHINE, rootKey, keys
For I=0 To UBound(keys)
Reg.EnumKey HKEY_LOCAL_MACHINE, rootKey & "\" & keys(i), subKeys
Reg.GetStringValue HKEY_LOCAL_MACHINE,rootKey & "\" & keys(i) & "\" & subKeys(0), "FriendlyName", value
out = out & value & vbCrLf
Next
msgbox out
Set Reg = Nothing
Set Service = Nothing
Set Locator = Nothing
管理人牟田口大介 さん
いつも、お世話になります。
未だに、USBの接続履歴の取得方法に悩まされています。^^;
<前回の問い合わせ>
接続時のタイムスタンプ値:Disk Stamp: 01/14/2011 23:47
Volume Stamp: 06/05/2010 11:31
の列挙値が判明できません。(何とか知りたいのですが)
まずは、レジストリの値を取得しようと、WMIのStdRegProvを初めて使ってみました。^^;
★以下のコードを実行すると、
エラー:型が一致しません:'Ubound'
コード: 800A000D
ソース: MicrosoftVbscript実行時エラー
とでてしまいます。
配列の宣言がどうもよくわかりません。
どうか、ご教示願います。
レジストリ値を参照する目的は、USBSTOR内にある FriendlyName属性の値「A-DATA USB Flash Drive USB Device」を取得して、テキストに表示したい。また、USBSTOR内にあるすべてのFriendlyNameを取得し、過去に接続されたUSB名を特定したいと考えています。
(前回、ご教示を頂いたUSB History GUIのコマンドライン版を使用して、標準出力もいいのですが、できれば勉強のために頑張りたいと思っています。)
以下、コードソースです。
Dim Reg
Dim Locator
Dim Service
Dim RegName
Dim RegType
Dim MesStr
Dim TypeStr
Dim I
Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer(vbNullString, "root\default")
Set Reg = Service.Get("StdRegProv")
Const HKEY_LOCAL_MACHINE = &H80000002
Reg.EnumValues HKEY_LOCAL_MACHINE, _
"SYSTEM\ControlSet001Enum\USBSTOR", RegName, RegType
'検索したい値
arrValueName ="A-DATA USB Flash Drive USB Device"
For I = 0 To Ubound(RegName)
Select Case RegType(i)
Case 1
TypeStr = "REG_SZ"
Reg.GetStringValue HKEY_LOCAL_MACHINE,"SYSTEM\ControlSet001Enum\USBSTOR",arrValueName, arrValue
Case 2
TypeStr = "REG_EXPAND_SZ"
Case 3
TypeStr = "REG_BINARY"
Case 4
TypeStr = "REG_DWORD"
Case 7
TypeStr = "REG_MULTI_SZ"
End Select
MesStr = MesStr & RegName(i) & " : " & TypeStr & vbCrLf
Next
MsgBox "レジストリの値の名前と種類を列挙します。" & vbCrLf & vbCrLf & MesStr & vbCrLf & vbCrLf & arrValueName
Set Reg = Nothing
Set Service = Nothing
Set Locator = Nothing
以上
よろしく、お願いします。
>管理人さん
ありがとうございます。起動中のプロセスIDをWSH経由で取得できるんですね。勉強になります。
Execメソッドでプログラムを起動してprocessIDプロパティを取得する方法には行き着いたのですが、対象プログラムが既に起動中という条件だったので。。。
明日、会社で試してみようと思います。
>Tommy さん
AppActivateメソッドの引数にはウィンドウタイトルの他に、ウィンドウを表示しているプロセスのプロセスIDを指定することもできます。
これを利用してはいかがでしょうか?
プロセスIDを取得するにはWMIのWin32_Processクラスを用います。
この辺りが参考になるかと思います。
Hey, Scripting Guy! バッチ ファイルに関連付けられているプロセス ID を特定する方法はありますか
http://gallery.technet.microsoft.com/scriptcenter/ja-jp/5109d5df-6116-40a4-9f4e-31e51ecf0edd
はじめまして。
テクニック集など参考にさせていただいております。
1ヶ月ほど悩んでいて解決できなかったので、お知恵をお借りしたく書き込みました。
現在、会社のPCにて一定時刻になったら特定のアプリケーションのスクリーンショットを取得・印刷するスクリプトを書いています。
ところが、対象となるウィンドウはあるアプリケーションのサブウィンドウであり、appActivate("ウィンドウタイトル")で指定ができないのです。
わかり辛い表現で恐縮ですが、タスクマネジャーを見ていると、
1.対象アプリケーションにフォーカスがあるときは、タスクマネージャーにサブウィンドウのタイトルが表示される。
2.サブウィンドウにフォーカスがあるときも、タスクマネージャーにサブウィンドウのタイトルが表示される。
3.フォーカスが他のアプリケーションや、全ウィンドウを一旦最小化し、対象アプリケーションからフォーカスを外すと、タスクマネージャーにサブウィンドウのタイトルが表示されない。
※このPCにおいては常に最前面に表示されるアプリケーションが起動しており、正常にフォーカスを移すためには、一旦全ウィンドウを最小化してフォーカスを外し、対象ウィンドウを指定する必要があると理解しています。
従って、一旦3.の状態になった後でAppActivateをしても、ウィンドウが存在しないと言われてしまいます。
このアプリケーションがバージョンアップする前はIEベースだったので、普通にウィンドウを指定できたのですが、現在どうすれば良いのか頭を抱えております。
何かヒントになるものでもかまいませんので、ご教授下さい。
よろしくお願いします。
>Gowasu_na さん
USBの接続履歴はレジストリに保持されているんですね。勉強になりました。
さて、レジストリキーの値をGoogleで検索してみるとこういうページをみつけました。
USB History Viewing - Forensics Wiki
http://www.forensicswiki.org/wiki/USB_History_Viewing
ここの記述によると、 setupapi.logというファイルにUSBデバイスが最初に接続された日時が記録されているようです。
また、デバイスが最終的に接続された日時は対応するレジストリキーのタイムスタンプに相当するようです。
今回必要なデータは後者なのですが、レジストリキーのタイムスタンプを取得するにはWin32APIの
RegQueryInfoKey関数を使わないといけないっぽいです。
WSHでWin32APIをじかに扱う方法は、あるコンポーネントを使えばなくもないのですが普通はできません。
レジストリのタイムスタンプを表示するためのツールを書いた - 葉っぱ日記
http://d.hatena.ne.jp/hasegawayosuke/20091208/p1
こういうのをスクリプトから呼び出すとかしたほうが無難かな、と思います。
最終的に読み込むレジストリキーを特定するのはスクリプトでできるかと思います。
WshShellに含まれるメソッドではレジストリキーやエントリの値は読めますが、キーや値の列挙ができないので、WMIのStdRegProvを使うことになるかと思います。
スクリプトセンターで「レジストリ」を検索するとサンプルはみつかると思います。
http://gallery.technet.microsoft.com/scriptcenter/ja-jp/site/search?f[0].Type=RootCategory&f[0].Value=operatingsystem&f[0].Text=%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%20%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0&f[1].Type=SubCategory&f[1].Value=registry&f[1].Text=%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA
まあこうやって一から作っていくのは面倒なので、いっそのことUSB History Dumpの出力を読み取るだけにしたほうがいいんじゃないかと思います。
http://sourceforge.jp/projects/sfnet_usbhistory/
(これはUSB History GUIのコマンドライン版です)
標準出力を読み込むのはWshExecを使います。
WshShellオブジェクトを利用する(3) − @IT
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh14/cformwsh14_01.html
このへんが参考になるかと。
管理人牟田口大介 さん
いつもお世話になっています。
色々とお調べいただきありがとうございます。
未だUSB接続履歴取得に苦慮しています。^^;
フリーソフトに「USB History GUI」がありますが、
それをWindows7の環境で実行してみると
<USB History GUI>の実行結果
(1) --- A-DATA USB Flash Drive USB Device
instanceID: dc44f2640266be&0
ParentIdPrefix:
Driver:{4d36e967-e325-11ce-bfc1-08002be10318}\0007
Disk Stamp: 01/14/2011 23:47
Volume Stamp: 06/05/2010 11:31
と表示してくれます。
Windows7のレジストリ内を見てみると、
\HKEY_LOCAL_MACHINE\SYSYTEM\ContorolSet001\Enum\USBSTOR内に
instanceIDの値 → 上記USBSTOR内のフォルダ名(dc44f2640266be&0)が同値、
Driveの値 → 上記フォルダ内
があるのですが、
接続時のタイムスタンプ値:Disk Stamp: 01/14/2011 23:47
(Disk Stampは、実際にUSB接続するたびに、変更されています。)
やボリュームのタイムスタンプ値:Volume Stamp: 06/05/2010 11:31
の場所がよくわかりません。
どのように抽出しているのでしょうか。(なんとか知りたいです。)
また、スクリプトからレジストリ内の値を取得する方法の資料がありました
らご教示をお願いします。
>Gowasu_naさん
少し調べてみましたがWindows XPではRemovable Storage Serviceが「システム」イベントログにUSBストレージの接続情報を記録するそうです。
(ちなみにイベントログはレジストリではなくsystem32フォルダの下にファイルとして保持されています。Win7なら%SystemRoot%\System32\Winevt\Logs\にあります)
イベントログをvbsから取得するにはWMIのWin32_NTLogEventクラスを使います。
サンプルは以下のページにいろいろあります。
http://technet.microsoft.com/ja-jp/scriptcenter/ff602887.aspx
Windows Vistaや7ではこのサービスは動作していないようで、イベントログにも残らないようです。サービス名が変わったのか、他のサービスが肩代わりしているのかはちょっと分かりません。
もしかするとVistaや7ではUSB接続履歴は自分で記録しないといけないのかもしれません。
幸い、スクリプトでUSBストレージの接続を検知する方法はあるようです。
Hey, Scripting Guy! リムーバブル ドライブがいつ接続されたかを知る方法はありますか
http://gallery.technet.microsoft.com/scriptcenter/ja-jp/940f4147-3196-4d5a-a9c5-3e00e244cc1e
管理人牟田口大介さん
ありがとうございます。
どうしても、参考となる項目が見つかりません。
やはり、VBscriptでは、USB接続履歴の抽出は難しいのでしょうか?(当該情報はレジストリ内にある?!)
なんとかプログラム作成して抽出をしたいです。
よろしく、お願いします。^^;
>Gowasu_naさん
システム情報の取得は主にWMIを使って行います。
詳しくはTechNetのスクリプトセンターに分野別にスクリプトが紹介されているので、参考にされるとよいでしょう。
http://technet.microsoft.com/ja-jp/scriptcenter/default#product
おそらく、ご呈示の情報はすべて取れるんじゃないかと思います。
USB接続履歴はたぶんイベントログから取ってこれると思います。
はじめまして!!VBscript初心者です。
早速ですが、システム情報取得するスクリプトを作成しようと思っています。
OS情報等の取得、ディスク情報(USBメモリ接続時も含む)、システム日時情報、アプリケーションのインストール情報、USB接続履歴情報が欲しいと思っています。参考となるオブジェクト、サンプルソースがありましたらご教示願います。
>初心者 さん
それはエクスプローラで共有フォルダを開く際、
ユーザー名とパスワードを入力して、資格情報を保存する設定にしているからではないですか?
エクスプローラで入力した資格情報はWSH側には影響しなかったと思います。
何度もすいません。
現在私のログインで共有フォルダの閲覧はできるのですが、
”共有フォルダのファイル一覧を取得できる権限”とは違うものなのでしょうか。
>初心者さん
必要なのは共有フォルダのファイル一覧を取得できる権限、となります。
vbsをエクスプローラから実行すると、現在ログオンしているユーザーの権限でスクリプトが実行されます。
このログオンユーザーに共有フォルダへのアクセス権がなければ件のスクリプトはうまくいかないでしょう。
エクスプローラで、またはWshNetwork.MapNetworkDrive()を使用して、
共有フォルダにネットワークドライブを割り当て、その際に共有フォルダへのアクセス権を持っている資格情報を指定してやれば、
おそらくその割り当てたネットワークドライブに対してはWSHからアクセスできるかと思います。
あとはスクリプト自体を共有フォルダへアクセス可能なユーザー権限で実行するのも手かと思います。
それにはRunAsコマンドが使えます。
Hey, Scripting Guy! 代替のユーザー資格情報で RunAs コマンドを使用してスクリプトを実行する方法はありますか
http://gallery.technet.microsoft.com/scriptcenter/ja-jp/c3bf01ff-3eac-4998-8559-e80d56471692
そのほか、タスクスケジューラを使うことでもユーザーを指定することができます。
スクリプトファイルはデスクトップに置きドラックアンドドロップで
共有フォルダにあるフォルダを処理しようと思っています。
書き込みは"C:\Users\username\Desktop\test.txt"
共有フォルダのファイルパスは""\\server\share\Users\username\Desktop\test.txt"
といった感じです。
エラーメッセージは無くただテキストファイルが作成され何も出力されないといった状態です。
先ほども書きましたがローカルなフォルダの処理はできます。
権限ですか‥。よく分からないのですが。会社のサーバーにある共有フォルダなので無理ですかね。
どういった権限が必要になるのかおしえてください。
>初心者さん
>・共有フォルダにあるファイルのパスが文字化けする。
こちらでは再現しませんでした。
ただ、ファイル名にUnicode文字が使われている場合、そのファイル名を書き込もうとするとOpenTextFileメソッドをそのまま実行すると失敗します。
その場合はOpenTextFileメソッドの第4引数に1を指定しUnicodeで書き込みます。
>・ローカルなデスクトップ上でテキストファイルを出力したいのですが
> 出力されない
これも再現しませんでした。
"C:\Users\username\Desktop\test.txt"などに書き込もうとすると失敗するということでしょうか?
それとも"\\server\share\Users\username\Desktop\test.txt"とかですか?
そのときのエラーメッセージはなんでしょうか?
書き込みできません、というものなら権限の問題かと思いますが…
いつもお世話になっております。
FileSystemObjectのOpentextFileを使用しファイルのフルパスを
テキストファイルに出力しようと考えていますが下記の部分でうまくいきません。
・共有フォルダにあるファイルのパスが文字化けする。
・ローカルなデスクトップ上でテキストファイルを出力したいのですが
出力されない
(ローカルなドライブにあるファイルは出力される)
以上2点でうまくいきません。
FileSystemObjectは共有上ではうまく動かないのでしょうか。
教えてください。
>hidebou さん
スクリプトファイルを手軽にexeにできるのは良いですね。
機会があったら私も使わせていただこうと思います。
管理人様 お久しぶりです。
WSHからHTMLインスタンスを操作しようとする試みのHTABOXコアもバージョン
2.30になり、関連ファイルをEXEリソースに格納して配布できるようになりま
した。
http://kuroda.bglb.jp/htabox/htaboxcore.zip
これはこれで目指す地点に到達できたのですが、HTMLApplicationが持つ簡単
というキーワードからは少し離れてしまった感があるので、コア上のスクリ
プトで単にファイルドロップだけでEXEファイルが生成されるHTABOXクイック
http://kuroda.bglb.jp/htabox/quick.zip
を作成いたしました。このクイックは格納されたファイル群を一時生成して
EXEの実行にみせかけますが、実行HTMLのスクリプトをEXE内でパースしソース
が隠蔽されている状態を作ることができます。是非皆さんの珠玉のスクリプト
を実行、配布する際に活用していただければ幸いです。
寒さも厳しくなりますのでご自愛ください。 失礼しました。
>とまとさん
>う〜ん。IDとPWを入れるとこの場合変になります。
input要素のonclickイベントで背景画像を消す処理があり、スクリプトから値を入れるとそれが実行されないためですね。
動作に支障はないと思いますが、
myIE.document.getElementById("strmemberid").style.backgroundImage="none"
myIE.document.getElementById("strpassword").style.backgroundImage="none"
のようにすれば見た目が変になるのを防げるかと思います。
>あとentersubmit()の呼び出し方がわかりません
myIE.document.parentWindow.entersubmit
で呼べます。
myID = "yukina0893"
myPASS = "aaaa"
myP = "http://sf.hangame.co.jp/"
'----------
Set myIE = CreateObject("InternetExplorer.application")
myIE.Visible = True
'----------ログイン
myPAGE = "http://sf.hangame.co.jp/"
myIE.Navigate myPAGE
Call mySTOP(myIE) '
'----------
Sub mySTOP(myIE) 'まちあわせる共通処理
Do
If myIE.Busy = False Then Exit Do
Loop
Do
If myIE.Document.readyState = "complete" Then Exit Do
Loop
End Sub
myIE.document.getElementById("strmemberid").value =myID
myIE.document.getElementById("strpassword").value =myPASS
entersubmit()
う〜ん。IDとPWを入れるとこの場合変になります。
あとentersubmit()の呼び出し方がわかりません
>とまとさん
IEのオブジェクトを使ってDOMを操作するということでしょうか?
そのページではformやinput要素にidが振ってあるので、getElementById()を使って直接要素を取得できると思います。
ユーザー名は"strmemberid"
パスワードは"strpassword"
というidになってますね。まずはこれらのvalueに値を入れてやります。
submitボタンはないので、JavaScriptのentersubmit()という関数を呼べばいいようです。
formにも"loginform"というidが振られているのでこれに対してsubmit()を実行してやるのでもいいかもしれません。
(entersubmit()でほかに処理がある場合はそれだけだと駄目でしょうけど)
XMLHTTPを使ってformの対象であるhttp://id.hangame.co.jp/login.aspに値をpostする方法もあると思いますが、entersubmit()がどういう処理をしてるか(具体的に何の値をpostしてるのか)調べないと使えないかと思います。
http://sf.hangame.co.jp/
ID:haruki893
PW:aaaa
vbsで自動ログインを作成したいのですが
HTMLが長く良く分かりません><
ご教示いただければありがたいです
ID:haruki893
PW:aaaa
vbsで自動ログインを作成したいのですが
HTMLが長く良く分かりません><
ご教示いただければありがたいです
>きー坊 さん
>1.対象のディレクトリにフォルダーのショートカットがあるか検索→ある場合ショートカットが置かれたフォルダを開く。
可能です。
まずショートカットの検索は、FileSystemObjectオブジェクトを用いて
拡張子が"lnk"のものを探します。
具体的には対象フォルダをGetFolderメソッドでFolderオブジェクトを取得し、
そのFilesプロパティによってフォルダ内のFileオブジェクトのコレクションを得て、
各要素のPathプロパティに対してGetExtensionNameメソッドを使用し拡張子を参照します。
その値が"lnk"のものを対象とします。
こちらの記事が参考になると思います。
FileSystemObjectオブジェクトを利用する(3) − @IT
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh18/cformwsh18_01.html
続いて先ほど得たパスを引数にしてWScript.ShellオブジェクトのCreateShortcutメソッドを用いて
WshShortcutオブジェクトを取得します。そのTargetPathプロパティを参照します。
こちらの記事が参考になると思います。
WshShellオブジェクトを利用する(3) − @IT
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh14/cformwsh14_02.html
TargetPathの値に対してFileSystemObjectオブジェクトのFolderExistsメソッドを用います。
Trueならそれはフォルダのショートカットです。
最後にWScript.ShellオブジェクトのRunメソッドに対象フォルダのパスを指定して開きます。
フォルダに半角スペースが含まれる場合は"で囲います。
こちらの記事が参考になると思います。
WshShellオブジェクトを利用する(1) − @IT
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh12/cformwsh12_01.html
>2.指定したフォルダにショートカット(フォルダ)が置かれた場合、都度知らせてくれるようにする。→メッセージ画面を出すか、指定しているディレクトリを開く。
可能です、がエレガントな方法はないかもしれません。
一つの方法は、タスクスケジューラを用いて1.のスクリプトを定期実行してやる方法です。
もう一つはスクリプト内で無限ループを回して1.の処理をさせ続ける方法です。
いずれにせよ一度発見したショートカットはもう通知しないようにする工夫が必要になります。
2つ目の方法だとWMIのExecNotificationQueryメソッドを使う手もありますがちょっと難しいです。
参考まで。
Hey, Scripting Guy!
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/apr05/hey0404.mspx
>3.フォルダをリネームする。
可能です。FileSystemObjectのMoveFolderメソッドを使います。
こちらの記事が参考になると思います。
FileSystemObjectオブジェクトを利用する(1) − @IT
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh16/cformwsh16_02.html
何かわからないことがあれば聞いてください。
初投稿になります。
自身で調べてみたのですが答えを見つけられなかったので…
wshを使用して下記の事象はできるでしょうか?
1.対象のディレクトリにフォルダーのショートカットがあるか検索→ある場合ショートカットが置かれたフォルダを開く。
2.指定したフォルダにショートカット(フォルダ)が置かれた場合、都度知らせてくれるようにする。→メッセージ画面を出すか、指定しているディレクトリを開く。
3.フォルダをリネームする。
基礎ができていれば簡単なのかもしれませんが、私には解決できそうにないので、お手数ですがご回答よろしくお願いいたします。
>森さん
WMIを使用してEnumKeyメソッドでレジストリのサブキーを列挙してやれば可能です。
Const HKEY_LOCAL_MACHINE = &H80000002
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}" & _
"!\\.\root\default:StdRegProv")
sUninstallKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
oReg.EnumKey HKEY_LOCAL_MACHINE, sUninstallKey, aSubKeys
If IsArray(aSubKeys) Then
For Each sSubKey In aSubKeys
If(InStr(sSubKey,"{26A24AE4-039D-4CA4-87B4-2F83216") Or InStr(sSubKey,"{3248F0A8-6813-11D6-A77B-00B0D016")) Then
'ここでsSubkeyに対してアンインストール処理をする
'以下はUninstallStringの文字列を取る方法
'oReg.GetExpandedStringValue HKEY_LOCAL_MACHINE,sUninstallKey&"\"& sSubKey, "UninstallString", sValue
End If
Next
End If
sSubKeyに"{3248F0A8-6813-11D6-A77B-00B0D016…}"などのキー名が入ります。
GetExpandedStringValueメソッドを使えば"UninstallString"の値を直接取ることもできます。この場合sValueにその値が入ります。
初歩的なVBScriptの質問です
JAVA 1.6のバージョンをすべて削除するVBSCRIPTを作成しています。
実現したいことは
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
にあるフォルダーを全て検索して
{26A24AE4-039D-4CA4-87B4-2F83216または{3248F0A8-6813-11D6-A77B-00B0D016から始まるフォルダーを検索します。
MsiExec.exe /x 上記の対象になったフォルダーとコマンドを発行して
アンインストールしたいです。
現状ではレジストリーを使わずにC:\WINDOWS\Installer中のフォルダーの中身に検索をかけておこなっています。
何卒ご教示お願い申し上げます。
>tigers1985 さん
たしかにそのままErr.Descriptionが取れると便利ですよね。
なぜそうなっていないかは、ちょっとわかりません。
>hidebou さん
開発おつかれさまです。
便利そうですね。
完成を楽しみにしています。
>いーちゃん さん
エクスプローラで直接D&Dしたときはその現象は出ますでしょうか?
まずはスクリプトの問題なのか、エクスプローラの問題なのかを切り分けると良いと思います。
>なかむら さん
WScript.Shellのレジストリ情報が壊れていると思われます。
当方の環境ではHKEY_CLASSES_ROOT\WScript.Shell\CLSIDの(既定)値は{72C24DD5-D70A-438B-8A42-98424B88AFB8}となっています。
WSHを再インストールすれば治ると思いますが、Win7用のパッケージってなかったですね。
正常に動作している環境からレジストリキーをコピーすればあるいは復旧するかもしれませんが、確実ではない上副作用もありうるのであまりお勧めできません。
Win7を再インストールするのが手っ取り早いように思われます。
はじめまして。
先日、とあるソフトウェアをインストールしていると、インストール時に実行されているVBスクリプトでエラーが
出力され、エラーとなっているスクリプトを見てみたところ、
Set objWshShell = CreateObject("WScript.Shell")
の行でエラーとなっていました。
エラー内容は、
---------
文字: 1
エラー: ClassFactory は要求されたクラスを提供できません
コード: 80040111
ソース: (null)
---------
でした。
OS は Windows 7 なのですが、なぜか WSH が使えなくなってしまっています。。。
WSH を使えるようにするにはどうすればよいかご存知の方がいらっしゃいましたら教えてください。
初めて投稿します。
全くの初心者なのですが、以下のスクリプトを使ってフォントをインストールしています。
--------------------------------------------------
Const FONTS = &H14&
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(FONTS)
objFolder.CopyHere "C:\Scripts\Myfont.ttf"
--------------------------------------------------
通常、フォントのインストールは数秒で終了しているのですが、ある機種に限ってインストールが完了するまでに5〜8分もかかってしまいます。
調べてみたところ、CopyHereの実行を契機にスクリプトのCPU使用率が100%近くになったまましばらくその状態が続き、5〜8分後にCPUが開放され、フォントのインストールが開始されることがわかりました。
ちなみにPCのOSは「Windows XP SP3」ですが、フォントのインストールが数秒で終了する他のPCのOSも同じ「Windows XP SP3」です。
Windowsファイアウォールやウイルス対策ソフトを無効にしてみましたが、現象は変わりませんでした。
これだけでは情報が足らないかもしれませんが、回避策をご存知の方、ご教示いただければ幸いです。
宜しくお願い致します。
>管理人様
せっかくレスをいただいたのに貧乏暇なしでお礼が遅れてしまいました。
今度はHTAのインプロセス起動、親の無いHTMLダイアログ起動をCOMでラップしWSH環境から利用してもらうという方向性でHTABOX2を開発しております。
現在デモンストレーションを公開中でJS、VBSからの直接HTML操作は新鮮な
体験になるのではないかと思っております。http://kuroda.bglb.jp/htabox/demo.zip
酷暑つづきの折、くれぐれもお体をご自愛ください。
自己レスです。
逆転の発想というか、やや邪道ではありますが、
以下のようにすれば、それらしきメッセージは取得できました。
(1)ADSIオブジェクトの操作でエラーが発生したとき、
同じパスのオブジェクトをADORecordsetで取り直す。
(2)Err.Descriptionプロパティーを取得。
(3)そのままだと、用語が「テーブル」などのDB用語になっているので、
Replace関数で、OU,CNなど必要に応じて変換
ただ、この方法はADSIオブジェクトの取得に失敗したときだけで、
取得は成功したが、その後に想定外のエラーが起きたときには対応が
できません。
最終的にどうするかはこれから検討しようとは思いますが、
多少メッセージがわかりにくくても、
現状の、
>cscript.exeが出していると思われる、
>エラー情報が取得できます。
>(エラー行、メッセージetc)
の方が、エラー発生行が確実にわかるので、
エラー情報がそのまま開発者側にくることが
前提ならば、かえって問題解決が早い気もします。
お客様(特にエンドユーザー)が
その情報で対処できるかというと無理でしょうが。
ただ、素朴な疑問として思うのは、
なぜ、ADSIでメッセージ文字列をサポートしていないんでしょうね?
ldp.exeで同じ様なこと(正確には手動操作ですが)をしてエラーになった場合は、
ちゃんと日本語でメッセージ出しているのに。
>tigers1985さん
私の知る限りでは、ない、ということになります。
もしご存知の方がいらっしゃったら補足のほどよろしくお願いします。
>管理人牟田口大介 さん
ご回答ありがとうございます。
>ADSI 2.5 のエラー コード
>http://support.microsoft.com/kb/242076/ja
>
>ここの表を使ってエラー番号とエラー内容の関連付けをしていくことになる>と思います。
昨日、ググッてでて来たページ(ちなみに英語)でも
err.numberをhex関数で16進化して、
そのキーで
http://support.microsoft.com/kb/242076/ja
を探せって書いてありました。
逆に言うと、それくらいしか方法がないということでしょうか?
ADOやRDOでサポートされているような、
Errorコレクション等は、ADSIではサポートされていないという
理解でよろしいのでしょうか?
>tigers1985さん
ADSI 2.5 のエラー コード
http://support.microsoft.com/kb/242076/ja
ここの表を使ってエラー番号とエラー内容の関連付けをしていくことになると思います。
手動で確認するのが面倒であればエラーメッセージをコードに埋め込むのがいいでしょう。
Set adsiErrors=WScript.CreateObject("Scripting.Dictionary")
adsiErrors.Add &h80005000,"無効な ADSI パス名が渡されました。 Verify that the object exists on the directory server and check for typos in the path. "
adsiErrors.Add &h80005001,"不明な ADSI ドメイン オブジェクトが要求されました。 Verify the path of the domain object. "
...
On Error Resume Next
ADSIの操作
If Err.Number<>0 Then
MsgBox Err.Number & ":" & adsiErrors(Err.Number)
End If
On Error Goto 0
...
とかになるでしょうか。
はじめて投稿します。
とあるツールの外部Exe実行ツール
→cscript.exeでvbscriptを起動
→ vbscriptからADSIを参照して、Active Directryを読み書き
というプログラムがあります。
On Errorステートメントを特に記述しなければ、
「とあるツール」でcscript.exeが出していると思われる、
エラー情報が取得できます。
(エラー行、メッセージetc)
現在はその情報を使って処理履歴に出力しています。
「On Error Resume Next」を記載した場合、
Errオブジェクトの情報を利用することになると思いますが、
Numberプロパティーは取得できますが、
Descriptionプロパティーが取得できません。
自分なりに調べてみて、でているNumberプロパティーの値が、
ADSIが出しているエラーコード(10進数)らしいということはわかったのですが、
エラーコードを元に、比較的簡易にメッセージを取得する方法は無いものでしょうか?
イメージとしては、
VBからADOやRDOでDBに接続しているときに、
VBのErrオブジェクトではなく
ADOやRDOのエラー情報を取得するやり方のようなものがわかれば、ありがたいです。
ご存知の方、ご教示よろしくお願いします。
>hidebou さん
HTAのかゆいところに手が届く、Another HTA Environmentという感じみたいですね。選択肢が増えるのはいいことですねー
Windowsガジェットも良いですがHTAとはまた特性が違いますしね。
>pokopon さん
spamを消すくらいなので管理自体はまあできなくはないのでもう少し続けてみます。
うちの環境ではChromeでもsubmitできるみたいですがどうでしょうか?
この掲示板、SPAM対策のチェックができましたが、Google ChromeではSubmitできませんでした。
> サブフォルダを再帰的に検索して
やはりこれしかないようですね。
実際、エクスプローラーでフォルダのサイズを調べる時も、しこしこと再帰的に計算しているようにも思えます。
http://www.upken.jp/kb/vbscript_userprofile_size.html
ここで解決できていました。
閉鎖については・・・面倒でなければこのままがいいです。何かまた質問したいことがあるかもしれません。
管理が大変でしょうが、よろしくお願いします。
お久しぶりです。
3年かかってしまいましたが、MSHTA.EXEに変わる。HTML Application実行環境
を作成し、フリーソフトとして提供することができました。
是非、皆さんにも数ある環境の中の選択肢のひとつとしてご利用いただければと思います。
「HTABOXコア」http://kuroda.bglb.jp/htabox/
突然の書き込み失礼しました。
>FFおかぴさん
フォルダが複数あった場合に、デフォルト起動ではどれを使うのかは、Profiles.iniに書いてあると思うので、そこを見るしかないのでは?
そうじゃなくて、複数フォルダがあれば全部対象にしたいという事なら、FileSystemObjectのFoldersコレクションですよね。
いずれの場合もそれ以上簡単な方法はないと思います。
>くろかめさん
ちょっとどこのリンクか分からないのですが、この掲示板の上のリンクは
古いままだったので直しておきました。
古いままでもリダイレクトで新しいページに飛ぶようですが・・・
>FFおかぴさん
ランダムな英数字のフォルダは一つだけですか?
それならばShell.Applicationを使うといいかもです。
VBSですがこんな感じです。
Set shell=CreateObject("shell.application")
msgbox shell.namespace("C:\Documents and Settings\{ユーザ名}\Application Data\Mozilla\Firefox\profiles").items.item(0).path
はじめまして。
早速質問いたします。
FirefoxのユーザープロファイルフォルダまでのパスをJScriptで取得したいのですが、
// C:\\Documents and Settings\\{ユーザ名}\\Application Data\\Mozilla\\Firefox\\profiles\\{ランダムな英数字}
上記の、{ランダムな英数字} の部分をなんとか取得する手段はないものでしょうか?
////////Profilesフォルダ まで取得するのは以下の通りです。////////////////////////
var ws = new ActiveXObject("WScript.Shell");
var ad = ws.ExpandEnvironmentstrings("%APPDATA%");
ws.Popup(ad + "\\Mozilla\\Firefox\\Profiles\\");
up = null;
ws = null;
////////////////////////////////
ちなみに、Profilesフォルダ の直下にProfiles.iniというファイルがあり、
そこに「Path={ランダムな英数字}」があり、
FileSystemObjectとかで取得できそうですが、どうも面倒かなぁと。
よろしくお願いいたします。
[環境]
■OS
Windows XP Professional
■Firefox version
3.6
Windows Script Host Laboratory
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/
の、WSHダウンロードページへのリンクが切れています。
最近は
http://www.microsoft.com/japan/msdn/scripting/
のようです。
Windows Script Host Laboratory
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/
の、WSHダウンロードページへのリンクが切れています。
最近は
http://www.microsoft.com/japan/msdn/scripting/
のようです。
牟田口です。
最近また放置していてすみません。
この掲示板ですが、最近はspam投稿がほとんどで、もうあまり需要がないのかな?とも思っています。
過去ログのみ閲覧可能な状態にして閉鎖も考えているのですが、どうでしょうか?
>pokopon さん
環境によってはFolder.Sizeで容量を取得できないようです。
その場合、サブフォルダを再帰的に検索して、含まれるファイルのSizeプロパティを合計していくしかないのではないかと思います。
お久しぶりです。
暫くぶりにここを覗いてみました。
今、ちょっとある問題でつまづいております。
下記のようなVBScriptで、ユーザーのプロファイルのフォルダのサイズを求めようと思っています。
OSはVistaで、ローカルに置いたファイルで実行させています。
また、ユーザーを仮に「pc-user」とし、administratorの権限を与えています。そして、このユーザでログインし、次のVBSを実行すると、
800A0046 書き込みできません
とエラーが出て、フォルダのサイズを取得できません。
strFolder = "C:\Users\pc-user"
Set objFileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFileSys.GetFolder(strFolder)
CheckFolderSize = objFolder.Size
MsgBox strFolder & "= " & CheckFolderSize & " Bytes"
このスクリプト、XP以前のOSでは正常に動作します。Vista以降のOSで発現します。
ちなみに、このプロファイル以外のフォルダではVistaでも正常に動きますので、プロファイルフォルダなどの特殊なアクセス権が設定されたフォルダで起きているようです。
「800A0046 書き込みできません」はアクセス権に関するエラーメッセージですので、
下記を参考にUACの権限昇格をして実行させてみましたが、結果は同じです。
参考URL:http://hitaki.net/diary/20090522.html
どうしたらこの現象を回避できるでしょうか?
単にプロファイルフォルダのサイズを知りたいだけなんです。
別の手法でも構いません。OSによらず(特にVista以降で)実行可能な方法をお願いします。
WSHそのものの問題というより、OS自体のセキュリティーの問題だとは思いますが、回避方法があればと思っています。
(管理者により削除)
(管理者により削除)