PowerShell 7を使用すると、サービス認証情報の更新が簡単になります。デフォルトでは、リモート処理時にはPowerShell 7でも、PSSessionがWindows Powershell (v5) になります。PowerShell 7を使用してリモート処理を行うには、組み込みのPowerShell 7構成であるPowerShell.7
を指定できます。ローテーションが完了すると、サービスステータスもDEBUG
に記録されます。
$TaskState = Invoke-Command `
-ComputerName $TargetMachine `
-Credential $Credential `
-ConfigurationName 'PowerShell.7' `
-ScriptBlock { `
Stop-Service $Using:ScheduledTaskName; `
Set-Service -Name $Using:ScheduledTaskName -User $Using:Params.user -Password $Using:Params.newPassword; `
Start-Service $Using:ScheduledTaskName; `
return Get-Service $Using:ScheduledTaskName | Select-Object State;
}
Write-Debug "$ScheduledTaskName is: $($TaskState.State)"
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline=$true)]
[string]
$B64Input
)
$ErrorActionPreference = "Stop"
$DebugPreference = 'Continue'
function ConvertFrom-B64 {
param (
[string] $B64String
)
try {
$Json = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($B64String))
$Output = $Json | ConvertFrom-Json
}
catch {
Write-Error "Failed to convert Base64 string: $B64String"
}
return $Output
}
# JSONデータはBase64エンコードされた文字列としてゲートウェイに渡されます。
$Params = ConvertFrom-B64 -B64String $B64Input
Write-Debug "Running Post-Rotation Script on: $($Params.userRecordUid)"
# Base64エンコードされたJSON文字列から添付されたリソースレコードを変換し、
# 管理者レコードのUIDでフィルタリングして、
# サービスの「Log On As」プロパティを更新するために必要な管理者レコードを見つけます。
$ResourceCredentials = ConvertFrom-B64 -B64 $Params.records
$AdminRecord = $ResourceCredentials | Where-Object { $_.uid -eq '<Admin Record UID>' }
# 各レコードタイプには異なるJSON構造があります。
# この場合、PAMディレクトリレコードタイプを使用しているため、
# loginとdomainNameプロパティからユーザー名を構築する必要があります。
try {
$SecurePassword = ConvertTo-SecureString $AdminRecord.password -AsPlainText -Force
$AdminCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "$($AdminRecord.login)@$($AdminRecord.domainName)", $SecurePassword
Write-Debug "New PSCredential created for: $($AdminRecord.login)"
}
catch {
Write-Error "Failed to create PSCredential for: $($AdminRecord.login)"
}
$ScheduledTaskName = '<Task Name>'
$ScheduledTaskStatus = Invoke-Command `
-ComputerName '<Target Machine>' `
-Credential $AdminCredential `
-ConfigurationName 'PowerShell.7' `
-ScriptBlock {
Stop-ScheduledTask -TaskName $Using:ScheduledTaskName
Set-ScheduledTask -TaskName $Using:ScheduledTaskName -User $Using:Params.user -Password $Using:Params.newPassword
Start-ScheduledTask -TaskName $Using:ScheduledTaskName
return Get-ScheduledTask -TaskName $Using:ScheduledTaskName | Select-Object "State"
}
Write-Debug "$ScheduledTaskName is: $($ScheduledTaskStatus.State)"