web-dev-qa-db-ja.com

コードまたはスクリプト(クエリ)を使用して、SQL Server Expressのすでにインストールされているデータベースへのtcp \ ipリモート接続を有効にします

私は自分のアプリケーションでSQL Expressをデプロイしています。そのデータベースエンジンがリモート接続を受け入れるようにします。 SQL Server構成マネージャーを起動し、tcp/ip接続を有効にし、ポートを指定するなどして、そのマニュアルを構成する方法を知っています。コマンドラインから同じことを行うことができるかどうか疑問に思っています。

または、Visual Studioで「SQL Server 2008 Server Project」を作成する必要があるかもしれません。

編集1

ここに同じ質問を投稿しましたが、すでにインストールされているsql expressのインスタンスで同じことをしたいと思います。 ここの質問を見てください

編集2

同様のことを行うことを主張するこれらのリンクを見つけましたが、それを機能させることはできません。

1) http://support.Microsoft.com/kb/83998

2) http://social.msdn.Microsoft.com/Forums/en-US/sqlexpress/thread/c7d3c3af-2b1e-4273-afe9-0669dcb7bd02/

3) http://www.sql-questions.com/Microsoft/SQL-Server/34211977/can-not-connect-to-sql-2008-express-on-same-lan.aspx

4) http://datazulu.com/blog/post/Enable_sql_server_tcp_via_script.aspx


編集3

Krzysztofが彼の応答で述べたように、私が必要とする(それに加えて、私が知っている必要なもの)

1-TCP/IPを有効にする

enter image description here

パラメーター/TCPENABLED=1を渡すSQLExpressの新しいインスタンスをインストールするときに、これをなんとかすることができました。 この例 のようにsql expressをインストールすると。 SQL Expressのそのインスタンスでは、TCP/IPが有効になります

2-ファイアウォールの適切なポートを開きます

