雑木林

頭の中の整理と忘れないための確認メモ

PowerShellで自動ログ取得

Windows10になるとPowerShellSSHができたり色々と便利になっていることに気づきました。
しかしTeraterm等と比べると色々足りないなーと思うこともチラホラあります。
その1つにログの自動取得があるのですが、いくつか対応方法があったのでメモします。

PowerShell Profilesを利用する場合

PowerShellにもbashでいうbash_profileのよう実行時に自動的に読み込まれるProfileがあります。

Windows PowerShell プロファイル | Microsoft Docs

ここでStart-Transcriptを実行することでログを取得してしまおうという方法です。
ただし、これを利用する場合はスクリプト実行ポリシーがRemoteSigned以下である必要があります。

PowerShellを管理者権限で実行し、実行ポリシーをRemoteSignedに設定します。

PS C:\Windows\system32> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined


PS C:\Windows\system32> Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
PS C:\Windows\system32> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    RemoteSigned
 LocalMachine       Undefined

今回はログインユーザの全シェルのログを取得するので、以下のファイルを作成します。
(ログの保存先のディレクトリは予め作成しておいてください。)

%UserProfile%\My Documents\WindowsPowerShell\profile.ps1

# ログディレクトリのパス(C:\Users\ユーザ名\Documents\WindowsPowerShell\logs)
$logdir = join-path ([Environment]::GetFolderPath("MyDocuments")) "\WindowsPowerShell\logs"
# ログファイル名
$fileName = (Get-Date).ToString("yyyyMMdd_HHmmss") + ".log"
# ログファイルのパス
$logfile = join-path $logdir $filename

# ログディレクトリが存在する場合、ログ取得を開始
if ( Test-Path $logdir ) {
    Start-Transcript $logfile -append
} else {
    Write-Host ("No such directory : " + $logdir)
}

次回以降のPowerShellの実行時に以下のような表示がされ、ログ取得が開始されます。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

トランスクリプトが開始されました。出力ファイル: C:\Users\admin\Documents\WindowsPowerShell\logs\20190406_151853.log
PS C:\Users\admin>

グループポリシーで設定する場合

グループポリシーでログを取得するように設定する方法です。
こちらで設定するほうがいろんなログが取得できるようです。

スタート -> gpedit.msc よりローカルグループポリシーエディタを開きます。
ユーザの構成 -> 管理用テンプレート -> Windowsコンポーネント -> Windows PowerShell よりPowerShell トランスクリプションを有効にするを編集します。

f:id:zokibayashi:20190406153536p:plain

トランスクリプションの設定にて、有効化とログ保存先のディレクトリを指定します。

f:id:zokibayashi:20190406153607p:plain

次回以降のPowerShellの実行時には何も表示されませんが、ログ保存先のディレクトリ配下にログが保存されています。
日ごとログファイルが分けられて保存されるため、こちらのほうが便利ですね。

セキュリティを意識した設定

今回は自分の操作ログを保存したかったので上記の対応となりました。
しかし、セキュリティ対策を考えると他にも設定したほうが良さそうな項目がありそうです。
こちらのサイトに詳しく書かれおり、参考になりました。

level69.net

それでは良いPowerShellライフを!