さて、前回のエントリーの続き。実際にパソコンのログインとログアウトを記録するためのコードを公開したいと思います。
というわけで、今回もまったくボードゲームとは関係ありません。
PCのログイン記録は動かぬ証拠。来たるべき日に備えるべし。
プログラムをご紹介する前に、PCのログを記録しておく重要性の話です。
過労によって労災認定するための証拠
過労によって、身体的な病気になったり、精神的に病んでしまったりした場合には、労災や会社に対する賠償請求が認められる可能性があります。
労災認定されるかどうかの客観的な基準として、発症までの労働時間が決まっています。つまり、「どれだけ働いていたか」という証明が重要なわけです。
「どれだけサービス残業していたか、毎日メモや日記をつけておけ」ということがよく言われますね。
しかし、過酷な労働を強いられている状況で、メモや日記をつけておくのは、相当な精神力がないと無理じゃないでしょうか。そのときを乗り切るのがせいいっぱいで記憶も曖昧だったりするんですよね。
自分は覚えていなくても、毎日働くPCはしっかり覚えています。そのような意味で、PCのログイン記録という客観的事実は有用だと思います。
退職した後に会社に残業代を請求できるかも
「時間外労働を付けたくても、うちの会社はそんな文化じゃない」「上司や先輩の手前、残業を付けるなんてできない」現実にはそんな状況も多いと思います。
でも、退職することになった場合は話は別。会社とはもう縁がないわけですから、気兼ねなく請求することができます。
退職なんてするつもりはない?今は安泰でも会社が傾いて肩たたきを始めるかもしれないし、自分自身が体調を崩すかもしれません。会社を辞める人で、1年前に辞めることが決まっていた人は意外と少ないと思います。
あなたが会社に従順だからといって、会社があなたに誠実とは限りません。いつか会社に裏切られることも考えて、記録はしっかり残しておきましょう。
会社側も本当は客観的記録が重要
私の働いている会社では、過去にサービス残業で労働基準監督署の指導が入ったわけですが、その際「未払い残業代の精算」を実施しました。
精算といっても服務管理をまともにしてなかったわけですから、精算の元にする記録なんてありません。そのため、基本的にはサービス残業時間を社員が自己申告したわけです。
金がからむ話を自己申告させると、何が起きるか・・・。モラルハザードです。
「どうせ立証なんてできないんだから、多めに請求してやれ!サービス残業をやらせてた会社が悪いんだ!」という過大請求する社員が続出したわけです。
一方で真面目に働いてきた社員は、「サービス残業といっても、実際に休憩をして貢献していない時間もあるもんな。会社にいた時間全部を請求するのはやりすぎだろう。」と過少請求。
不真面目な社員が大金を手にし、真面目な社員ほど精算額が少ないという皮肉な結果となりました。そして大金を手にした不真面目な社員は、服務管理が適正化された後は会社で時間を浪費して残業代を請求する給料泥棒になったわけです。
会社側も、客観的事実に基づいた管理をしないと、社員のモラルとモチベーションの崩壊を招くことになるわけですね。
PCのログインログオフを出力するVBScript
前置きが長くなりましたが、Windowでログイン記録を出力するためのコードのご紹介です。
前回のエントリーで登場した勤務表形式のEXCELファイルは、EXCELアプリケーションが入ってないと当然つかえません。アプリケーション利用を制限されている会社もあるので、Windowsパソコンがあれば誰でも使えるようログ取得の機能だけVBScriptとして切り出しました。
タスクスケジューラのログ情報を取得していますので、Windows7以降で使用できるかと思います(PCつけっぱなしでは記録されないので、毎日PCの起動・終了はちゃんとやりましょうね)。
使い方は、後段に記載しているコードの部分を選択してコピーして、メモ帳などに貼り付け。「test.vbs」のような後ろに.VBSという拡張子をつけて保存します。
起動するには保存したファイルをダブルクリック。すると、PClog.csvというファイルがVBSと同じ場所に作成されます。
PClog.csvは、カンマ区切りのCSV形式になっていますので、EXCELやメモ帳などで開くことができます。
起動、シャットダウンとログイン、ログアウトと4種類の区分と時刻が表示されます。
本来は起動とシャットダウンだけでよいのですが、Windows10の場合、終了してもスリープモードとなってシャットダウンがカウントされない場合があるため、ログオンオフも記録しています。
なお、コードの2行目の"2018/01/01"が、ログの取得開始日の設定ですので、適宜修正ください。
'----ログ取得日時の設定---- Const Startday="2018/01/01" '<<<以降のログを取得 Set UTCday = CreateObject("WbemScripting.SWbemDateTime") UTCday.SetVarDate Startday, True 'UTC日時に変換 '----WMIオブジェクトを参照しイベントログを取得---- Set objWMI = GetObject( _ "winmgmts:{impersonationLevel=impersonate}!//.\root/cimv2") Set colEvents = objWMI.ExecQuery ( _ "Select * from Win32_NTLogEvent Where TimeWritten >= '" _ & UTCday & "' and Logfile = 'System' " & _ "and (EventCode = '6006' or EventCode = '6005' or EventCode = '7001' or EventCode = '7002')") '----ログをCSVファイルへ書き込み---- Set objFS = CreateObject("Scripting.FileSystemObject") Set objNewFile = objFS.CreateTextFile("PClog.csv") '<<<ファイル名 objNewFile.WriteLine "EventCode,Time" '項目名 For Each objEvent In colEvents 'ログイン、ログオフを区分 Select Case objEvent.EventCode Case "6005" EventName="起動" Case "6006" EventName="シャットダウン" Case "7001" EventName="ログイン" Case else EventName="ログオフ" End Select 'UTC形式の時刻をJSTの日付時刻に変換しフォーマット修正 UTClog=objevent.TimeWritten JSTTimeWritten = CDate(Mid(UTClog, 5, 2) & "/" & Mid(UTClog, 7, 2) _ & "/" & Left(UTClog, 4) & " " & Mid (UTClog, 9, 2) _ & ":" & Mid(UTClog, 11, 2) & ":" & Mid(UTClog, 13, 2)) _ + TimeValue("9:00:00")'9時間ズレ 'ファイルに書き出し objNewFile.WriteLine EventName & "," & JSTTimeWritten Next objNewFile.Close
プログラムは料理と同じ。素人には素人なりの良さがあるかも。
今回、自作のコードを過程も含めて公開しているid:elveさんのブログを読んで、すごいなぁと思い触発されて公開してみました。
しかしながら、私自身は仕事でプログラムを書いているわけでも趣味でもありません。
そもそも「これはプログラム?コード?スクリプト?なんと書いたらいいんだろう?」というレベル。付け焼刃の知識なので、詳しい人からすればツッコミどころ満載かもしれません。
私は、素人のプログラムは手料理みたいなものだと思っています。
プロの料理人からみると、見栄えも味も手順も今ひとつかも。でも本人と、その味を気に入る人がいる限り価値あるものになる。
というわけで、広い世の中、どこかで役にたつ人がいるといいなぁ。