Włączanie zdalnych połączeń tcpip do już zainstalowanej bazy danych SQL server express za pomocą kodu lub skryptu (zapytanie)

Wdrażam SQL express z moją aplikacją. Chciałbym, aby ten silnik bazy danych akceptował połączenia zdalne. Wiem jak skonfigurować tą instrukcję poprzez uruchomienie SQL server configuration manager, włączenie połączeń tcp / ip, określenie portów itp.. Zastanawiam się, czy będzie można zrobić to samo z linii poleceń.

A może będę musiał stworzyć "SQL Server 2008 Server Project" w visual studio.

Edycja 1

Zamieściłem to samo pytanie tutaj, ale chciałbym zrobić to samo na instancji SQL express, który jest już zainstalowany. spójrz na pytanie tutaj

Edycja 2

Znalazłem te linki, które twierdzą, że robią coś podobnego i nadal nie mogę tego zrobić.

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


Edycja 3

Jak stwierdził Krzysztof w odpowiedzi potrzebuję (plus inne rzeczy, które Wiem, że są wymagane)

1 - enable TCP / IP

Tutaj wpisz opis obrazka

Udało mi się to zrobić podczas instalacji nowej instancji SQLEXPRESS parametr /TCPENABLED=1. Kiedy instaluję SQL express jak w ten przykład. ta instancja SQL express będzie miała włączony TCP / IP

2 - Otwórz odpowiednie porty w firewallu

(zrobiłem to ręcznie, ale wierzę, że będę w stanie wymyślić, jak to zrobić z c#) Na razie muszę grać w arouda z tą konsolową komendą:

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

3 - Modify TCP / IP properties enable a IP address

Tutaj wpisz opis obrazka

Nie byłem w stanie zrozumieć jak włączyć IP, zmienić port itp.. myślę, że będzie to krok bardziej skomplikowany do rozwiązania

4 - Włącz uwierzytelnianie w trybie mieszanym w sql server

Tutaj wpisz opis obrazka

Udało mi się to zrobić podczas instalacji SQL Express przekazując parametr /SECURITYMODE=SQL patrz link Krok 1.

SQL Server express wymaga tego typu uwierzytelniania, aby akceptować połączenia zdalne.

5 - Zmień domyślne hasło użytkownika (sa)

Domyślnie konto sa ma NULL passowrd. Aby akceptować połączenia, użytkownik musi posiadać hasło. Zmieniłem domyślne hasło sa przy pomocy skryptu:

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

6 - wreszcie

Będzie w stanie połączyć się, jeśli wszystkie ostatnie kroki zostaną spełnione jako:

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

Wpisując to w wierszu poleceń: łańcuch połączeń w C# będzie bardzo podobny. Będę musiał zastąpić -U dla użytkownika ,- P dla hasła i-S dla źródła danych. Nie pamiętam dokładnych nazwisk.

Author: Community, 2012-02-04

2 answers

Przetestowałem poniższy kod z SQL Server 2008 R2 Express i uważam, że powinniśmy mieć rozwiązanie dla wszystkich 6 kroków, które opisałeś. Zajmijmy się nimi jeden po drugim:

1-Enable TCP / IP

Możemy włączyć protokół TCP / IP za pomocą 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-Otwórz odpowiednie porty w firewallu

Wierzę, że Twoje rozwiązanie zadziała, po prostu upewnij się, że podałeś odpowiedni port. Proponuję wybrać inny port niż 1433 i zrobić z niego statyczny port SQL Server Express będzie nas słuchał. W tym poście będę używał 3456, ale proszę wybrać inny numer w prawdziwej implementacji (czuję, że wkrótce zobaczymy wiele aplikacji korzystających z 3456 :-)

3-Modify TCP / IP properties enable a IP address

Możemy ponownie użyć WMI. Ponieważ używamy portu statycznego 3456, wystarczy zaktualizować dwie właściwości w sekcji IPAll : wyłączyć porty dynamiczne i ustawić port nasłuchu na 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

Zauważ, że nie miałem aby włączyć dowolny z poszczególnych adresów, aby to działało, ale jeśli jest to wymagane w Twoim przypadku, powinieneś być w stanie łatwo rozszerzyć ten skrypt, aby to zrobić.

Przypomnę tylko, że podczas pracy z WMI, WBEMTest.exe jest twoim najlepszym przyjacielem!

4-Włącz uwierzytelnianie w trybie mieszanym w sql server

Chciałbym ponownie użyć WMI, ale niestety to ustawienie nie jest narażone przez WMI. Istnieją dwie inne opcje:

  1. Use LoginMode property of Microsoft.SqlServer.Management.Smo.Server Klasa, zgodnie z opisem tutaj .

  2. Użyj wartości LoginMode w rejestrze SQL Server, jak opisano w ten post . Zauważ, że domyślnie instancja SQL Server Express ma nazwę SQLEXPRESS, więc dla mojej instancji SQL Server 2008 R2 Express właściwy klucz rejestru był HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQLServer.

5-Zmień domyślne hasło użytkownika (sa)

Masz to pod kontrolą.

6-Finally (connect to the instance)

Ponieważ używamy portu statycznego przypisany do naszej instancji SQL Server Express, nie ma już potrzeby używania nazwy instancji w adresie serwera.

SQLCMD -U sa -P newPassword -S 192.168.0.120,3456

Proszę dać mi znać, jeśli to działa dla Ciebie (trzymam kciuki!).

 34
Author: Krzysztof Kozielczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:32

Zalecam użycie SMO (Enable TCP / IP Network Protocol for SQL Server ). Jednak w moim przypadku nie było ono dostępne.

Przepisałem komendy WMI od Krzysztofa Kozielczyka do 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'
 0
Author: Der_Meister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-20 07:26:08