出退勤管理の第3回目です。
前回までは、PCが起動(ログオン)終了(ログオフ)した日時を自動的に記録するようにしました。
出退勤の情報収集が目的ですから、「誰」と言う個人が特定できないといけません。
PCがその人専用のPCであれば、ログオン・ログオフの記録だけで個人が特定できますが、PCを共有している場合(1台のPCを複数の人が使用している場合)は、誰が使用したのか分かりません。そこで、個人を特定するために、ログオンしたユーザー名も記録する様にします。ついでに、ネットワークに繋いでいる場合はIPアドレスも記録します。
IPアドレスを記録するのは、ノートPC等を持ち歩きして他の事業所などに行って作業した場合などに「何処で」という情報がある程度判別できるからです。
もちろん、共有PCで作業する方が同じユーザー名パスワードを使用していたり、ネットワークの設定が「何処で」という判別が出来ないような設定になっている場合は意味がありませんが…
■ ログオンしたユーザー名を取得する
VBスクリプトでログインしたユーザー名を取得するには、ネットワークオブジェクトを作成し、そのプロパティとしてドメイン名、コンピュータ名、ユーザー名が取得できます。
' -- ドメイン・コンピュータ・ユーザー名取得 Dim oNET ,uDomain ,uComputer ,uUser Set oNET = WScript.CreateObject("WScript.Network") uDomain = oNET.UserDomain uComputer = oNET.ComputerName uUser = oNET.UserName Set oNET = Nothing
とても簡単なコードです。ログインしているドメイン名、コンピュータ名、ログインユーザー名が取得できます。ここで取得した値をファイルに書き込むだけです。
■ IPアドレスを取得する
IPアドレスを取得するのは少し手続きが複雑です。PCが複数のネットワークに繋がっている場合があるからです。試しに「コマンドプロンプト」を起動して、「ipconfig」と入力してみてください。
上図の例の様に、IPアドレスには IPv6 と IPv4 の2種類が割り当てられています。通常PCはIPv4アドレスを使用して他のPCと通信をしています。この例では「IPv4アドレス」は1つですが、複数のIPv4アドレスが割り当てられている場合もあります。さらに、ネットワークアダプタが複数ある場合には、それぞれに異なった IPv6 と IPv4 アドレスが割り当てられています。最近のノートPCには、無線LANと有線LANの2つのネットワークアダプタがついているものが多いので、両方使用できる様になっている場合は、2つ以上のIPv4アドレスが割り当てられていると思われます。
前置きが長くなりましたが、通常はIPv4アドレスは1つですので、その値を取得するコードを書いてみました。
Dim oWMI ,oCRD ,oREG ,uIPaddress ,nCard ,oAddress Set oREG = New regexp oREG.Pattern = "^[.0-9]{7,15}$" uIPaddress = "not use" Set oWMI = GetObject("winmgmts:\\.\root\cimv2") Set oCRD = oWMI.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True") Do For Each nCard in oCRD For Each oAddress in nCard.IPAddress If oREG.Test(oAddress) Then uIPaddress = oAddress Exit Do End If Next Next Exit Do Loop Set oCRD = Nothing Set oWMI = Nothing Set oREG = Nothing
概略を説明します。
2~3行目は、データとして IPv4 と IPv6 アドレスが取り出せるので IPv4 アドレスか?を判定する正規表現を記述してあります。IPv4アドレスは、1~3桁の数字を4つ「.」で区切った形式で、また、IPv6 と区別がつけば良いので、この記述にしてみました。後ほど判定に使います。
4行目の uIPaddress という変数に取り出した IPv4 アドレスが格納されます。IPv4 アドレスが無かった場合に、初期値として「not use」を格納しておきます。
5~6行目は、ウィンドウズマネジメントオブジェクトから有効なネットワークアダプタ設定の情報を取り出す記述です。
8~15行目の For Each nCard in oCRD~ では、(複数の)ネットワークアダプタの情報を順に呼び出します。
9~14行目の For Each oAddress in nCard.IPAddress~ では、1つのネットワークアダプタの情報から、複数のIPアドレスを1つずつ取り出します。
10行目は、取り出されたIPアドレスがIPv4の形式か?を判定しています。IPv4の形式であれば、その値を uIPaddress に格納して Loop を抜けます。IPv4の形式でなければ、次のIPアドレスの形式判定を行います。
■ 2つの機能を実装する
ユーザー名を取得する機能とIPアドレスを取得する機能を組み込みます。
test001.vbs に「ユーザー名取得」と「IPアドレス取得」機能を追加しました。
' +------------------------------------- ' I 時刻の記録をする ' +------------------------------------- Option Explicit On Error Resume Next Dim oFSO ,oFIL ,lFileName Dim arg1 ,StartTime Dim oNET ,uDomain ,uComputer ,uUser Dim oWMI ,oCRD ,oREG ,uIPaddress ,nCard ,oAddress StartTime = now lFileName = "C:\MyData\test\LOGMSG.txt" ' -- 引数があるか?無ければ「none」 If (WScript.Arguments.Count < 1) Then arg1 = "none" Else arg1 = WScript.Arguments(0) End If ' -- ドメイン・コンピュータ・ユーザー名取得 Set oNET = WScript.CreateObject("WScript.Network") uDomain = oNET.UserDomain uComputer = oNET.ComputerName uUser = oNET.UserName Set oNET = Nothing ' -- IPアドレス取得 Set oREG = New regexp oREG.Pattern = "^[.0-9]{7,15}$" uIPaddress = "not use" Set oWMI = GetObject("winmgmts:\\.\root\cimv2") Set oCRD = oWMI.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True") Do For Each nCard in oCRD For Each oAddress in nCard.IPAddress If oREG.Test(oAddress) Then uIPaddress = oAddress Exit Do End If Next Next Exit Do Loop Set oCRD = Nothing Set oWMI = Nothing Set oREG = Nothing ' --- ファイル出力(追加) Set oFSO = WScript.CreateObject("Scripting.FileSystemObject") Set oFIL = oFSO.OpenTextFile(lFileName, 8, True) oFIL.WriteLine("DataWrite" & vbTab & "ARG1=" & arg1 & vbTab & StartTime & _ vbTab & uDomain & vbTab & uComputer & vbTab & uUser & _ vbTab & uIPaddress) oFIL.Close Set oFIL = Nothing Set oFSO = Nothing
■ テスト開始
これで、準備は全て整いました。開いているウインドウを全て閉じてから、PCを再起動してログインしてみましょう。
VBスクリプトで記録しているファイルは「C:\MyData\test\LOGMSG.txt」ですので、エディタ等で開いてみると、以下のようなデータが記録されています。
DataWrite ARG1=TAISYA 2017/03/16 23:23:37 PC1234 PC1234 k.hasegawa 192.168.0.135
PCをシャットダウンしたとき記録されたレコードです。日時の後に、ドメイン名、コンピュータ名、ログインユーザー名、IPアドレスが記録されています。
■ 今回のまとめ
これで、「何時」、「誰が」、「何処で」、「どのPC」を使用したかが自動的に記録されるようになりました。
今回は、ここまでです。
次回は、もう少し使いやすく、改造します。