logon.vbsの役割
logon.vbsは,共有フォルダをドライブ名に割り当てる作業や,ネットワークプリンタに接続する作業をログイン時に自動的に行うことを主な目的とするスクリプトです。ユーザの所属する部署によってネットワークドライブの割り当てを変更したり,コンピュータによって接続するネットワークプリンタや通常使うプリンタを変更したりできるようになっています。
- 部署によるネットワークドライブの割り当てを自動的にできるので,各ユーザに設定作業をしてもらう必要がない。
- プリンタの割り当てを自動ですることにより,新しいコンピュータが入ってもいちいちプリンタのインストール作業をする必要がない。また新しいプリンタが入った場合でもサーバにプリンタをインストールし設定ファイルに記述を追加するだけでよく,各コンピュータへのインストール作業をする必要がない。
これらの機能でクライアントコンピュータの初期設定や設定変更が格段に楽になります。
logon.vbsの初期のバージョンは機能も少なく動作も簡単なものでした。グループによってネットワークドライブやプリンタの割り当てができるだけのものでした。それが各部署の要望を入れたりしているうちに多くのモディファイを受けてきました。大幅な設定変更が必要だったときに,すでに接続されているネットワークドライブの接続先をうまく変更できなかったために作業工数が増えてしまったことがあり,そのときに特に大きな機能アップを果たしました。現在では,ログイン時にネットワークドライブとプリンタの設定を自動化するスクリプトとして十分な機能を持ったものになっていると思います。
logon.vbsはADSIやWMIなどVBScriptで利用可能なさまざまなオブジェクトの利用方法の格好のサンプルとしても役立ちます。さほどきれいなコードではありませんが,コメントもついていますので,他のスクリプトを書くときの参考にしてください。
マップファイル
logon.vbsは,設定情報を記述したテキストファイル(マップファイルといいます)を解釈して実際の作業を行います。マップファイルのファイル名はmapfile.txtです。マップファイルの置き場所はlogon.vbsと同じフォルダですが,ローカルコンピュータの Windowsフォルダに置くこともできます。 logon.vbsは最初にローカルコンピュータの Windowsフォルダにマップファイルがあるかどうかをチェックし,そこにマップファイルがあったらそのファイルの中身を解釈して実行します。 Windowsフォルダにマップファイルがなかったら,logon.vbsと同じフォルダにあるマップファイルを解釈して実行します。
一般的にはlogon.vbsと同じフォルダにあるマップファイルに通常の設定が記述されていてWindowsフォルダにはマップファイルを置かない運用が普通です。特別な設定が必要なコンピュータの場合や,あるコンピュータを一時的に違う設定にしたいような場合だけWindowsフォルダにマップファイルを設置するという利用法になると思います。
マップファイルの書式
マップファイルはタブ区切りのテキストファイルです。1行は5列に区切られそれぞれの列は次のような意味を持ちます。
| 1列目 | 対象オブジェクトの種類 |
| 2列目 | 対象とするオブジェクト |
| 3列目 | コマンド |
| 4列目 | パス名など,コマンドに与えるパラメータ |
| 5列目 | オプション パラメータ |
1列目〜2列目で指定したオブジェクトに対して,3列目のコマンドを実行します。コマンドにパラメータが必要な場合は4列目〜5列目にパラメータを指定します。
コマンド行の解釈には次のルールが適用されます。
- コマンド行の先頭にある空白は解釈する前に取り除かれます。ただし先頭のタブは取り除かれません。
- //(二つの連続したスラッシュ)で始まる行はコメントとして無視されます。
- 空行(改行のみからなる行)は無視されます。
対象オブジェクト
対象オブジェクトとは,そのコマンドを実行する条件指定のようなものです。スクリプトを実行しているユーザやコンピュータが所属するグループやコンピュータ名によってコマンドの実行を制御することができます。1列目にはオブジェクトの種類を指定し,2列目で条件を指定します。
| 1列目 | 2列目 | 対象オブジェクトの種類 |
| all | *を指定 | 全て。これが指定された行のコマンドは必ず実行されます。条件は存在しないので2列目の内容は無視されますが,記述ミスを防ぐために2列目には*を入れることを推奨します。 |
| user | ユーザ名 | ユーザ。ログインしたユーザ名。ユーザ名の末尾に*を付けることで前方一致での指定が可能です。ユーザ名が一致した場合にコマンドは実行されます。 |
| group | グループ名 | グループ。ログインしたユーザが所属するグループ。ユーザがそのグループに所属している場合にコマンドは実行されます。 |
| pc | コンピュータ名 | コンピュータ。コンピュータ名の末尾に*を付けることで前方一致での指定が可能です。コンピュータ名が一致した場合にコマンドは実行されます。 |
| ip | IPアドレス範囲 | IPアドレス。2列目には 10.20.30.0/255.255.255.0の形式で,ネットワークアドレスとサブネットマスクを指定することでIPアドレスの範囲を指定できます。単一のIPアドレスを指定する場合はサブネットマスクを省略できます。詳しくはIPアドレス指定時の動作を参照してください。 |
コマンド
| 3列目 | 4列目/5列目 | 動作 |
| alert | 4列目:表示するメッセージをセットします。 | ポップアップメッセージを表示します。条件指定のテストなどに利用します。 |
| exec | 4列目:実行するコマンドをセットします。 | 外部コマンドを実行します。 |
| exit | 4列目以降のパラメータは必要ありません。 | 処理を終了します(以降のマップファイルを評価しません)。 includeコマンドでインクルードされたマップファイル中でexitコマンドに遭遇するとそのファイルの解釈を終了して呼び出し元のマップファイルに戻ります。 |
| prn | 4列目:共有プリンタのUNCパスを指定します。 5列目:forceを指定すると強制的に再接続します。delete を指定すると割り当てを解除します。詳しくはネットワークプリンタ接続時の動作を参照してください。 |
ネットワークプリンタに接続します。 |
| defprn | 4列目:共有プリンタのUNCパスを指定します。 | 通常使うプリンタを指定します。 |
| include | 4列目:マップファイル名。 | 別のマップファイルをインクルードします。このコマンドを使って大きな条件毎にマップファイルを分割することができます。詳しくはマップファイルの分割を参照してください。 |
| log | 4列目:onを指定すると以降の成功ログを記録します。offを指定すると以降の成功ログを記録しません。 | 成功ログの記録モードを設定します。この機能は主に動作確認に用います。詳しくはイベントログの記録を参照してください。 |
| <ドライブ名>: | 4列目:共有フォルダのUNCパスを指定します。 5列目:deleteを指定するとそのドライブの割り当てを解除します。 |
共有フォルダをネットワークドライブに割り当てます。詳しくはネットワークドライブの割り当て時の動作を参照してください。 |
記述例
all * prn \\sv1\LaserPrinter1
無条件で共有プリンタの\\sv1\LaserPrinter1に接続します。
group kaikei Z: \\sv1\kaikei
ユーザがkaikeiグループに所属する場合に共有フォルダ\\sv1\ kaikei をZ:ドライブに割り当てます。
pc jimu* defprn \\sv1\JimuPrinter
コンピュータ名がjimuで始まる場合に\\sv1\JimuPrinterを通常使うプリンタとします。
IPアドレス指定時の動作
IPアドレスによる振り分けは,コンピュータのIPアドレスを取り出すのにやや時間がかかるので,処理速度に影響を与えます。
ip 10.20.30.0/255.255.255.0 defprn \\sv1\KaikeiPrinter
IPアドレスが10.20.30.1〜10.20.30.254の範囲内の時に, \\sv1\KaikeiPrinterを通常使うプリンタとします。
ip 10.20.30.40 defprn \\sv1\KaikeiPrinter
IPアドレスが10.20.30.40の時に,\\sv1\ KaikeiPrinterを通常使うプリンタとします。サブネットマスクを省略するときは上記のように/(スラッシュ)も記述しないようにします。
IPアドレスによる振り分けには,そのコンピュータに搭載されているアダプタのうち最初にリストアップされたIPアドレスを根拠にします。よって複数のNICを持つ場合や,仮想的なネットワークアダプタを持つような場合には,正しい IPアドレスが取り出されるかどうか不確実な部分があります。そういう状況でないコンピュータしか対象にしない場合などに用途を限定して使ってください。
ネットワークプリンタ接続時の動作
Windowsの「プリンタとFAX」の画面からネットワークプリンタに接続した場合は,コンピュータの電源を切っても,その接続の定義は残るようになっていて,次回起動時もそのプリンタを使用することができます。起動する度に毎回プリンタへの接続をする必要はありません。
logon.vbsを使って接続が定義されている場合も同様に動作します。prn コマンドでプリンタへの接続を処理する場合は,ローカルですでに接続されている共有プリンタである場合は再度プリンタ接続することはしません。通常はこの動作で必要な結果が得られます。しかしプリンタの構成変更時などで何らかの理由で接続済みのプリンタにも再度接続動作をさせたい場合は5列目にforceと記述します。そうすることで接続済みのプリンタであっても再度接続します。
古いプリンタを廃棄した場合や,プリントサーバを別のものにした場合など,すでに接続されているネットワークプリンタを削除する必要がある場合は,5列目にdeleteオプションを記述します。すると次のログインの時にそのプリンタは削除されます。deleteオプションを記述した行はしばらくの間運用して,対象となるほぼすべてのコンピュータがログオンした時期が過ぎたら,マップファイルから消してしまっていいでしょう。
ネットワークドライブの割り当て時の動作
このコマンドの場合だけはコマンドではなくドライブ名を記述します。ドライブ名は英数字1文字+:(コロン)です。プリンタと同じように一度接続されたネットワークドライブの割り当ては,ログオン時に再接続されます。 logon.vbsでは,ネットワークドライブ接続のコマンドがあった場合は次のような動作をします。
- 指定されたドライブ名にすでに割り当てられているネットワークパスがない場合は,割り当てを実行します。
- 指定されたドライブ名にすでに割り当てられているネットワークパスがあり,それが指定されたパスと異なる場合は,以前の割り当てを解除してから,新しいパスを割り当てます。
- 指定されたドライブ名にすでに割り当てられているネットワークパスがあり,それが指定されたパスと一致する場合は,なにもする必要がないのでなにもしません。
すでに接続されているネットワークドライブを切断するだけの場合には,5列目に deleteオプションを記述します。deleteオプションを記述した行はしばらくの間運用して,対象となるほぼすべてのコンピュータがログオンした時期が過ぎたら,マップファイルから消してしまっていいでしょう。
イベントログの記録
logon.vbsは,スクリプト実行中にエラーが発生するとイベントログにメッセージを記録します。logon.vbsの動作がおかしい場合はクライアントのイベントログを見てエラーが記録されていないかどうか確認します。基本的にエラーが記録されるというのは動作が不正である言うことですので,原因を探りマップファイルや場合によってはlogon.vbsを修正する必要があります。
それとは別にマップファイルの記述やlogon.vbs自体の動作確認をする時に,成功したログも記録したいことがあります。成功ログを記録するようにするには,マップファイルの先頭付近に次の行を記述します。
pc <ComputerName> log on
<ComputerName>の部分は,動作確認を行うコンピュータ名を記述します。上記のように記述すると1行解釈して実行する毎に成功した場合でもログがイベントログに残るようになります。イベントビューワでログの内容を参照して動作確認に役立てます。
マップファイルの分割
includeコマンドを記述すると,別のマップファイルを解釈して実行します。読み込んだマップファイルの処理が終了すると,元のマップファイルの次の行から実行が再開されます。
マップファイル名は,絶対パスまたはスクリプトファイルが置かれているフォルダからの相対パスで指定できます。
group kaikei include mapsub/kaikei.txt
上記の例では,kaikeiグループに所属しているユーザの場合は,mapsub フォルダにあるkaikei.txtをマップファイルとして解釈して実行します。この場合は相対パスが指定されていますので,logon.vbsが置かれているフォルダにmapsubフォルダがあって,その中にkaikei.txtがなければなりません。
マップファイルをincludeして分割する利点はいくつかあります。
- マップファイルの記述を短くできます。複雑で長くなったマップファイルを分割して簡潔なマップファイルの組み合わせにできます。
- 動作速度を向上させます。logon.vbsはexitコマンドに出会わない限りマップファイルを最後まで読んで処理を実行します。マップファイルを分割することで不必要な行を最初から読み込ませないように工夫することで処理速度を向上させることができます。
- 複雑な条件による動作を可能にします。マップファイルでは1列目と2列目で指定した条件の場合に3列目以降のコマンドが実行される仕様ですが,○○かつ △△というような条件指定はできません。このような場合には○○の場合にマップファイルをincludeするように記述し,△△の部分はマップファイルに書くことによって実現できます。
logon.vbsのソース
Option Explicit
'-------------------------------------------------------------------------------
'logon.vbs
'共有フォルダとプリンタを割り当てる
'マップファイルの定義を見て、共有フォルダ、プリンタのマッピングを行う
'Version 2.0.2 2007/03/17
'Version 2.0.1 2007/02/27
'-------------------------------------------------------------------------------
'マップファイルの書式
'タブ区切りのテキストファイル。マップファイルはローカルPCのWindowsフォルダまたは
'スクリプトファイルと同じフォルダに置く。
'1列目: 対象オブジェクトの種類
' all 全て
' group グループ
' ip IPアドレス
' user ユーザ
' pc コンピュータ
'2列目: 対象とするオブジェクト
' オブジェクト名。user,pcの場合は末尾に*をつけると前方一致。
' IPアドレスの場合は10.20.30.0/255.255.255.0の形式でアドレス範囲指定できる。
' 1列目がallの場合はここの値は無視されるがタブの入れ忘れ防止のため,この列
' には,*を入れることを推奨する。
'3列目: コマンド
' alert 4列目で指定した文字列をポップアップ表示する(テスト用)
' exec 外部コマンドを実行する
' exit 処理を終了する(以降のマップファイルを評価しない)
' includeされたマップファイルでは現在のマップファイルの処理を
' 終了し上位のマップファイルに戻る
' prn 共有プリンタをマッピングする
' defprn 共有プリンタを通常使うプリンタにする
' include 別のマップファイルをインクルードする
' log 成功ログの記録
' <ドライブ名>: 共有フォルダのドライブを割り当てる
'4列目: パス名など
' prn,defprnや<ドライブ名>:の場合は,共有名のUNCパス
' alartの場合は表示する文字列
' execの場合は実行するコマンド
' includeの場合は,読み込むマップファイル名。
' logの場合はonで記録する,offで記録しない
' ファイル名は絶対パスまたはスクリプトファイルからの相対パスで記述できる。
'5列目: オプション
' prnの場合にforceが指定されていると割り当て済みでも割り当てる
' prnや<ドライブ名>:の場合にdeleteが指定されていると割り当てを解除する
'-------------------------------------------------------------------------------
Const MAP_FILE = "mapfile.txt" 'マップファイル名
Const ForReading = 1
Dim wshNetwork, sUser, Groups, sPrinters, sScriptPath
Dim FSO
Dim isMatch
Dim sMapFileName
Dim SuccessLog
SuccessLog = False '成功ログの記録フラグ(初期値は記録しない)
Set FSO = CreateObject("Scripting.FileSystemObject")
Set wshNetwork = CreateObject("WScript.Network")
GetUserName
'所属グループを得る
Groups = GetGroups
'インストール済みプリンタを得る
sPrinters = GetPrinterShareNames
'ローカルのmapfile.txtを調べる
sScriptPath = FSO.GetSpecialFolder(0) & "\"
sMapFileName = sScriptPath & MAP_FILE
If not FSO.FileExists(sMapFileName) Then
sScriptPath = ExtructPath(WScript.ScriptFullName)
sMapFileName = sScriptPath & MAP_FILE
End If
'実行
On Error Resume Next
Mapping sMapFileName
'*** End of Script
'/**
' * ユーザ名を得る
' *
' * ユーザ名が空の時はログインされるまで待つ。
' * 30秒以上ダメならスクリプト自体をやめる
' */
Sub GetUserName
Dim startTime
sUser = wshNetwork.UserName
startTime = Now
Do While sUser = ""
If DateDiff("s", startTime, Now) > 30 Then
Wscript.Quit
End If
Wscript.Sleep 500
wshNetwork = wshNetwork.UserName
Loop
End Sub
'/**
' * マップファイルを読んでマッピングを実行する
' *
' * @param AMapName マップファイル名
' */
Sub Mapping(AMapName)
Dim Stream, sBuf, sKind, sObj, sCommand, sPath, sOpt
Set Stream = FSO.OpenTextFile(AMapName, ForReading)
WriteLog Err.Number, "(Open)" & AMapName & Err.Description
Do While not Stream.AtEndOfStream
sBuf = LTrim(Stream.ReadLine)
If Left(sBuf,2) = "//" Then
'コメント行
ElseIf Trim(sBuf) = "" Then
'空行
Else
isMatch = False
'1行からパラメータを抽出
If ReadLine(sBuf, sKind, sObj, sCommand, sPath, sOpt) Then
'WriteLog Err.Number, Err.Description
'処理対象かどうかを判断
Select Case sKind
Case "all", "*"
isMatch = True
Case "user"
isMatch = IsLike(LCase(sUser), sObj)
Case "group","grp"
isMatch = IsInGroup(sObj)
Case "pc","computer"
isMatch = IsLike(LCase(wshNetwork.ComputerName), sObj)
Case "ip","address"
isMatch = isInNet(MyIPAddress, sObj)
Case Else
isMatch = False
End Select
'処理
If isMatch Then
Select Case sCommand
case "alert"
WScript.Echo sPath
case "exec"
ShellExecute sPath
case "exit"
'以後の処理はしない
Exit Do
case "include"
Mapping sScriptPath & sPath
case "prn"
MapPrinter sPath, sOpt
case "defprn"
'通常使うプリンタにする
wshNetWork.SetDefaultPrinter sPath
case "log"
If LCase(sPath) = "on" Then
SuccessLog = True
ElseIf LCase(sPath) = "off" Then
SuccessLog = False
End If
case else
If IsDrive(sCommand) Then
MapDrive sCommand, sPath, sOpt
Else
WriteLog -1, "コマンドが正しくありません" & " : [" & sBuf & "]"
End If
End Select
WriteLog Err.Number, Err.Description & " : [" & sBuf & "]"
End If
End If
End If
Loop
Stream.Close
End Sub
'/**
' * ドライブを割り当てる
' * 既に割り当てられているときには切断してから接続しなおす
' *
' * @param ADrive ドライブ名
' * @param APath ネットワークドライブのUNCパス
' * @param AOpt オプション deleteが指定されていたら切断するのみ
' */
Sub MapDrive(ADrive, APath, AOpt)
Dim oldPath
'削除
If LCase(AOpt) = "delete" Then
If not IsNull(GetDriveUNC(ADrive)) Then
wshNetwork.RemoveNetworkDrive ADrive, True, True
End If
Exit Sub
End If
'追加
oldPath = GetDriveUNC(ADrive)
If IsNull(oldPath) Then
'ドライブ割り当て無しの場合は割り当てる
wshNetwork.MapNetworkDrive ADrive, APath
ElseIf UCase(OldPath) <> UCase(APath) Then
'違うパスが割り当てられている場合は切断してから割り当て
wshNetwork.RemoveNetworkDrive ADrive, True, True
wshNetwork.MapNetworkDrive ADrive, APath
End If
WriteLog Err.Number, "(function MapDrive)" & Err.Description & " : [" & ADrive & "-" & APath & "-" & AOpt & "]"
End Sub
'/**
' * プリンタを割り当てる
' * プリンタが未割り当ての時にだけ割り当てる
' *
' * @param APath ネットワークプリンタのUNCパス
' * @param AOpt deleteが指定されていたら切断する
' * forceが指定されていたら既に割り当てられていても割り当てを実行する
' */
Sub MapPrinter(APath, AOpt)
'
Dim isExsist
isExsist = InStr(sPrinters, APath) > 0
If LCase(AOpt) = "delete" Then
If isExsist Then
wshNetWork.RemovePrinterConnection APath, true
WriteLog 0, "Delete Printer " & APath
End If
Else
If Not(isExsist) Or LCase(AOpt) = "force" Then
wshNetwork.AddWindowsPrinterConnection APath
WriteLog 0, "Add Printer " & APath
End If
End If
WriteLog Err.Number, "(function MapPrinter)" & Err.Description & " : [" & APath & "-" & AOpt & "]"
End Sub
'/**
' * ドライブに割り当てられたUNCパスを得る
' *
' * @param ADrive ドライブ名
' * @return 割り当て済みならUNCパス,割り当てがなければNull
' */
Function GetDriveUNC(ADrive)
Dim Drives, Drive, i
Set Drives = wshNetwork.EnumNetworkDrives
For i = 0 to Drives.Count - 1 Step 2
Drive = Drives.Item(i)
If Drive = UCase(ADrive) Then
GetDriveUNC = Drives.Item(i+1)
Exit Function
End If
Next
GetDriveUNC = Null
End Function
'/**
' * エラー時にイベントログを記録する
' * SuccessLogがTrueの時は成功ログも記録する
' *
' * @param ENumber エラー番号
' * @param EMessage エラーメッセージ
' */
Sub WriteLog(ENumber, EMessage)
Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
If ENumber <> 0 Then
objShell.LogEvent 1, WScript.ScriptName & " : (" & ENumber & ")" & EMessage
Err.Clear
ElseIf SuccessLog Then
objShell.LogEvent 0, WScript.ScriptName & " : (成功)" & EMessage
End If
End Sub
'/**
' * グループ名リストを得る
' *
' * @return グループ名のリスト
' */
Function GetGroups
Dim ADSysInfo, CurrentUser, sType
Set ADSysInfo = CreateObject("ADSystemInfo")
Set CurrentUser = GetObject("LDAP://" & ADSysInfo.UserName)
sType = TypeName(CurrentUser.MemberOf)
If sType = "String" Then
GetGroups = LCase(CurrentUser.MemberOf)
ElseIf sType = "Empty" Then
GetGroups = ""
Else
GetGroups = LCase(Join(CurrentUser.MemberOf))
End If
WriteLog Err.Number, "(function GetGroups)" & Err.Description
End Function
'/**
' * グループに所属しているかどうかをチェック
' *
' * @param AGroup グループ名
' * @return グループに所属している場合はTrue
' */
Function IsInGroup(AGroup)
IsInGroup = InStr(Groups, "cn=" & LCase(AGroup))
End Function
'/**
' * 1行を読み取り分解して値を返す
' *
' * @param ABuf ファイルから読み取った1行の文字列
' * @param AKind 1列目: 対象オブジェクトの種類
' * @param AObj 2列目: 対象とするオブジェクト
' * @param ACommand 3列目: コマンド
' * @param APath 4列目: パス
' * @param AOpt 5列目: オプション
' * @return True=正常 False=エラー
' */
Function ReadLine(ABuf, AKind, AObj, ACommand, APath, AOpt)
Dim sLine, i, isErr
sLine = Split(ABuf, vbTab)
i = UBound(sLine)
If i < 2 Then
isErr = True
Else
AKind = LCase(sLine(0))
AObj = LCase(sLine(1))
ACommand = LCase(sLine(2))
If i = 2 Then
If ACommand <> "exit" Then
isErr = True
Else
isErr = False
End If
Else
isErr = False
APath = sLine(3)
End If
End If
If i = 4 Then
AOpt = sLine(4)
Else
AOpt = ""
End If
If isErr Then
WriteLog -1, "パラメータが不足しています : [" & ABuf & "]"
End If
ReadLine = not isErr
'WriteLog Err.Number, "(function ReadLine)" & Err.Description
End Function
'/**
' * ドライブ指定かかどうかをチェック
' *
' * @param ACommand コマンド
' * @return ドライブ指定の場合はTrue
' */
Function IsDrive(ACommand)
Dim sDrive
sDrive = UCase(Trim(ACommand))
If Len(sDrive) <> 2 Then
IsDrive = false
Else
If Right(sDrive, 1) = ":" And sDrive >="A" AND sDrive <="Z" Then
IsDrive = true
Else
IsDrive = false
End If
End If
End Function
'/**
' * Like関数 前方一致・後方一致のみサポート
' * ワイルドカードは先頭・末尾の*のみ使用可能。
' *
' * @param ASource 文字列
' * @param APattern 比較するパターン
' * @return True=一致する
' */
Function IsLike(ASource, APattern)
Dim sSource, sPattern
Dim L
If Left(APattern, 1) = "*" Then
L = Len(APattern) - 1
sPattern = Right(APattern, L)
sSource = Right(ASource, L)
ElseIf Right(APattern, 1) = "*" Then
L = Len(APattern) - 1
sPattern = Left(APattern, L)
sSource = Left(ASource, L)
Else
sPattern = APattern
sSource = ASource
End If
IsLike = sPattern = sSource
End Function
'/**
' * プリンタの共有名リストを得る
' * ワイルドカードは先頭・末尾の*のみ使用可能。
' *
' * @return プリンタの共有名を;でつなげた文字列
' */
Function GetPrinterShareNames
Dim objWMIService, objItem, colItems, sR, sShareName
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer",,48)
sR = ""
For Each objItem in colItems
sShareName = objItem.ServerName & "\" & objItem.ShareName
If Len(sShareName)>0 Then
sR = sR & sShareName & ";"
End If
'WriteLog 0, "(PrinterShareName)" & sShareName
Next
GetPrinterShareNames = sR
WriteLog Err.Number, "(function PrinterShareNames)" & Err.Description
End Function
'/**
' * ファイル名の中からパス部分を取り出す
' *
' * @param sFullPath フルパスのファイル名
' * @return パス
' */
Function ExtructPath(sFullPath)
Dim p
Dim result
p = InStrRev(sFullPath, "\")
If p = 0 Then
p = InStr(sFullPath, ":")
If p = 0 Then
result = ""
Else
result = Left(sFullPath, p) & "\"
End If
Else
result = Left(sFullPath, p)
End If
ExtructPath = result
End Function
'/**
' * IPアドレスが指定した範囲内かどうかをチェックする
' *
' * @param AAddress IPアドレス
' * @param ARange ネットワーク範囲
' * ネットワークアドレス/サブネットの形式で指定
' * 例)10.20.30.0/255.255.255.0
' * @return 範囲内であればTrue
' */
Function isInNet(AAddress, ARange)
Dim sRange, aAddrs, aSubNets, aRanges
Dim i
aAddrs = Split(AAddress, ".")
If InStr(ARange, "/") = 0 Then
sRange = ARange & "/255.255.255.255"
Else
sRange = ARange
End If
aRanges = Split(sRange, "/")
aSubNets = Split(aRanges(1), ".")
For i = 0 To 3
aAddrs(i) = aAddrs(i) And aSubNets(i)
Next
isInNet = Join(aAddrs, ".") = aRanges(0)
End Function
'/**
' * ローカルマシンのIPアドレスを得る
' *
' * @return 複数ある場合は先頭のIPアドレス
' */
Function MyIPAddress()
Dim WMI
Dim Item, Items, IP
Dim result
Dim results
Set WMI = GetObject("winmgmts:\\.\root\cimv2")
Set Items = WMI.ExecQuery _
("Select * From Win32_NetworkAdapterConfiguration " & _
"Where IPEnabled = True")
For Each Item In Items
For Each IP In Item.IPAddress
result = result & IP & ";"
Next
Next
results = Split(Left(result, Len(result) - 1), ";")
MyIPAddress = results(0)
End Function
'/**
' * 外部コマンドの実行
' *
' * @param ACommand 実行するコマンド
' */
Sub ShellExecute(ACommand)
Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run ACommand
End Sub
|
ログオン,ログオフ状況を記録するスクリプト |
Windowsバッチ&スクリプト |
