リモートのSQLServerをManagement Studioから再起動させるにはWMIの構成が必要

Management StudioでリモートのSQLServerを再起動できなかった。
"sa"アカウントで接続してもメニューにある"再起動"がグレーアウトしていて選択できない。
SQLServerのあるローカルから"sa"で接続すると再起動できる。

f:id:azechi_n:20160917101731j:plain

クライアント側のイベントログにエラーも出てる

DistributedCOM

構成されているどのプロトコルを使っても、DCOM がコンピューター [リモートのコンピューター名] と通信できませんでした。要求元 PID 25f8 (C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio\Ssms.exe)。

SQLServerの再起動はWMIという仕組みで使える機能だそうで、SQLServerとの接続とは別の仕組みでリモートのWindowsと通信する必要があるみたい。SQLServerの状態アイコンも同じ。

SQL Server ツールでサーバーの状態を表示できるようにする WMI の構成

ManagementStudioでは起動したwindowsアカウントで接続をするのかな だとしたら、ワークグループ環境では接続先にも同じ名前とパスワードのアカウントを作って...ってやる必要があるかも あとファイアウォールの設定とかも必要か。

いま扱ってるのはAWS EC2だからRunCommandでやることにする。

SQLServerのネットワーク構成をコマンドラインから変更した

AWS EC2でSQLServerインスタンスを作ったときにExpressエディションではリモートからアクセスできなかった。 Webエディションではできたのに。

エディションによって、ネットワーク構成の既定値が違うらしい。Expressエディションでは、TCP/IPが無効になっている。
SQL Server の既定のネットワーク構成

GUIの構成マネージャーから有効にすればOK。 でもコマンドラインからしたい。

SQLServer管理オブジェクト(SMO)が用意されているのでこれを使えばいいらしい。 SMOは.NET Framework アセンブリなのでPowerShellから使える。

サーバー ネットワーク プロトコルを有効または無効にする方法 (SQL Server PowerShell)
SQL Server 管理オブジェクト (SMO) プログラミング ガイド SQL Server PowerShell

#TCP/IPでの接続を有効にする(SQLServerの再起動が必要)
Set-ExecutionPolicy -Scope Process RemoteSigned -Force
Impoert-Module 'sqlps'
$wmi = New-Object 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer'
$tcp = $wmi.GetSmoObject("ManagedComputer[@Name='computerName']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']")
$tcp.IsEnabled = $true
$tcp.Alter()

今回は必要なSMOアセンブリだけを読み込めば十分なんだけど、sqlpsモジュールをインポートしとけばロードされるアセンブリに必要なものが含まれてるから便利。 初期値がListenAll=yesになっているので、IsEnable=trueにすれば全部のIPアドレスが有効になる。
ServerProtocol クラス (Microsoft.SqlServer.Management.Smo.Wmi)

::SQLServerを再起動する
net stop MSSQLSERVER /y
net start SQLSERVERAGENT

停止するときは、/yオプションでエージェントも停止させる。 エージェントを起動するとSQLServer本体も起動する。