リモートSQL Serverの再起動

# 以下のように実行されます
# ECHO "BASE64STRING==" | .\script.ps1; Clear-History

# 注1: サーバーの停止と再起動にnetコマンドを使用しないでください
# net stop MSSQLSERVER && net start MSSQLSERVER
# sc stop MSSQLSERVER && sc start MSSQLSERVER
# これらのコマンドによって、SQL ServerエージェントサービスとSQL Server Browserサービス
# の依存関係は自動的には開始されません
# 
# 注2: PowerShellのRestart-Serviceコマンドレットはすべての依存関係を処理できますが、Windowsでしか動作しません
# powershell -command "Restart-Service MSSQLSERVER -Force"
# MSSQLSERVERの起動後-コマンドレットが、以前に停止したすべての依存関係を開始します。

# Linuxの場合SQL Serverにはsystemdユニットファイルが付属しており、systemctlを使用して制御できます。
# sudo systemctl restart mssql-server
# sudo systemctl status mssql-server

# 注3: コマンドを管理者として実行していることを確認します
# 必要に応じて、すべてのSQL Server名前付きインスタンスを再起動してください
# クラスタで実行している場合、SQL Serverデータベースエンジンサービスは
# Cluster Administratorを使用して管理するのが最適です

begin {}
process {
    # エラーの場合は停止します。これを設定しない場合、結果値はTrueとなり
    # 問題がないと見なされます。
    $ErrorActionPreference = "Stop"

    # パイプラインオブジェクトごとに1回実行    
    $JSON = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($_))
    $Params=($JSON | ConvertFrom-Json)

    Write-Output "providerRecordUid=$($Params.providerRecordUid)"
    Write-Output "resourceRecordUid=$($Params.resourceRecordUid)"
    Write-Output "userRecordUid=$($Params.userRecordUid)"
    Write-Output "newPassword=$($Params.newPassword)"
    Write-Output "oldPassword=$($Params.oldPassword)"
    Write-Output "user=$($Params.user)"

    # 再起動されるSQL Serverインスタンス (リスト順)
    [string[]]$Instances = 'MSSQLSERVER', 'MSSQL$instance1', 'MSSQL$instance2'

    # リモートマシンでサービスを再起動
    # リモートコンピュータに接続するには、リモートコンピュータのAdministratorsグループのメンバーである必要があります
    # ローカルコンピュータで対話型セッションを開始するには
    # 管理者として実行オプションを使用して、PowerShellを起動する必要があります。

    # 注意: 新しいバージョンのPowerShellでは、*-Serviceコマンドレットから「-ComputerName」が削除されました
    # 例. Get-Service MSSQLSERVER -ComputerName MyServer | Restart-Service - 動作しなくなりました
    # 注意: Enter-PSSessionはスクリプトで使用しないでください (localhostでスクリプトを実行します)

    # PSCredentialパラメータを準備します
    [string]$userName = 'MyUserName'
    [string]$userPass = 'MySuperSecureToken'
    [securestring]$secStringPass = ConvertTo-SecureString $userPass -AsPlainText -Force
    [pscredential]$credObject = New-Object System.Management.Automation.PSCredential ($userName, $secStringPass)

    [string]$hostname = 'Server01'
    foreach ($Instance in $Instances) {
        Invoke-Command -ComputerName $hostname -Credential $credObject -ScriptBlock { Restart-Service -Name $Using:Instance -Force }
    }
}
end {}

最終更新