WinRMを介したPowerShellの例

管理者認証情報を使用

Windowsのスケジュールタスクの「Log On As」プロパティを更新するには、管理者アカウントなどの適切な権限を持つ認証情報が必要です。

PAMスクリプトを記録に添付する際、リソース認証情報を追加するオプションがあります。リソース認証情報はBASE64でエンコードされたJSONデータの一部としてゲートウェイに渡されます。上記の認証情報は、リソース認証情報として添付する必要があります。

PAMスクリプトには多数のリソース認証情報を添付できるため、添付したリソース認証情報のUIDを把握しておくと、スクリプトで正しい認証情報が使用されてサービスの「Log On As」プロパティが更新されるのを確認するのに役立ちます。

スケジュールタスクの更新

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
}

# The JSON data is passed to the Gateway as a Base64 encoded string.
$Params = ConvertFrom-B64 -B64String $B64Input
Write-Debug "Running Post-Rotation Script on: $($Params.userRecordUid)" 

# Convert the attached Resource Records from Base64 encoded JSON string and find the 
# Admin Record we need to update the Service's `Log On As` property by filtering by the 
# Admin Record's UID.
$ResourceCredentials = ConvertFrom-B64 -B64 $Params.records
$AdminRecord = $ResourceCredentials | Where-Object { $_.uid -eq '<Admin Record UID>' }

# Each record type will have a different JSON structure. In this instance, we are using 
# a PAM Directory record type, so we need to build the username from the `login` and 
# `domainName` properties.
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)"

最終更新