WinRPCを介したバッチ例

パイプ入力の解析

前述のように、ユーザー名と新しいパスワード (およびその他のデータ) を含むBASE64文字列がスクリプトにパイプされ、Windowsスケジュールタスクの認証情報をローテーションするために使用されます。

以下のコード例を使用すると、パイプされた入力を取得し、certutilを使用してBASE64文字列をデコードできます。certutilは入力としてファイルのみを受け入れるため、batスクリプトの慣例に従い、これらは一時ファイルに保存され、後で消去されます。

@echo off
for /f "tokens=*" %%a in ('more') do set input=%%a

set base64tmp=%temp%\base64.tmp
set json=%temp%\json.tmp

echo %input% > %base64tmp%
certutil -decode %base64tmp% %json%

結果として生成されるJSONファイルでjqを使用すると、userおよびnewPasswordの値を取得できます。

for /f "usebackq delims=" %%a in (`jq -r .user %json%`) do set "user=%%a"
for /f "usebackq delims=" %%a in (`jq -r .newPassword %json%`) do set "newPassword=%%a"

管理者認証情報を使用

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

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

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

jqを使用して添付されたリソース認証情報にアクセスし、記録UIDでフィルタリングできます。

set adminrecord=%temp%\adminrecord.tmp
set adminuid=<Admin UID>
jq -r ".[] | select(.uid == \"%adminuid%\")" %recordsjson% > %adminrecord%

@REM pull the login, domainName, and password from the %adminrecord% JSON object
for /f "usebackq delims=" %%a in (`jq -r .login %adminrecord%`) do set "adminuser=%%a"
for /f "usebackq delims=" %%a in (`jq -r .domainName %adminrecord%`) do set "domainname=%%a"
for /f "usebackq delims=" %%a in (`jq -r .password %adminrecord%`) do set "adminpassword=%%a"

@REM Create the admin usermain by combining the username@domainname
set adminusername=%adminuser%@%domainname%

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

schtasksコマンドで、抽出した値を使用して目的のスケジュールタスクを更新します。新しい認証情報に加えて、上記の管理者認証情報も必要となります。

schtasks /change /tn "<Task Name>" /s "<Target Server>" /u %adminusername% /p %adminpassword /ru %user% /rp %newPassword%

完全な例

@echo off
for /f "tokens=*" %%a in ('more') do set input=%%a

set base64tmp=%temp%\base64.tmp
set json=%temp%\json.tmp
set recordsb64=%temp%\recordsb64.tmp
set recordsjson=%temp%\records.tmp

echo %input% > %base64tmp%
certutil -decode %base64tmp% %json%

for /f "usebackq delims=" %%a in (`jq -r .user %json%`) do set "user=%%a"
for /f "usebackq delims=" %%a in (`jq -r .newPassword %json%`) do set "newPassword=%%a"
for /f "usebackq delims=" %%a in (`jq -r .records %json%`) do set "records=%%a"

echo %records% > %recordsb64%
certutil -decode %recordsb64% %recordsjson%

@REM Find the admin record that has a uid that matches %adminuid% and save to %adminrecord%
set adminrecord=%temp%\adminrecord.tmp
set adminuid=<Admin UID>
jq -r ".[] | select(.uid == \"%adminuid%\")" %recordsjson% > %adminrecord%

@REM pull the login, domainName, and password from the %adminrecord% JSON object
for /f "usebackq delims=" %%a in (`jq -r .login %adminrecord%`) do set "adminuser=%%a"
for /f "usebackq delims=" %%a in (`jq -r .domainName %adminrecord%`) do set "domainname=%%a"
for /f "usebackq delims=" %%a in (`jq -r .password %adminrecord%`) do set "adminpassword=%%a"

@REM Create the admin usermain by combining the username@domainname
set adminusername=%adminuser%@%domainname%

del %base64tmp%
del %json%
del %recordsb64%
del %recordsjson%
del %adminrecord%

@REM Update the scheduled task with the new password
schtasks /change /tn "<Task Name>" /s "<Taget Server>" /u %adminusername% /p %adminpassword% /ru %user% /rp %newPassword%
if %errorlevel% neq 0 exit /b %errorlevel%

最終更新