Sunvisor Lab.

Register Now | Log in | Lost Password

ログオン時にドライブやプリンタを割り当てる

トップ (メニュー)  >  Windowsバッチ&スクリプト  >  ログオン時にドライブやプリンタを割り当てる

logon.vbsの役割

logon.vbsは,共有フォルダをドライブ名に割り当てる作業や,ネットワークプリンタに接続する作業をログイン時に自動的に行うことを主な目的とするスクリプトです。ユーザの所属する部署によってネットワークドライブの割り当てを変更したり,コンピュータによって接続するネットワークプリンタや通常使うプリンタを変更したりできるようになっています。

  1.  部署によるネットワークドライブの割り当てを自動的にできるので,各ユーザに設定作業をしてもらう必要がない。
  2. プリンタの割り当てを自動ですることにより,新しいコンピュータが入ってもいちいちプリンタのインストール作業をする必要がない。また新しいプリンタが入った場合でもサーバにプリンタをインストールし設定ファイルに記述を追加するだけでよく,各コンピュータへのインストール作業をする必要がない。

これらの機能でクライアントコンピュータの初期設定や設定変更が格段に楽になります。

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. //(二つの連続したスラッシュ)で始まる行はコメントとして無視されます。
  3. 空行(改行のみからなる行)は無視されます。

対象オブジェクト

対象オブジェクトとは,そのコマンドを実行する条件指定のようなものです。スクリプトを実行しているユーザやコンピュータが所属するグループやコンピュータ名によってコマンドの実行を制御することができます。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では,ネットワークドライブ接続のコマンドがあった場合は次のような動作をします。

  1. 指定されたドライブ名にすでに割り当てられているネットワークパスがない場合は,割り当てを実行します。
  2. 指定されたドライブ名にすでに割り当てられているネットワークパスがあり,それが指定されたパスと異なる場合は,以前の割り当てを解除してから,新しいパスを割り当てます。
  3. 指定されたドライブ名にすでに割り当てられているネットワークパスがあり,それが指定されたパスと一致する場合は,なにもする必要がないのでなにもしません。

すでに接続されているネットワークドライブを切断するだけの場合には,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して分割する利点はいくつかあります。

  1. マップファイルの記述を短くできます。複雑で長くなったマップファイルを分割して簡潔なマップファイルの組み合わせにできます。
  2. 動作速度を向上させます。logon.vbsはexitコマンドに出会わない限りマップファイルを最後まで読んで処理を実行します。マップファイルを分割することで不必要な行を最初から読み込ませないように工夫することで処理速度を向上させることができます。
  3. 複雑な条件による動作を可能にします。マップファイルでは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
プリンタ用画面
友達に伝える
投票数:7 平均点:10.00

前
ログオン,ログオフ状況を記録するスクリプト
カテゴリートップ
Windowsバッチ&スクリプト
Powered by XOOPS Cube 2.0 © 2005-2006 The XOOPS Project | Designd by Theme4u.Net