Включение удаленных подключений tcpip к уже установленной базе данных sql server express с кодом или сценарием (запрос)

Я развертываю sql express с моим приложением. Я хотел бы, чтобы этот компонент database engine принимал удаленные подключения. Я знаю, как настроить это руководство, запустив диспетчер конфигурации sql server, включив tcp/ip-соединения, указав порты и т. д.. Мне интересно, можно ли будет сделать то же самое из командной строки.

или, возможно, мне придется создать "проект сервера SQL Server 2008" в visual studio.

изменить 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

как заявил Кшиштоф в своем ответе, мне нужно (плюс другие вещи, которые я знайте, что требуются)

1-включить TCP / IP

enter image description here

мне удалось сделать это при установке нового экземпляра 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-адрес

enter image description here

Я не смог понять, как включить IP, изменить порт и т. д.. я думаю, что это будет шаг более сложным для решения

4-включить проверку подлинности в смешанном режиме в sql сервер

enter image description here

мне удалось сделать это при установке SQL Express, передавая параметр /SECURITYMODE=SQL перейдите к шагу 1 по ссылке.

SQL Server express требует, чтобы этот тип проверки подлинности принимал удаленные подключения.

5-изменить пользователя (sa) по умолчанию passowrd

по умолчанию учетная запись sa имеет значение null passowrd. Для того, чтобы принимать соединения, этот пользователь должен иметь пароль. Я изменил значение по умолчанию passowrd из sa со скриптом:

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

6 - наконец-то

сможет подключиться, если все последние шаги будут satisied как:

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

, введя в командной строке: строка подключения в C# будет очень похож. Мне придется заменить -U для пользователя,- P для пароля и-S для источника данных. Я не помню точных имен.

2 ответов


Я тестировал ниже код SQL Server 2008 R2 Express и я считаю, что мы должны иметь решение для всех 6 шагов, которые вы наметили. Давайте возьмемся за них один за другим:

1-Включить TCP / IP

мы можем включить протокол TCP/IP с WMI:

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. используйте значение LoginMode в реестре SQL Server, как описано в этот пост. Обратите внимание, что по умолчанию экземпляр 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

пожалуйста, дайте мне знать, если это работает для вас (пальцы скрещенными!).


Я рекомендую использовать SMO (включить сетевой протокол TCP/IP для SQL Server). Однако в моем случае его не было.

я переписал команды 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'