・ PowerSheII で業務自動化 社内の全 PC の Wi n d ows ログオン / ログオフ時刻を集計するはなし 1 . Act ⅳ eD ⅳ ectory ユーザーのログオン / ログオフ時刻を記録しよう 情シス担当者が社内の PC を管理する上で、ユーザーのログオン / ログオフ状況を把握すること は重要です。また、社員の勤務状況を把握する上でもログオン / ログオフ情報は有益と言えます ( タ イムカードの代替というより、あくまで裏付けデータではありますが ) 。 そこで今回は、 ・社内の全ユーザーの Windows ログオン / ログオフ時刻を記録 & 集計。 人事担当者などが使う社内報告用の ExceI 書式に時刻情報を埋め込む。 という作業を、全て Powershell による自動処理で行います。 ■ログオン / ログオフスクリプトをポリシー登録する Act ⅳ eDirectly の OU にスクリプトをポリシー登録することで、ユーザーのログオン / ログオフ時 刻をイベントログとして記録できます。スクリプトの登録は通常通りドメインコントローラの「グ ループポリシー管理工デイター」から行います。「ユーザーの構成」→「ポリシー」→「 Windows の設定」→「スクリプト ( ログオン / ログオフ ) 」の「ログオン」または「ログオフ」のプロバティ 画面の「 PowerSheII スクリプト」タブからスクリプトファイルの登録ができます。 ここで問題なのは、ログを各 PC 側に記録するか、サーバ側に記録するかということ。 PC 側にロ グを記録した場合、それらのログを集計する際、テータをサーバに集めなければなりません。一方、 サーバ側にログを記録する場合も、漏れなく口グを記録するためには PC からサーバへのネットワー ク接続が確立している必要があります。据え置きのデスクトップ PC ならともかく、ノート PC やタ プレット PC の場合、起動時に IOO % が社内 LAN に繋がっているわけではありません。 そこで今回は、 PC とサーパ両方にログを記録する方法をとります。両方に記録すれば、 IO()% と はいかないまでも、ほぼ全てのログデータを集められ ( ると信じ ) ます。 グル - プポリシー管埋工デイター カイ JI•(F) 擾作 ( A ) 表示 ( v ) 以 H ) スケ」介師 w を以的プト ー」ログオンログ 1 フスプト [ R 日 M 巧 . RBM. 1 ・キコンビューターの橋成 日 レ二ルー w 朝 ws 師 w ぎ計ログわス刎プト ( ログわ・ログオフス夘プト レ二基本設定 ユーザーの橋成 名前 ) 二ソフめ : アび定 ログオンイバントを記録 . 1 議二 W ⅳ過 0W5 の設定 当スプト ( ログわ / ログわ ) セキュリティの設定 0 朝方ルダーリダイレクト 画和ルーベースの 85 0 二第理用テンオ′ート : ローカル 1 ログオンのプロバティ 名 ログオン ログわ 対応 ) プロ哲の表示 ユーザーログオンス夘プトを言んでいま す . パラメーター レ二る本設定 この (X) では、次「飛てスケ」プトを実行します ( F ) 師 w 計スケガトにま少なくとも W 物 1 、、 57 または W 朝 1 面 ws 「飃「 方れ爆示 ( 斗・・ 匚区コ [ 河コ「一一亟 ) 加が必要です ■■ Windows Server 2012 R2 [ 図 4 川口グオンスクリプトの登録 15
■処理の流れ 今回の Powershell スクリプトで行う一連の処理の流れは以下の通りです。 ① LAN 内の各 PC のローカルフォルダからログの CSV ファイルを収集。サーバ側のイベントログ も CSV 出力します。 ② CSV を結合。各ユーザ 1 日毎の初回ログイン、最終ログオフ時刻を抽出。 ③ユーザーごとの CSV ファイルに分割。 ④ ExceI に変換 ⑤ Excel テンプレートから「勤怠管理表」を生成。④で生成した Excel ファイルの値を参照する 参照式を配置します。 -Section 4 ー社内の全 PC の Windows ログオン / ログオフ時刻を集計するはなし ログ集計の流れ テンプレート (xlsx) ログファイル (CSV) サー ⑤生成 ①ファイル収集 ②結合 一時ファイル ( CSV) ③分割 勤怠管理表 (xlsx) 値を参照 ログファイル ( CSV) ④変換 ログファイル ( csv) 参照用ファイル ヨ , ューザー別 (xlsx) [ 図 4 ー 6 ] ログ集計処理の流れ ■「勤怠管理表」テンプレート 今回のスクリプトでは社内資料として使うことを想定した「勤怠管理表」の Excel ファイルを生成 します。このファイルはほかの担当者が適宜、備考欄などを編集するものです。しかし、ログオン / ログオフ時刻欄だけは、ファイルを生成した日以降も自動更新されるようにしなければなりません。 そこで今回は、直接 Excel ファイルに値を格納するのではなく、値格納用の Excel ファイルを別途生 成し、 Excel の参照式により外部参照を行います。外部参照の値は、一旦、全てデータシートに格納し ておけば、あとは通常通りプック内で VLOOKUP 関数などを使うことができます。 18
本語氏名 ) を格納。そして、ワークシート「 data2 」上には先程の参照用 Excel の値を参照する関数式 -Section4- 社内の全 PC の Windows ログオン / ログオフ時刻を集計するはなし を設置してゆきます。外部 ExceI ファイル内の値は、 ■定時実行で自動運用 イルに対する読み取りアクセス権が必要です ) 。 = ℃ :\hogehoge\[f00.xIsx]bar'!AI のようにフォルダバス、ファイル名、シート名、セルを指定することで参照できます ( 当然、そのファ にお声掛けください ( ^ ^ ) / ので、「こんな業務の自動化をやってみたよ ! 」「もっと良い書き方があるよ ! 」という方はぜひ気軽 個人的にも今後は一層 PowerShe Ⅱを使った業務自動化に地道に取り組んでいきたいと思っています えずは一つの例として頭の隅にでも置いていただければと思います。 イルのみを保存するよう改良が必要です。 Excel の処理の部分も改良する必要がありますので、とりあ ル数が徐々に増えて処理時間が長くなってしまいます。安定的に運用するためには、重複排除したファ 今回のスクリプトは実行する度にログファイルを新規に生成してそのまま溜めてしまうので、ファイ するようにしておけば、ログの集計と ExceI ファイルへの転記を全自動で行うことができます。尤も、 この「ログオン・ログオフ集計 . psl 」をタスクスケジューラに登録し、日中 1 時間に 1 回程度実行 て生じたいかなる損害に対しても、著者は責任を負いかねます。ご了承ください。 本書に掲載しております情報に基づいて行った機器の分解・改造、サンプルコードの実行等によっ ■こ注思 【スクリプト検証環境】 WindowsServer 2012 R2 Windows 10 Pro Creators Update 64bit PowerShell 5.1 奥付 発行日 : 2017 年 10 月 22 日 「 Gijutsu-san-saku 2017 Autamn 」 URL : http: 〃 clear-mint. net : clear-mint 印刷 : グラフィック 26 発行
2 . ログを収集・加工する ここからは、ログ情報を集計し Excel ファイルを作成する実際のスクリプトを解説します。あくま で一例ですので、実際には要件によって変わってくる部分も多いと思いますが、参考にしていただけ ればと思います。 ■ログ集計スクリプト ではさっそく見ていきましよう一図 4- IOIO まずは DLL の読み込み、作業ディレクトリや Excel テン プレートファイルのパスの宣言です。 1 # DLL の読み込み 2 -CRef lect ion. AssembI ⅵ : LoadFiI e ( 3 "C:%Program Fil es (x86)YOpen XML SDKW2. 5 Ⅵ i bVDocumentFormat. 0penXmI. dll") 4 •CRef lect ion. AssembI y] : LoadFiI e ( 5 "C:%Iog_testVCIosedXML. dll " ) 6 7 8 # ファイル出力用フォルダと一時フォルダのパスです。 9 $d i r "C:%log—testV" 10 $dirLog = $dir + 勹0g\ 11 $dirTemp = $dir + 'temp% 1 2 $templ= $d i rTemp + 'templ. csv 1 3 $temp2= $d i rTemp + 'temp2. csv 14 $dirPersonalCsv = $dirTemp + personalCsvV" 15 $dirRef = $dir + "referral%" 1 6 $d i rK i nta i = $d i r + " 幻 sxV 1 8 # ExceI テンプレートファイル 1 9 $xITempIate = $d i r + "templ ateYtemplate-2017. 幻 sx' 20 21 # 各 PC のログ保管フォルダ 22 $d i rLogRemote "c$%l og-csv%" 23 24 # 該当フォルダがない場合は作成します。 26 27 # 前回実行時に生成したファイルを削除します。 28 rm $d i rK i nta i * $d i rRef* $d i rTemp* -Recurse -Force 29 -Section4- 社内の全 PC の Windows ログオン / ログオフ時刻を集計するはなし 25 $dirLog, $dirTemp, $dirRef, $dirKintail ? い (Test-Path $ - ) } ー % { mkdir $ ー } [ 図 4-10 ] 「ログオン・ログオフ集計 . psl 」宣言部分 そして、つぎの [ 図 4 ー 11 ] がメイン処理部分です。 20
■ログファイルの収集 38 { 49 { -Section 4 ー社内の全 PC の Windows ログオン / ログオフ時刻を集計するはなし ,"20141ハ橋1","SYStem. Byte , " 201310 01 " , " System. B 員 e ,"201511鴨10","SYStem. Byte , " 201311 11 " , " Sys 土 em. Byte , " 201502 お 10 " , "System. Byte , " 201506VW1 " , "System. Byte , " 201506 Ⅷ 01 " , "System. Byte , " 201506VW1 " , System. Byte , " 201506V 1 " , "System. Byte 30 32 39 40 42 43 44 } 45 46 50 53 54 } param ($hostnames, $d i rLogRemote, $dst) workf low coll ectPcLog 36 # workflow で foreach ー para Ⅱ引を使い実行すると、終了を待たず並列的に実行します。 35 # function だとシーケンシャルに処理されるので時間が掛かりますが、 34 # 各 PC からのログファイル収集を行うワークフロー cp $src $dst -Force + $dirLog 十 *. CSV + $hostname 十 $src foreach -para Ⅱ引 ($hostname i n $hostnames) { 48 funct ion epEventLogF Ⅱ e ()d i r, $ i d) 47 # ログを取得し、指定のフォルダに出力する関数 [ 図 4 ー 12 ] 「ログオン・ログオフ集計 . psl 」ログ CSV の出力・収集部分 EventID -eq $ i d } epcsv $Fu Ⅱ Name -Encod i ng UTF8 Get—EventLog App ⅱ cat ion . CSV") [string] ($dir + $jikan + $Fu llName yyyyMMdd-HHmmss" $j i kan = Get-Date -Format CSV 形式で保存します。ファイル名は現在時刻です。実際に出力した CSV は [ 図 4 ー 13 ] のようなもの グを CSV 出力する関数です。イベントログ ( アプリケーション ) の中から、 ID が 8 のものを抽出し、 その下 ( 48 行目 ~ ) の関数「 epEventLogFiIe 」はスクリプトを実行しているサーバ上のイベントロ に短縮できます。 理完了を待たずにどんどん実行するというだけで、マルチスレッドではないですが ) 、処理時間を大幅 ンシャルに実行されますが、ワークフローの「 foreach -parallel 」の場合、並列的に処理するので ( 処 Workflow Foundation) で処理します。通常の関数で「 foreach 」処理した場合、対象 1 件ずつ、シーケ この処理は 1 件ごとにそれなりの待ち時間が発生しますので、関数ではなくワークフロー (Windows ザーが各フォルダに対し読み取りアクセス権を持っていることが前提です。 ) です。各 PC の C ドライプ上の所定フォルダから CSV ファイルを収集します。 ( スクリプトの実行ユー [ 図 4 ー 12 ] の「 coIIectPcLog 」 ( 37 行目 ~ ) は LAN 内の PC からログファイルを収集するワークフロー となります。ここから必要な情報を抽出してゆきます。 20171011-113109. csv - メモ帳 方イル旧編集 ( 印書式 ( 0 ) 表示 ( Y ) しプ凹 科 System. Diagnost ics. EventLogEnt 「 y # 如司 icat ion/AppIicat ion / 8 ID", " chi 「 " , "Data" "lndex", "Category", "CategoryN1-rnbe 「 ", "EntryType Message , 」「 ce " , " R 印 c 印土 St 「 ings , "lnstanceld", "Tin•r , " 79153 " , , " 79151 , " 79145 " , " デバイス " , " 79146 " , " デバイス " , " 79147 , " デバイス " , " 79148 " , " デバイス " " , " 79149 " , " デバイス " , , " 79150 " , " デバイス " , , " デバイス " , , " 79152 " , " デバイス " デバイス " lnformat ion " , " ソース lnformat ion , lnformat i01 lnformat ion lnformat ion lnformat ion AppIication' のイベント田 ' 8 ' の説明が " ソース 'Application' のイベント ' 8 ' の説明が " ソース 'Application' のイベント ID ' 8 ' の明が " ソース 'AppIication' のイベント ID ' 8 ' の説明が のイベント ID ' 8 ' の説明が " ソース 'Application' のイベント ID ' 8 ' の説明が " ソース 'Application' lnfo 「士 ion " , " ソース 'Application' のイベント ID ' 8 ' の説明か lnformation , " ソース 'Application' のイベント ID ' 8 ' の説明が lnformation" " ソース 'Åpplication' のイベント ID ' 8 ' の説明が つかりません。必 つかりません。 つかりません。 つかりません。必 つかりません。必 つかりません。必 ! つかりません。必 つかりません。必 つかりません。 ロ [ 図 4 ー 13 ] ログを CSV に出力したもの 22
目次 きままに散策、いつでも模索。技術で遊ひ、未来を感しる情報誌。 2017 Aut amn Gijutsu-san-saku 目次 専用メガネがないと見えない ! ? 「魔法のモニタ」作り方大解説 iPhone5 と非純正バーツで作る ! 「魔法のスマホ」作り方大解説 【特集】 多重化映像技術、エンターティンメント技術研究の最前線 神奈川工科大学 白井研究室見学レポート PowerShelI で業務自動化 社内の全 PC の Windows ログオン / ログオフ時刻を集計するはなし ごあいさつ こんにちは。 Yuki lchinomiya( いちのみやゆき ) と申 ゆき@技術書典 3 【い 10 】 します。この本をお手に取っていただきありがとうござ 出来ました。これで周りの目を気にせずネッ います。 トサーフができるよー ! ! 今回は本年 8 月に Twitter へ動画を投稿した際にた くさんの反応を頂きました「魔法のモニタ」の作り方 をご紹介します。動画に使用したノート PC 版に加え、 iPhone 5 を使った「魔法のスマホ」にも挑戦してみま したので、ご興味ある方は参考にしていただければ と思います。 また、第 3 章では、液品を使った「多重化・不可 視化技術」の研究をされている神奈川工科大学の白 井博士の研究室について、見学レポートを掲載させ 16 : 14 - 2017 年 8 月 22 日 ていただきました。白井研究室では、多重化・不可 0 ・・・ま 0 ま 0 59 , 512 件のリツィート 71 , 843 件のし、いね 視化技術だけでなく、広くエンターティンメント技 0 218 59 , 512 (0 71 , 843 ⅲ 術の研究を行われており、中でも、「仮想育児」を 体験できる VR 作品『 Real Baby ー Real Family 』は大変ユニークで、必見です。 また、前回の本に引き続き、 PowerShe Ⅱを使った業務自動化のスクリプトもご紹介します。・・・・・・何 とも、ごった煮感のある内容構成ですが、同人誌ならではのフリースタイル ( ? ) として温かい目で読ん でいただければ幸いです。 2017 年 10 月いちのみやゆき 0 ! ノ 0 19 ( ) ) / 1
-Section 4 ー社内の全 PC の Windows ログオン / ログオフ時刻を集計するはなし epcsv $Fu llName -Encod i ng UTF8 4 # イベントログに出力する文字列。ログオフスクリプトでは " がログオフしました。 [System. Secur i ty. Pr i nc ipal. Wi ndowsldent i ty] : GetCurrent ( ) $user i nfO 1 # ログインユーザー情報を取得。 2 3 6 9 24 25 十 " がログオンしました。 -EventId 8 -EntryType lnformat ion -ComputerName server01 1 2 Wr i te-EventLog -LogName App licat ion -Source App ⅱ cat ion 11 # ログをサーバに記録 —EventId 8 -EntryType lnformat ion -Message $msg 8 Wr ite-EventLog -LogName App ⅱ cat ion -Source App ⅱ cat ion 7 # ログを PC 本体に記録 $user i nfO. Name 5 $msg "yyyyMMdd-HHmss" 1 6 $j i kan = Get-Date -Format 1 5 $hostname = $Env:COMPUTERNAME —Message $msg 1 7 $d i r ー 'C:%Iog—csvV 19 # CSV 出力用フォルダが無い場合は新規作成 20 i f (' (Test-Path $d i r) ) {md $d i r} 22 # CSV ファイルバス 23 $Fu llName [str i ng] ()d i r + $hostname + # 過去のイベントログを取得し、 CSV 出力 + $j i kan 十 . CSV") 26 Get-EventLog App ⅱ cat i on Event I D ¯eq 今回登録するスクリプトは [ 図 4 図の通りです。 [ 図 4-2 ] 「ログオンイベントを記録 . psl 」 ■イベントログを CSV 出力→加工→ Excel 書式に取り込む カルのフォルダにログを出力した CSV ファイルが溜まってゆきます。 登録完了し、ポリシーが適用されると、徐々にイベントログが記録されてゆきます。同時に、各 PC のロー ClosedXML は GitHub ページからダウンロードできます。 「 CIosed 」というネーミングですが、ちゃんとオープンソース ( MIT ライセンス ) のライプラリです。 でも使用できるという利点があります。ちなみに「 CIosedXML 」は後述の「 OpenXML 」の反対 ( ? ) の かし、 ClosedXML のほうが動作も安定し、高速です。また、 ExceI がインストールされていない環境 lnterop. Excel.Application) を使うという手段もあります ( 筆者は VB script でよく使ってました ) 。し PowersheII から ExceI ファイルを扱う方法としては、 ExceI の COM オプジェクト (Microsoft. Office. PowersheII で ExceI ファイルを扱うために、今回は CIosedXML というライプラリを使用します。 ■ Powershell で Excel ファイルを扱う 集計も自動化し、そのまま社内資料に使える ExceI ファイルを出力できるようにしましよう。 提出する必要があります。かといって、毎回手作業でテータ集計するのは面倒です。せつかくなので、 情報として生かすのであれば、データを集計し、それらしい書式に整えた上で人事部などの担当者へ ただイベントログを集めて眺めているだけでは、情報を活用できているとは言えません。勤怠管理 https: 〃github.com/ClosedXML/ClosedXML/reIeases マ CIosedXML ダウンロード 16
-Section 4 ー 社内の全 PC の Windows ログオン / ログオフ時刻を集計するはなし 162 1 66 1 69 171 1 73 1 75 176 179 181 182 185 188 189 1 92 1 93 1 94 1 95 196 : 198 1 99 200 epcsv $templ -Append -Encod i ng UTF8 } ¯eq Enab led "TRUE" } 190 → gci $dirPersonaICsv -FiIe ー % { group -AsHashTab 厄 -AsStr i ng -Property "SamAccountName 187 $AdUsers = Get-ADUser —F ilter * -Propert ies * ー sel ect SamAccountName Di spl ayName 186 # ActiveDirectory 上ののユーザ—ID と表示名を一括取得。 184 sp litCsv $temp2 $d i rPersonaI Csv "UserName" 183 # 個人別の CSV ファイルに分割 processCsv $temp2 180 # 「 temp2. csv 」から必要項目を抽出・加工し、上書きします。 sort —Un i que -Descend i ng ー Out-F ⅱ e $temp2 -Encod i ng UTF8 —Append 1 78 type $templ ー 177 # 重複を削除し、一時ファイル「 temp2. csv 」に出力 gCl -r $dirLog -FiIe ー % { ipcsv $_FuIIName 174 # ログ CSV を結合し、一時ファイル「 templ. csv 」に出力 Name $d i rLogRemote $d i rLog 1 72 co Ⅱ ectPcLog $computers. $computers = Get-ADComputer -FiIter * ー ? { $ 170 # 各 PC のログを収集 1 68 epEventLogFil e $d i rLog 8 167 # サーバ上のログを取得し、指定のフォルダに出力 1 64 # # # # # # メイン処理 # # # # # # # CSV の内容をそのまま Exc 引出力します。この Exc 引ファイル上の値を「勤怠管理表」から参照します。 —repl ace 十 BaseName $d i rKi ntai ( ($AdUsers [ $ ー BaseName] Di splayName) epK i nta i F Ⅱ es $ ー # 苗字と名前の間にスペースがあったりなかったりするので、スペースを除去しています。 # 「勤怠管理表」を Exc 引出力します。ファイル名は AD の表示名 ( 日本語の氏名 ) です。 BaseName convertTOXI sx $ ー Fu llName ()d i rRef + $ ー [ 図 4- 川「ログオン・ログオフ集計 . psl 」メイン処理部分 イル入出力が多いと処理時間が増えるので、実運用に乗せる段階では入出力を極力省いたほうがよい ように工程ごとに CSV を出力するようにしておいたほうが、デバッグしやすいです。 ( もちろん、ファ CSV ファイル「 ( ユーザー名 ). csv 」を作成します。 PowersheII で CSV ファイルを加工する際は、この 処理の途中、一時ファイルとして「 temp\templ. csv 」「 temp\temp2. csv 」およびユーザー名ごとの 各処理を行っている関数につきましては次へージ以降で解説します。ちなみに、このスクリプトは 収集した csv ファイル→ [ 結合 ] →「 templ. csv 」→ [ 重複排除 ] →「 temp2. csv 」 CSV 加工の流れは以下の通りです。 です ) 。 21 として整理しておいてもよいかもしれません。 CSV ファイルを扱う上で、 CSV 同士の結合や分割はよく行う処理なので、汎用性のあるモジュール → [ 分割 ] →「 ( ューザー名 ). csv 」