出退勤時刻を簡単記録(3)

出退勤管理の第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」と入力してみてください。

コマンドプロンプトで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」を使用したかが自動的に記録されるようになりました。

今回は、ここまでです。

次回は、もう少し使いやすく、改造します。

コメントの受付は終了しました。