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本体も起動する。