41

我正在使用我的应用程序部署 sql express。我希望该数据库引擎接受远程连接。我知道如何通过启动 sql server 配置管理器、启用 tcp/ip 连接、指定端口等来配置该手册。我想知道是否可以从命令行执行相同的操作。

或者,也许我将不得不在 Visual Studio 中创建一个“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

在此处输入图像描述

在安装传递参数的新 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 中启用混合模式身份验证

在此处输入图像描述

在安装 SQL Express 并传递参数时,我已经设法做到了这一点,/SECURITYMODE=SQL请参阅步骤 1 的链接。

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 替换为密码, -S 替换为数据源。我不记得确切的名字。

4

2 回答 2

36

我使用SQL Server 2008 R2 Express测试了以下代码,我相信我们应该为您列出的所有 6 个步骤提供解决方案。让我们一个接一个地讨论它们:

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部分中的两个属性:禁用动态端口并将侦听端口设置为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 公开。还有另外两个选项:

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

  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

请让我知道这是否适合您(祈祷!)。

于 2012-02-08T22:30:40.117 回答
2

我建议使用 SMO(为 SQL Server 启用 TCP/IP 网络协议)。但是,在我的情况下它不可用。

我将 WMI 命令从 Krzysztof Kozielczyk 重写为 PowerShell。

# 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'
于 2017-05-20T07:26:08.983 回答