Active Directoryでログイン時にPowershell経由でexeを実行

TL;DR Active Directoryでログイン時にexeファイルを実行する場合はStart-Processでの実行が必要 経緯 Emotetが流行っているので、EmocheckをActive Directory のログインスクリプトに仕込んでみていた。 単体では実行できるので問題ないと考えていたが、どうもActive Directory のグループポリシーでログイン時に起動する設定をすると何故か実行されない。イベントログを見ると一応対象として認識されているのだが… Powershell から外部ファイルを実行するにはいくつか方法があるが、以下のように実行するとダメなようだった。 $proc = New-Object "System.Diagnostics.Process" $psi = New-Object "System.Diagnostics.ProcessStartInfo" $psi.FileName = $emocheck_Exe $psi.Arguments = "-output $reportDir -quiet -json" $psi.CreateNoWindow = $true; $psi.UseShellExecute = $false $psi.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden $proc.StartInfo = $psi $proc.Start() 以下のように設定することでログイン時に実行されるようになった。 Start-Process -WindowStyle Hidden -FilePath $emocheck_Exe -ArgumentList "-output $reportDir -quiet -json" -WorkingDirectory $currentDir

<span title='2022-03-23 00:00:00 +0900 +0900'>March 23, 2022</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

Windowsバックアップの結果通知

Windowsバックアップの結果通知は、タスクスケジューラにて成功/失敗のイベントログをトリガーにしたタスクを作るよう説明しているサイトが多い。 が、自社の環境ではちょいちょい通知が来ないことがある。イベントログを確認してみると記録はされている。イベントログのトリガは不安定と感じている。 そこで、直接成功/失敗のイベントログを見に行って、その結果をもとに通知するほうが確実と判断。現在テスト中。 以下がとても参考になった。 https://stackoverflow.com/questions/51769582/powershell-script-not-pulling-event-from-event-log 実際には以下のようなコードで運用している # 何時間前までのログを対象にするか $PastHours=12 $StartAt = (Get-Date).AddHours(-$PastHours) # バックアップ成功時に記録されるイベントログ $FilterHashTable = @{ logname = "Microsoft-Windows-Backup" id = 4 StartTime = $StartAt } try{ $actions = (Get-WinEvent -FilterHashtable $FilterHashTable -ErrorAction Stop) if ($actions){ ForEach($action in $actions){ Write-Host "OK: Windows Backup Completed Successfully at $(($action.Task)),$(($action.TimeCreated))" Exit 0 } }else{ Write-Host "CRITICAL: Windows Backup has not run in past $PastHours hours" exit 1 } }catch [Exception] { Write-Host "CRITICAL: Windows Backup has not run in past $PastHours hours" Exit 1 }

<span title='2021-06-15 00:00:00 +0900 +0900'>June 15, 2021</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

PowershellでActiveDirectory情報取得で原因不明の不具合

Active Directoryの情報をPowershellで取得し、管理資料に起こすスクリプトを作成。せっかくなので定期的にスクリプトを実行して差分がないかタスクスケジューラで定期実行してチェックする運用を構築していた時に問題が発生。 手動で実行する分には問題ないのだが、タスクスケジューラを通して実行するとなぜか以下問題が発生 ADのオブジェクトのSort-Objectでの並び替えが効かない Get-GPOReportで出力した一部XMLに差分が検知される。実際に比較してみると差分はないのだが… https://social.technet.microsoft.com/Forums/ja-JP/a7e363fa-4553-4468-b123-a1e971c68a78/12525124641245812501123751239012356124271251812540124701254012?forum=powershellja によると、手動実行とタスクスケジューラからの実行時で既定のモジュールパスが異なるということなので、それによるのかもしれない。が、プログラムがこけているわけではないので、原因はどれなのか得的できず、どれをロードすればよいのかわからない。 実行の都度生成されるファイルが変わってしまうようではチェックには使えないということで、タスクスケジューラによるチェックは断念した。 Powershellをタスクスケジューラから呼び出す処理はほかに多数書いており、問題になったことはない。Active Directoryを操作する際にはImport-Moduleで専用のモジュールを読み込んで処理をするのだが、こういった書き方をする場合に問題となるのかもしれない。 原因は不明。

<span title='2020-10-09 00:00:00 +0900 +0900'>October 9, 2020</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

PowershellのToStringの書式指定ではまった

PowerShellのToStringで数値を書式指定で出力する際にはまった2点。どちらもエラーメッセージが適切ではなく、原因特定に苦労した。 PSVersion 5.1.14393.2969, Windows Server 2016上のISEで開発。Set-StrictMode -Version latest 書式#,#はダメ $num.ToString('#,#') にて$numが0だと「“ToString” のオーバーロードで、引数の数が “1” であるものが見つかりません。」と出る。 $num.ToString('#,0') とすることで、正しく出力される。 キャスト後のtoString $s_num="99,999,999,99" の場合に書式指定で出力したい場合、いったんlongにキャストするので [long]$s_num.ToString("#,0") と書くと、同様に「“ToString” のオーバーロードで、引数の数が “1” であるものが見つかりません。」とでる。正解は ([long]$s_num).ToString("#,0") キャスト演算子よりもToStringの方が優先度が高いのか…

<span title='2019-07-01 00:00:00 +0900 +0900'>July 1, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41