41

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

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

編集1

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

編集2

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

1) http://support.microsoft.com/kb/839980

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 を有効にする

ここに画像の説明を入力

パラメータを渡すSQLExpressの新しいインスタンスをインストールするときに、これを行うことができました /TCPENABLED=1この例のように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 アドレスを有効にする

ここに画像の説明を入力

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

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

ここに画像の説明を入力

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

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

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

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

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

6 - 最後に

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

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

コマンド ラインにそれを入力します。C# の接続文字列は非常に似ています。-U を user 、 -P を password 、 -S を data source に置き換える必要があります。正確な名前は覚えていません。

4

2 に答える 2

36

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 Server で混合モード認証を有効にする

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

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

  2. この投稿で説明されているように、SQL Server レジストリで LoginMode 値を使用します。デフォルトでは、SQL Server Express インスタンスの名前SQLEXPRESSHKEY_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

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

于 2012-02-08T22:30:40.117 に答える