(私はこのマニュアルを作成しましたが、c#でそれを行う方法を理解することができると信じています)これまでのところ、このコンソールコマンドを使用して次のように再生する必要があります。

netsh firewall set portopening protocol = TCP port = 1433 name = SQLPort mode = ENABLE scope = SUBNET profile = CURRENT

3-TCP/IPプロパティを変更してIPアドレスを有効にします

enter image description here

IPを有効にしたり、ポートを変更したりする方法を理解できませんでした。これは解決するのがより複雑なステップになると思います

4-SQLサーバーで混合モード認証を有効にします

enter image description here

パラメータ/SECURITYMODE=SQLを渡してSQL Expressをインストールするときに、これを行うことができました。ステップ1のリンクを参照してください。

SQL Server Expressでは、リモート接続を受け入れるためにこの認証タイプが必要です。

5-ユーザーの変更(sa)デフォルトpassowrd

デフォルトでは、saアカウントにはNULLパスワードがあります。接続を受け入れるには、このユーザーにパスワードが必要です。スクリプトでsaのデフォルトのパスワードを変更しました。

ALTER LOGIN [sa] WITH PASSWORD='*****newPassword****' 

6-最後に

すべての最後のステップが次のように満たされている場合、接続できます。

SQLCMD -U sa -P newPassword -S 192.168.0.120\SQLEXPRESS,1433

コマンドラインでそれを入力することにより:C#の接続文字列は非常に似ています。ユーザーの-U、パスワードの-P、およびデータソースの-Sを置き換える必要があります。正確な名前は思い出せません。

38
Tono Nam

SQL Server 2008 R2 Express を使用して以下のコードをテストしましたが、説明した6つのステップすべてに解決策があるはずです。それらを1つずつ取り上げましょう。

1-TCP/IPを有効にします

[〜#〜] wmi [〜#〜] でTCP/IPプロトコルを有効にできます。

set wmiComputer = GetObject( _
    "winmgmts:" _
    & "\\.\root\Microsoft\SqlServer\ComputerManagement10")
set tcpProtocols = wmiComputer.ExecQuery( _
    "select * from ServerNetworkProtocol " _
    & "where InstanceName = 'SQLEXPRESS' and ProtocolName = 'Tcp'")

if tcpProtocols.Count = 1 then
    ' set tcpProtocol = tcpProtocols(0)
    ' I wish this worked, but unfortunately 
    ' there's no int-indexed Item property in this type

    ' Doing this instead
    for each tcpProtocol in tcpProtocols
        dim setEnableResult
            setEnableResult = tcpProtocol.SetEnable()
            if setEnableResult <> 0 then 
                Wscript.Echo "Failed!"
            end if
    next
end if

2-ファイアウォールで適切なポートを開く

あなたのソリューションはうまくいくと思います。正しいポートを指定してください。 1433とは異なるポートを選択し、SQL Server Expressがリッスンする静的ポートにすることをお勧めします。この投稿では3456を使用しますが、実際の実装では別の番号を選択してください(3456を使用する多くのアプリケーションがすぐに表示されると思います:-)

3-TCP/IPプロパティを変更してIPアドレスを有効にする

WMIを再び使用できます。静的ポート3456を使用しているため、IPAllセクションの2つのプロパティを更新するだけです。動的ポートを無効にし、リスニングポートを3456に設定します。

set wmiComputer = GetObject( _
    "winmgmts:" _
    & "\\.\root\Microsoft\SqlServer\ComputerManagement10")
set tcpProperties = wmiComputer.ExecQuery( _
    "select * from ServerNetworkProtocolProperty " _
    & "where InstanceName='SQLEXPRESS' and " _
    & "ProtocolName='Tcp' and IPAddressName='IPAll'")

for each tcpProperty in tcpProperties
    dim setValueResult, requestedValue

    if tcpProperty.PropertyName = "TcpPort" then
        requestedValue = "3456"
    elseif tcpProperty.PropertyName ="TcpDynamicPorts" then
        requestedValue = ""
    end if

    setValueResult = tcpProperty.SetStringValue(requestedValue)
    if setValueResult = 0 then 
        Wscript.Echo "" & tcpProperty.PropertyName & " set."
    else
        Wscript.Echo "" & tcpProperty.PropertyName & " failed!"
    end if
next

個々のアドレスを有効にする必要はありませんでしたが、必要に応じてこのスクリプトを簡単に拡張できるようにする必要があります。

WMIを使用する場合、 WBEMTest.exe があなたの親友であることを思い出してください!

4-SQLサーバーで混合モード認証を有効にする

WMIを再び使用できればいいのですが、残念ながらこの設定はWMIを通じて公開されていません。他の2つのオプションがあります。

  1. here で説明されているように、Microsoft.SqlServer.Management.Smo.ServerクラスのLoginModeプロパティを使用します。

  2. この投稿 で説明されているように、SQL ServerレジストリでLoginMode値を使用します。デフォルトでは、SQL Server Expressインスタンスの名前はSQLEXPRESSであるため、SQL Server 2008 R2 Expressインスタンスの場合、正しいレジストリキーはHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQLServerでした。

5-ユーザー(sa)のデフォルトパスワードの変更

これをカバーしました。

6-最後に(インスタンスに接続します)

SQL Server Expressインスタンスに割り当てられた静的ポートを使用しているため、サーバーアドレスでインスタンス名を使用する必要がなくなりました。

SQLCMD -U sa -P newPassword -S 192.168.0.120,3456

これがうまくいくかどうか教えてください(指が交差した!)。

35

SMOを使用することをお勧めします( SQL ServerのTCP/IPネットワークプロトコルを有効にする )。しかし、私の場合は利用できませんでした。

Krzysztof KozielczykからPowerShellにWMIコマンドを書き直しました。

# Enable TCP/IP

Get-CimInstance -Namespace root/Microsoft/SqlServer/ComputerManagement10 -ClassName ServerNetworkProtocol -Filter "InstanceName = 'SQLEXPRESS' and ProtocolName = 'Tcp'" |
Invoke-CimMethod -Name SetEnable

# Open the right ports in the firewall
New-NetFirewallRule -DisplayName 'MSSQL$SQLEXPRESS' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1433

# Modify TCP/IP properties to enable an IP address

$properties = Get-CimInstance -Namespace root/Microsoft/SqlServer/ComputerManagement10 -ClassName ServerNetworkProtocolProperty -Filter "InstanceName='SQLEXPRESS' and ProtocolName = 'Tcp' and IPAddressName='IPAll'"
$properties | ? { $_.PropertyName -eq 'TcpPort' } | Invoke-CimMethod -Name SetStringValue -Arguments @{ StrValue = '1433' }
$properties | ? { $_.PropertyName -eq 'TcpPortDynamic' } | Invoke-CimMethod -Name SetStringValue -Arguments @{ StrValue = '' }

# Restart SQL Server

Restart-Service 'MSSQL$SQLEXPRESS'
1
Der_Meister