Ответ 1
Я тестировал ниже код с 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 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
Обратите внимание, что мне не нужно было активировать какой-либо отдельный адрес, чтобы он работал, но если это необходимо в вашем случае, вы можете легко расширить этот script, чтобы сделать это.
Напоминаем, что при работе с WMI WBEMTest.exe является вашим лучшим другом!
4 - Включить аутентификацию смешанного режима на сервере sql
Я бы хотел, чтобы мы снова могли использовать WMI, но, к сожалению, этот параметр не отображается через WMI. Есть еще два варианта:
-
Используйте свойство
LoginMode
классаMicrosoft.SqlServer.Management.Smo.Server
, как описано здесь. -
Используйте значение 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
Пожалуйста, дайте мне знать, если это работает для вас (пальцы скрещены!).