启用tcp \ ip远程连接到sql server express已经安装了数据库的代码或脚本(查询)

我用我的应用程序部署sql express。 我会喜欢那个数据库引擎来接受远程连接。 我知道如何通过启动SQL服务器configurationpipe理器,启用TCP / IP连接,指定端口等来configuration该手册。我想知道是否有可能从命令行做同样的事情。

或者,也许我将不得不在Visual Studio中创build一个“SQL Server 2008服务器项目”。

编辑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

在这里输入图像描述

在安装一个传递参数/TCPENABLED=1的SQLExpress的新实例时,我设法做到了这一点。 当我像本例中一样安装sql express时。 sql express的实例将启用TCP / IP

2 – 在防火墙中打开正确的端口

(我已经做了这个manualy,但我相信我将能够弄清楚如何用c#做到这一点)到目前为止,我必须玩这个控制台命令:

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

3 – 修改TCP / IP属性启用一个IP地址

在这里输入图像描述

我一直无法知道如何启用IP,更改端口等。 我认为这将是更复杂的解决scheme

4 – 在SQL Server中启用混合模式身份validation

在这里输入图像描述

我已经设法在安装SQL Express时通过参数/SECURITYMODE=SQL参考第1步的链接。

SQL Server Express需要此身份validationtypes来接受远程连接。

5 – 更改用户(sa)默认密码

默认情况下,sa帐户具有NULL passowrd。 为了接受连接,这个用户必须有一个密码。 我用脚本改变了sa的默认密码:

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

6 – 最后

如果所有最后的步骤都满足,将能够connecto:

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

通过在命令行中键入:C#中的连接string将非常相似。 我将不得不将-Ureplace为用户,-Preplace为密码,-Sreplace为数据源。 我不记得确切的名字。

我使用SQL Server 2008 R2 Expresstesting了代码,我相信我们应该为您列出的所有6个步骤提供解决scheme。 让我们一个接一个:

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 – 在防火墙中打开正确的端口

我相信你的解决scheme将工作,只要确保你指定正确的端口。 我build议我们select不同于1433的端口,并将其设置为SQL Server Express将侦听的静态端口。 我将在这篇文章中使用3456,但是请在实际的实现中select一个不同的编号(我觉得很快就会看到很多使用3456的应用程序:-)

3 – 修改TCP / IP属性启用一个IP地址

我们可以再次使用WMI。 由于我们使用的是静态端口3456,我们只需要更新IPAll部分的两个属性:禁用dynamic端口并将监听端口设置为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中启用混合模式身份validation

我希望我们可以再次使用WMI,但不幸的是,这个设置并没有通过WMI公开。 还有两个选项:

  1. 使用Microsoft.SqlServer.Management.Smo.Server类的LoginMode属性,如此处所述。

  2. 如本文所述,使用SQL Serverregistry中的LoginMode值。 请注意,默认情况下,SQL Server Express实例名为SQLEXPRESS ,因此对于我的SQL Server 2008 R2 Express实例,正确的registry键是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 

请让我知道这是否适用于你(手指交叉!)。

我build议使用SMO( 为SQL Server启用TCP / IPnetworking协议 )。 然而,这不是我的情况。

我重写了从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'