WinRPCを使用したPowerShellの例

追加要件

以下の例では、IIS管理ユーティリティappcmdを使用します。このユーティリティがPATHに設定されていることを前提としています。実行ファイルは、IISが有効になっているサーバーでは通常、C:\Windows\System32\inetsrv にあります。

管理者認証情報の使用

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

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

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

IISアプリケーションプールの更新

ネイティブのISS管理RPCコマンドは、Windows Serverの最新バージョンでは使用できなくなり、最後に使用できたのはWindows Server 2008でした。ただし、IIS管理ユーティリティであるappcmdInvoke-WmiMethodを組み合わせると、同様の結果を実現できます。

$IISAppPoolName = '<App Pool Name>'
# Be sure to use single quotes around the app pool name, user, and password to avoid issues with special characters and spaces
$Command = "appcmd set apppool '$IISAppPoolName' /processModel.userName:'$($Params.user)' /processModel.password:'$($Params.newPassword)'"

Write-Debug "Updating IIS App Pool: $IISAppPoolName"
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "powershell.exe -Command `"$Command`"" -ComputerName '<Target Machine>' -Credential $AdminCredential

完全な例

[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 'ybZ49jWPtiFtnjsCwIgmUg' }

# 各レコードタイプには異なる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)"
}

$IISAppPoolName = '<App Pool Name>'
# アプリケーションプール名、ユーザー名、パスワードには必ずシングルクォートを使用してください。これにより、特殊文字やスペースに起因する問題を回避できます。
$Command = "appcmd set apppool '$IISAppPoolName' /processModel.userName:'$($Params.user)' /processModel.password:'$($Params.newPassword)'"

Write-Debug "Updating IIS App Pool: $IISAppPoolName"
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "power

最終更新