SQLServer
PowerShell
Firewall

PowerShellでリモート接続出来るようにSQL Serverを設定する

外部マシンからSQL Serverにリモート接続出来るようにスクリプトを書いてみた。

やることは以下。

  1. SQL ServerのTCP/IPを有効にする
  2. SQL Serverのポートをデフォルトの1433にする
  3. DBサーバーのファイアウォールを編集してSQL Serverで使用するポートを開放する

SQL ServerのTCP/IPを有効にする

SQL Server PowerShellモジュールを使ってSQL Serverの設定を編集する。
Alter()を呼び出して、SQL Serverを再起動しないと変更が反映されないので注意。

$dBServerName = "NEW"
$dBInstanceName = "TEST"
$sQLServerServiceName = "SQL Server (TEST)"

Import-Module 'sqlps'
$uri = "ManagedComputer[@Name='{0}']/ ServerInstance[@Name='{1}']/ServerProtocol[@Name='Tcp']" -f $dBServerName, $dBInstanceName
$wmi = New-Object 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer'

# TCP/IPを有効にする
$tcp = $wmi.GetSmoObject($uri)
$tcp.IsEnabled = $true
$tcp.Alter()

# SQL Serverを再起動する
net stop $sQLServerServiceName /y
net start $sQLServerServiceName

SQL Serverのポートをデフォルトの1433にする

「SQL ServerのTCP/IPを有効にする」とほぼ同様。
こちらもAlter()を呼び出して、SQL Serverを再起動しないと変更が反映されないので注意。

$dBServerName = "NEW"
$dBInstanceName = "TEST"
$port = "1433"
$sQLServerServiceName = "SQL Server (TEST)"

Import-Module 'sqlps'
$uri = "ManagedComputer[@Name='{0}']/ ServerInstance[@Name='{1}']/ServerProtocol[@Name='Tcp']" -f $dBServerName, $dBInstanceName
$wmi = New-Object 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer'

# ポートを1433に設定する
$tcp = $wmi.GetSmoObject($uri)
$wmi.GetSmoObject($uri + "/IPAddress[@Name='IPAll']").IPAddressProperties[1].Value = $port
$tcp.Alter()

# SQL Serverを再起動する
net stop $sQLServerServiceName /y
net start $sQLServerServiceName

DBサーバーのファイアウォールを編集してSQL Serverで使用するポートを開放する

New-NetFirewallRuleでファイアウォールにルールを追加するだけ。
ちなみに「`」でコマンドを途中で改行することが出来る。

New-NetFirewallRule `
    -Name "SQLServer(1433)" `
    -DisplayName "SQLServer(1433)" `
    -Description "SQL Serverで使用するポート(1433)を開放する。" `
    -Enabled True `
    -Profile Domain,Private `
    -Direction Inbound `
    -Action Allow `
    -Program Any `
    -LocalAddress Any `
    -RemoteAddress Any `
    -Protocol TCP `
    -LocalPort 1433

まとめ

スクリプト書くのたのしくなってきた。

$dBServerName = "NEW"
$dBInstanceName = "TEST"
$port = "1433"
$sQLServerServiceName = "SQL Server (TEST)"

Import-Module 'sqlps'
$uri = "ManagedComputer[@Name='{0}']/ ServerInstance[@Name='{1}']/ServerProtocol[@Name='Tcp']" -f $dBServerName, $dBInstanceName
$wmi = New-Object 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer'

# TCP/IPを有効にする
$tcp = $wmi.GetSmoObject($uri)
$tcp.IsEnabled = $true
$tcp.Alter()

# ポートを1433に設定する
$wmi.GetSmoObject($uri + "/IPAddress[@Name='IPAll']").IPAddressProperties[1].Value = $port
$tcp.Alter()

# SQL Serverを再起動する
net stop $sQLServerServiceName /y
net start $sQLServerServiceName

# 1433開放!
New-NetFirewallRule `
    -Name "SQLServer(1433)" `
    -DisplayName "SQLServer(1433)" `
    -Description "SQL Serverで使用するポート(1433)を開放する。" `
    -Enabled True `
    -Profile Domain,Private `
    -Direction Inbound `
    -Action Allow `
    -Program Any `
    -LocalAddress Any `
    -RemoteAddress Any `
    -Protocol TCP `
    -LocalPort 1433