Включить tcp \ ip для удаленных подключений к уже установленной базе данных sql server express с кодом или скриптом (запрос) - PullRequest
38 голосов
/ 04 февраля 2012

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

Или, возможно, мне придется создать «SQL Server 2008 Server Project» в 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 / невозможно подключиться к 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) по умолчанию

По умолчанию учетная запись 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 для источника данных. Я не помню точных имен.

Ответы [ 2 ]

35 голосов
/ 09 февраля 2012

Я тестировал приведенный ниже код с 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

Я хотел бы снова использовать 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

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

1 голос
/ 20 мая 2017

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

Я переписал команды WMI из Кшиштофа Козельчика в 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...