タグ:WSH ( 15 ) タグの人気記事
(WSH)VBScriptでバイナリファイルのバージョンを取得したい

当初バッチファイルでバイナリファイル(exeとかdllとか)のバージョンを取得しようと思ってましたが、別途ツールをいけないらしく結構面倒そうでした。
(とりあえず,@IT:バイナリ・ファイルのバージョンを調べるコンピュータ系blog:バイナリファイルのバージョンを調べる方法が参考になります)

VBScriptだったら簡単に取得できるようでした。
参考先まるままですが、以下のコードで取得できるようです。

dim path
path="C:\Program Files\JUJO\HardKey EG Pro\FlashCtl.dll"
MsgBox GetVersion(path)
 
Function GetVersion(pathspec)
Dim fso, temp
Set fso = CreateObject("Scripting.FileSystemObject")
temp = fso.GetFileVersion(pathspec)
If Len(temp) Then
GetVersion = temp
Else
GetVersion = "バージョン情報はありません。"
End If
End Function


参考:
VBScriptでファイルのバージョン情報を取得するには - aspxの日記2009
[PR]
by Jehoshaphat | 2013-03-21 22:16 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(JavaScript,ActiveX)WSHを使ってコンピュータ名とWindowsユーザ名を取得する

イントラネット向けのWEBサイトを作っており、Windowsユーザ名を取得する必要が出てきました。
(アクセス元IPアドレスを収集してもいいんですが、それだとターミナルサーバ使っている場合にどのユーザかわからないので。。。)

クライアントのブラウザはIEで統一しているので、ブラウザ上でJScriptを走らすことで取得できます。

以下のような感じです。

//ユーザ名、コンピュータ名取得
if(navigator.appName=="Microsoft Internet Explorer"){
try {
var objNetWork = new ActiveXObject("WScript.Network");
alert("コンピュータ名" + objNetWork.ComputerName);
alert("ユーザ名" + objNetWork.UserName);
//JQueryを使ってinput要素のvalueに値追加
$("#computer_name").val(objNetWork.ComputerName);
$("#win_user_name").val(objNetWork.UserName);
objNetWork = null;
} catch(e) {
//安全が保障されないActiveXを生成する際に例外が投げられる
alert('セキュリティ設定が高すぎるため実行ない。');
}
}

しかし、デフォルトの設定で上記を走らしても、動きません。
IEで以下の設定をする必要があります。

インターネットオプション→セキュリティタブで、上記スクリプト使用サイトが、ローカルイントラネットもしくは、信頼済みサイトゾーンにいることを確認。
属しているゾーンの "レベルのカスタマイズ" で、"スクリプトを実行しても安全だとマークされていない ActiveX コントロールの初期化とスクリプトの実行" を有効にする。


しかし、IE以外では動かないのが難点ですね。

参考:
ActiveXが利用出来ない場合の見分け - まっしかく備忘録
上級ユーザー向けの Internet Explorer セキュリティ ゾーン関連のレジストリ エントリ
訪問者のブラウザやOS情報を取得、ブラウザ判定|window.navigatorオブジェクト|JavaScript/DOM
[PR]
by Jehoshaphat | 2012-11-11 07:00 | Webがらみ | Trackback | Comments(0)
(VBScript)ネットワークドライブを張る方法
ネットワークドライブをコマンドで割り当てるで net use コマンドを使ってネットワークドライブを張る方法を描きました。
これを下記のようにVBScriptで実行することができます。(ユーザ名とパスワード指定)

Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
'ネットワークドライブに割り当て
objShell.Run("net use w: \\sv01\share hogepasswd /user:userhoge" )


また、WScript.Network オブジェクトを使う方法もあるようです。
その場合、下記のようになります。

Dim objWshNetwork
Set objWshNetwork = WScript.CreateObject("WScript.Network")
objWshNetwork.MapNetworkDrive "x:", "\\sv01\share", False, "userhoge", "hogepasswd"


