WinRPCを介したPowerShellの例

管理者認証情報を使用

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

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

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

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

schtasksコマンドを使用して、スケジュールタスクの認証情報を更新できます。このコマンドでタスクを実行するには上記の管理者資格情報が必要となります。

schtasks /change /tn $ScheduledTaskName /s '<Target Machine>' /u $AdminUserName /p $AdminRecord.password /ru $Params.user /rp $Params.newPassword

残念ながら、schtasksコマンドは PowerShell コマンドレットではないため、その出力は$errorでキャプチャされません。そのためschtasksコマンドの終了ステータスに関係なくゲートウェイでは常に成功と表示されます。この問題を解決するには、schtasksを呼び出すたびに追加のエラーチェックとして$LastExitCodeをチェックします。

if( $LastExitCode -ne 0 ) { 
    exit $LastExitCode 
}

完全な例

[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>' }
$AdminUserName = "$($AdminRecord.login)@$($AdminRecord.domainName)"

$ScheduledTaskName = '<Scheduled Task Name>'
Write-Debug "Updating Scheduled Task: $ScheduledTaskName"
schtasks /change /tn $ScheduledTaskName /s '<Target Machine>' /u $AdminUserName /p $AdminRecord.password /ru $Params.user /rp $Params.newPassword
if( $LastExitCode -ne 0 ) { 
    exit $LastExitCode 
}

最終更新