私は PsExec を使用してリモート マシンで PowerShell スクリプトを実行していますが、その副作用として、「Windows PowerShell」イベント ログ (イベント ビューアーの「アプリケーションとサービス ログ」にあります) に、スクリプトへのすべての引数が「HostApplication」の下に記録されます。これらの引数の一部には機密性の高いパスワードが含まれているため、これは問題となります。
以下にリストされている設定変数を false に設定してみましたが、PowerShell エンジンの起動時にログが作成されます。私が読んだところによると、これは PowerShell がこれらの設定変数の値をチェックする前にこれらのログを作成するためだそうです。
$LogEngineLifeCycleEvent=$false;
$LogEngineHealthEvent=$false;
$LogProviderLifeCycleEvent=$false;
$LogProviderHealthEvent=$false;
現在のソリューションでは、これらの設定変数と、各 PowerShell スクリプトの先頭に次の行を追加して、PowerShell エンジンの起動時に作成されたログが消去されるようにしています。
Clear-EventLog "Windows PowerShell";
このソリューションは問題ありませんが、パスワードがログに保存されず、ログをクリアする必要がなくなるようにしたいと考えています。PowerShell エンジンのライフ サイクルのどの時点でもイベントが作成されないように PowerShell ログを無効にする方法はありますか?
答え1
私は次のように考えるローカルグループポリシー特に2番目は必要なものです:
モジュールログをオンにする
もし、あんたが無効にするこのポリシー設定を有効にすると、すべての Windows PowerShell モジュールで実行イベントのログ記録が無効になります。モジュールに対してこのポリシー設定を無効にすることは、モジュールの LogPipelineExecutionDetails プロパティを False に設定することと同じです。
PowerShell ブロック ログを有効にする
このポリシー設定により、Microsoft-Windows-PowerShell/OperationalへのすべてのPowerShellスクリプト入力のログ記録が有効になります。イベントログこのポリシー設定を有効にすると、Windows PowerShell は、対話的に呼び出されたか、自動化によって呼び出されたかに関係なく、コマンド、スクリプト ブロック、関数、およびスクリプトの処理をログに記録します。
もし、あんたが無効にするこのポリシー設定では、PowerShell スクリプト入力のログ記録が無効になります。
- プレスWin+R
- タイプ
gpedit.msc
- へ移動
Computer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell
- 次に、上で説明した設定を構成します
答え2
私も同じ問題を抱えていたので、イベント ログを削除するこの関数を作成しました。
Function Remove-PowerShellEventLog {
Write-ToLog -Message 'Remove the PowerShell event log'
# Function constants
$PowerShellKey = 'SYSTEM\CurrentControlSet\Services\EventLog\Windows PowerShell'
$Admins = 'BUILTIN\Administrators'
$ReadWriteSubTree = [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree
$TakeOwnership = [System.Security.AccessControl.RegistryRights]::TakeOwnership
$ChangePermissions = [System.Security.AccessControl.RegistryRights]::ChangePermissions
# Define a C# type using P/Invoke and add it
# Code borrowed from https://www.remkoweijnen.nl/blog/2012/01/16/take-ownership-of-a-registry-key-in-powershell/
$Definition = @"
using System;
using System.Runtime.InteropServices;
namespace Win32Api
{
public class NtDll
{
[DllImport("ntdll.dll", EntryPoint="RtlAdjustPrivilege")]
public static extern int RtlAdjustPrivilege(ulong Privilege, bool Enable, bool CurrentThread, ref bool Enabled);
}
}
"@
Add-Type -TypeDefinition $Definition -PassThru
# Enable SeTakeOwnershipPrivilege
$Res = [Win32Api.NtDll]::RtlAdjustPrivilege(9, $True, $False, [ref]$False)
# Open the registry key with Take Ownership rights and change the owner to Administrators
$Key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("$PowerShellKey\PowerShell", $ReadWriteSubTree, $TakeOwnership)
$Acl = $Key.GetAccessControl()
$Acl.SetOwner([System.Security.Principal.NTAccount]$Admins)
$Key.SetAccessControl($Acl)
# Re-open the key with Change Permissions rights and grant Administrators Full Control rights
$Key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("$PowerShellKey\PowerShell", $ReadWriteSubTree, $ChangePermissions)
$Acl = $Key.GetAccessControl()
$Rule = New-Object System.Security.AccessControl.RegistryAccessRule ($Admins, 'FullControl', 'Allow')
$Acl.SetAccessRule($Rule)
$Key.SetAccessControl($Acl)
# Remove the parent and subkeys
Remove-Item -Path "HKLM:\$PowerShellKey" -Force -Recurse
# Restart the Event Log service to enforce changes
Restart-Service EventLog -Force
}