第三引数以降を省略すると現在ログオンしているユーザでの接続を試みるようです。

ユーザを指定して接続する場合、スクリプト内にパスワードを平文で書かないといけません。
セキュリティリスク低下を防ぐために、ユーザにパスワードのみ入力させる方法についてあんだあどらいぶ:windowsXPでネットワークドライブに自動的にログインする方法(wsh)が詳しく解説しています。

参考:
@IT:ネットワーク・ドライブの接続 MapNetworkDriveメソッド
[PR]
by Jehoshaphat | 2011-09-21 23:36 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(WSH)VBScriptでユーザが特定のグループに属しているかを判定する
ログインスクリプトで、特定のグループに所属するユーザだけ任意の処理をしたいという場合の判定方法です。

[ADSI] IADsGroup.IsMember メソッドを使ってユーザが特定のグループに所属してるかチェックしてみよう (VBScript / .NET Framework) というサイトが非常に参考になりました。
というか、答えがそのままコード付きで載せられています。(C#のコードもあるのもうれしいです。)

ということで、ほぼ参考先コードまるままですが、VBScriptでの判定方法です。
ローカルグループとドメイングループの判定をしています。

Option Explicit
 
'グループに所属しているかどうかをチェックするスクリプト
Dim comInfo , currentUser , domaingroup ,localgroup
 
Set comInfo = CreateObject("WinNTSystemInfo")
currentUser = comInfo.DomainName + "/" + comInfo.UserName
Set currentUser = GetObject("WinNT://" + currentUser + ",user")
 
'ローカルグループに属しているかの判定
Set localgroup = GetObject("WinNT://" + comInfo.ComputerName + "/Administrators,group")
Wscript.Echo currentUser.AdsPath
If localgroup.IsMember(currentUser.ADsPath) Then
WScript.Echo "ローカルAdministratorsに所属しています"
Else
WScript.Echo "ローカルAdministratorsに所属していません"
End If
 
'ドメイングループに属しているかの判定
Set domaingroup = GetObject("WinNT://ドメイン名/testu")
If domaingroup.IsMember(currentUser.ADsPath) Then
WScript.Echo "ドメインtestuグループに所属しています"
Else
WScript.Echo "ドメインtestuグループに所属していません"
End If

[PR]
by jehoshaphat | 2011-07-10 21:40 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
バッチファイルをプロンプトを表示せずにバックグラウンドで実行したい
バッチファイルをタスクに仕込んで、一定間隔置きにバックグラウンドで実行するよう設定しました。
しかし、バッチファイルは実行時にプロンプト画面を表示してしまうので、ウィンドウを表示させないようにしたいという要件です。

その場合、WSH(VBScript)で、WshShell.Run メソッドで、第二引数を0にしてバッチファイルを起動するようにしてしまえば、プロンプロトを表示せずにバッチが実行できるようです。
Set WshShell = WScript.CreateObject("WScript.Shell")
'バッチ非表示実行(エラーコードも取得)
Return = WshShell.Run("C:\test.bat", 0, true)


参考:
Windowsのバッチプログラム(.bat)を実行する際、ウィンドウを表示しない方法をお教えください。- 人力検索はてな
MSDN:WshShell.Run メソッド
[PR]
by jehoshaphat | 2011-02-22 22:59 | 豆知識 | Trackback | Comments(2)
ネットワークプレースを作成するVBScript
Windowsにはネットワークプレースと呼ばれる特殊フォルダあります。
(XPのヘルプを見る限り、マイクロソフトの意図としてはFTPやWEBDavをExplorerで扱いやすくするために作られたようですが、実際は共有フォルダへのリンク先となっているのがほとんどですよね。)
共有フォルダのネットワークプレースを作成すると、何かのアプリケーションでフォルダツリーから共有フォルダを選ばないといけない時でも、いちいちマイネットワークからツリーを展開してホストを指定して共有フォルダを選択して、、といった面倒なことをしなくて済みます。
(XPだとデフォルトでマイネットワーク直下にネットワークプレースが作成されます。また、自動的にできることもあります)


さて、PC台数が多いときにログインスクリプトとかで簡単に任意のネットワークプレースを作成する方法を調査してました。

まずはこのネットワークプレースと呼ばれる特殊フォルダの仕組みについてです。


ネットワークプレースの構成は通常のフォルダ配下に desktop.ini と target.link というショートカットがあるだけです。
target.linkはネットワークプレースのリンク先へのショートカットとなっています。
desktop.iniは下記のような内容となっています。

[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
Flags=2

上記の0AFACED1-E828-11D1-9187-B532F1E9575Dは「フォルダショートカット」と呼ばれる COM クラスで、通常のショートカットをフォルダとして名前空間の一部に割り付ける機能があるようですね。
この機能を使って、ネットワークプレースはフォルダツリー可能なショートカットとなっているわけですね。
(ただあくまでショートカットなので、シンボリックリンク(ジャンクション)と異なり、リンク先のアドレスは、実際の共有フォルダのUNCとなります。)
これで、desktop.ini のファイル属性をシステムファイルかつ隠しファイルにし、desktop.iniの親フォルダの属性を読取専用にすると、あら不思議、エクスプローラから見るとネットワークプレースとして見えるわけです。


構造さえ分かれば作成するのは簡単ですね。
本題のネットワークプレースを作成するVBScript(WSH)は下記のような感じとなります。(文字数の制限でハイライトはOFFです。)

'ネットワークプレース名
NetPlaceName = "給与_共有フォルダ"
'ネットワークプレースのリンク先共有フォルダ
NetPlacePath = "\\サーバ名\共有フォルダ名"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set oWSHShell = CreateObject("Wscript.Shell")

'-------フォルダ作成(ネットワークプレースになるフォルダ)-------
'このスクリプトを実行したパスに、ネットワークプレースを追加する。
ShPath = objFSO.CreateFolder(".\" & NetPlaceName)
'例えばデスクトップ上に作りたい時とかはこうする
'DeskTop = oWSHShell.SpecialFolders("Desktop")
'ShPath = objFSO.CreateFolder(DeskTop & "\" & NetPlaceName)

'-------Desktop.iniの作成-------
'Desktop.iniファイル作成しネットワークプレース用のCOMクラス定義
Set oLog = objFSO.CreateTextFile( ShPath & "\Desktop.ini" )

'Desktop.iniファイルのCOMクラス定義文字列
strCOM = "[.ShellClassInfo]" & vbCrLf & _
"CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}" & vbCrLf & _
"Flags=2"

'Desktop.iniにCOMクラス定義文字列出力
oLog.WriteLine(strCOM)
oLog.Close()
Set oLog = Nothing

'-------ショートカット(target.link)の作成-------
Set oShell = CreateObject("Shell.Application")
Set oShortcut = oWSHShell.CreateShortcut(ShPath & "\target.lnk")
'ショートカット先を指定
oShortcut.TargetPath = NetPlacePath
'ショートカット保存
oShortcut.Save
Set oShell = Nothing


'-------Desktop.iniとフォルダの属性変更-------
'Desktop.iniのファイル取得
Set file = objFSO.GetFile(ShPath & "\Desktop.ini")
'Desktop.iniが隠しファイルじゃないなら隠しファイル属性付与
If file.Attributes = file.Attributes AND 2 Then
file.Attributes = file.Attributes XOR 2
End If
'Desktop.iniがシステムファイルじゃないならシステムファイル属性付与
If file.Attributes = file.Attributes AND 4 Then
file.Attributes = file.Attributes XOR 4
End If

'フォルダ取得(ネットワークプレースになるフォルダ)
Set folder = objFSO.GetFolder(ShPath)
'フォルダ自身が読み取り専用じゃないなら読取専用属性付与
If folder.Attributes = folder.Attributes AND 1 Then
folder.Attributes = folder.Attributes XOR 1
End If

Set objFSO = Nothing


参考:
フォルダリンクを利用する - Entering Passive Mode ネットワークプレースをはじめとした特殊フォルダの説明です。
Ken's Memo: Windows のネットワークプレースを複数マシンで共有する ネットワークプレースを複数PCでコピーした後、一気にファイル属性を変更しネットワークプレース化するスクリプトが載せられています。
謎のフォルダショートカットを調べて - seraphyの日記
VBScript ランゲージ リファレンス - Attributes プロパティ
[PR]
by jehoshaphat | 2011-02-10 22:42 | 豆知識 | Trackback | Comments(0)
VBScriptでカレントパスを取得

VBScript(WSH)で現在のカレントパスを取得する方法です。
スクリプトファイルからの相対パスで何かのファイル等を処理するときに、一旦カレントディレクトリを取得して、そこを起点にして処理する時に使えると思います。

'カレントパス取得
Dim objPath
Set objPath = CreateObject("Scripting.FileSystemObject").GetFolder(".")


参考:
VBS - FSWikiLite
[PR]
by jehoshaphat | 2011-02-09 00:56 | 豆知識 | Trackback | Comments(0)
(WSH)ユーザの特殊フォルダに共有フォルダへのショートカットを作成する

今回したかったのは、ユーザのデスクトップやお気に入りに共有フォルダへのリンク(ショートカット)を作成するということです。

当初 Windows Server 2003 のグループポリシーでIEM(Internet Explorer メンテナンス)を使ってお気に入りに file://fileserver/foldername/%username% という書式で追加しようと思ったんですが、ダメでした。
(%usernmae% があるのは、個人毎に共有フォルダを持つような運用にしたかったからです。)
(また、Windows Server 2008 以降のドメインコントローラならグループポリシーがかなり拡張できてるため、グループポリシー内で設定できるようですね。)

結局、ログインスクリプトを使って共有フォルダへのショートカットを作成することにしました。

ショートカットの作成は Shell.CreateShortcut でできるようです。
また、特殊フォルダのパスの取得は Shell.SpecialFolders(特殊フォルダ) とすると取得できるようです。

とりあえず下記のようにしてみました。(VBScript)

Option Explicit
 
Dim objSh,scDesktop,scFavorites,scNetHood,strTrget
 
'共有フォルダ内の個人フォルダのパス
strTrget = "\\fileserver\user\%username%"
 
Set objSh=CreateObject("WScript.Shell")
 
'共有フォルダ内の個人フォルダへのショートカットを作成(デスクトップ)
Set scDesktop = objSh.CreateShortcut(objSh.SpecialFolders("Desktop") & "\個人フォルダ.lnk")
scDesktop.TargetPath = strTrget
scDesktop.save
 
'共有フォルダ内の個人フォルダへのショートカットを作成(お気に入り)
Set scFavorites = objSh.CreateShortcut(objSh.SpecialFolders("Favorites") & "\個人フォルダ.lnk")
scFavorites.TargetPath = strTrget
scFavorites.save
 
'共有フォルダ内の人フォルダへのショートカットを作成(マイネットワーク)
Set scNetHood = objSh.CreateShortcut(objSh.SpecialFolders("NetHood") & "\個人フォルダ.lnk")
scNetHood.TargetPath = strTrget
scNetHood.save


なお、Shell.SpecialFolders の引数となる特殊フォルダの文字列には下記のように指定するようです。

┌─────────┬──────────────────────────┐
│AllUsersDesktop │デスクトップ(共通) │
├─────────┼──────────────────────────┤
│AllUsersStartMenu │スタートメニュー(共通) │
├─────────┼──────────────────────────┤
│AllUsersPrograms │スタートメニュー内の「プログラム」フォルダ(共通) │
├─────────┼──────────────────────────┤
│AllUsersStartUp │スタートメニュー内の「スタートアップ」フォルダ(共通)│
├─────────┼──────────────────────────┤
│Desktop │デスクトップ │
├─────────┼──────────────────────────┤
│Favorites │お気に入り │
├─────────┼──────────────────────────┤
│Fonts │フォント │
├─────────┼──────────────────────────┤
│MyDocuments │マイドキュメント │
├─────────┼──────────────────────────┤
│NetHood │マイネットワーク │
├─────────┼──────────────────────────┤
│PrintHood │プリンタ │
├─────────┼──────────────────────────┤
│Programs │スタートメニュー内の「プログラム」フォルダ │
├─────────┼──────────────────────────┤
│Recent │最近使ったファイル │
├─────────┼──────────────────────────┤
│SendTo │送るメニュー │
├─────────┼──────────────────────────┤
│StartMenu │スタートメニュー │
├─────────┼──────────────────────────┤
│Startup │スタートメニュー内の「スタートアップ」フォルダ │
├─────────┼──────────────────────────┤
│Templates │テンプレート │
├─────────┼──────────────────────────┤
│0 │WINDOWSディレクトリ │
├─────────┼──────────────────────────┤
│1 │システムディレクトリ │
├─────────┼──────────────────────────┤
│2 │テンポラリディレクトリ │
└─────────┴──────────────────────────┘



参考:
ショートカットを作成する|VBScript Tips
@IT:Windows TIPS -- Tips:デスクトップ上に必要なショートカットを自動生成する
特殊フォルダのパスを取得する@VBS - http://pnpk.net
強化されたグループ・ポリシー機能 - @IT 2008 だとグループポリシーで設定可能です。
[PR]
by jehoshaphat | 2010-10-07 19:47 | 豆知識 | Trackback | Comments(0)
(WSH)現在ログオンしているユーザ名の取得
WSH(VBScript)を使って、現在Windowsにログインしているユーザ名を取得する方法です。


WScript.Networkオブジェクトから取得できるようですね。
下記のVBScriptのコードでユーザ名取得可能です。

Option Explicit

Dim strUserName,objNet
'ユーザ名を取得する
Set objNet = CreateObject("WScript.Network")
strUserName = objNet.UserName
'結果表示
WScript.Echo strUserName


また、WScript.Networkオブジェクト以外でも、WMI を使う方法もあるようです。(それについては参考リンク参照。。)

参考:
VB系ブログ - VBScriptでドメイン名、ユーザー名、PC名を調べる。
ログオン中のユーザー名が知りたい - Fuzyのプログラミング(?)メモ WMIを使った方法が載っています。
[PR]
by jehoshaphat | 2010-10-05 21:04 | 豆知識 | Trackback | Comments(0)
WSHでログアウト・シャットダウン・再起動を行う
VBScriptでシャットダウンや再起動、ログオフを行う方法です。
下記のようなコードでできるようです。
Option Explicit
 
Dim objShut , objOS , objSystem
 
'シャットダウンオブジェクト取得
Set objShut = GetObject("winmgmts:{impersonationLevel = impersonate, (Shutdown)}")
'OSのオブジェクト取得
Set objOS = objShut.InstancesOf("Win32_OperatingSystem")
 
'シャットダウン
For Each objSystem In objOS
objSystem.Win32Shutdown 8
Next
 
'再起動
For Each objSystem In objOS
objSystem.Win32Shutdown 2
Next
 
'ログオフ
For Each objSystem In objOS
objSystem.Win32Shutdown 0
Next


参考:
WSH入門 > 第4回:Windowsでの運用の自動化について [高度情報技術科]
VBScript Tips (Tips0184)
[PR]
by jehoshaphat | 2010-09-12 23:14 | VBA、マクロ | Trackback | Comments(0)