WinRMを使用したPowerShellの例

WinRMを使用してIISアプリケーションプールの認証情報をローテーション

要件

対象サーバーでWindows Server 2012以降が実行された状態で、IISAdministrationモジュールがインストールされ、有効になっている必要があります。

管理者認証情報の使用

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

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

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

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

IISServerManagerを使用すると、以下のスクリプトブロックを呼び出して認証情報を更新し、ISSアプリケーションプールを再起動できます。

$IISAppPoolName = '<App Pool Name>'
$AppPoolStatus = Invoke-Command -Computername '<Target Machine>' -Credential $AdminCredential -ScriptBlock { 
    Import-Module IISAdministration 
    $ServerManager = Get-IISServerManager
    $AppPool = Get-IISAppPool -Name $Using:IISAppPoolName
    $AppPool.Stop()
    $AppPool.ProcessModel.IdentityType = "SpecificUser"
    $AppPool.ProcessModel.Username = $Using:Params.user
    $AppPool.ProcessModel.Password = $Using:Params.newPassword
    $ServerManager.CommitChanges()
    $AppPool.Start()
    return $AppPool
}

Write-Debug "$IISAppPoolName is: $($AppPoolStatus.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)"
}

$IISAppPoolName = '<App Pool Name>'
$AppPoolStatus = Invoke-Command -Computername '<Target Machine>' -Credential $AdminCredential -ScriptBlock { 
    Import-Module IISAdministration 
    $ServerManager = Get-IISServerManager
    $AppPool = Get-IISAppPool -Name $Using:IISAppPoolName
    $AppPool.Stop()
    $AppPool.ProcessModel.IdentityType = "SpecificUser"
    $AppPool.ProcessModel.Username = $Using:Params.user
    $AppPool.ProcessModel.Password = $Using:Params.newPassword
    $ServerManager.CommitChanges()
    $AppPool.Start()
    return $AppPool
}

Write-Debug "$IISAppPoolName is: $($AppPoolStatus.State)"

最終更新