Abilita connessioni remote tcp \ ip al database sql express del server già installato con codice o script (query)

Sto distribuendo sql express con la mia applicazione. Mi piacerebbe che quel motore di database accettasse le connessioni remote. So come configurare quel manuale avviando il gestore di configurazione del server sql, abilitando le connessioni tcp / ip, specificando le porte ecc. Mi chiedo se sarà ansible fare la stessa cosa dalla riga di comando.

O forse dovrò creare un “Progetto Server SQL Server 2008” in Visual Studio.

MODIFICA 1

Ho postato la stessa domanda qui, ma mi piacerebbe fare la stessa cosa su un’istanza di SQL Express già installata. Dai un’occhiata alla domanda qui

MODIFICA 2

Ho trovato questi collegamenti che pretendono di fare qualcosa di simile e non riesco ancora a farlo funzionare.

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


MODIFICA 3

Come Krzysztof ha dichiarato nella sua risposta di cui ho bisogno (più altre cose che so che sono richieste)

1 – abilita TCP / IP

inserisci la descrizione dell'immagine qui

Sono riuscito a farlo quando ho installato una nuova istanza di SQLExpress passando il parametro /TCPENABLED=1 . Quando installo sql express come in questo esempio . quell’istanza di sql express avrà abilitato TCP / IP

2 – Apri le porte giuste nel firewall

(Ho fatto questo manuale ma credo di essere in grado di capire come farlo con c #) Finora devo giocare con questo comando della console:

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

3 – Modifica proprietà TCP / IP abilita un indirizzo IP

inserisci la descrizione dell'immagine qui

Non sono stato in grado di capire come abilitare un IP, cambiare una porta, ecc. Penso che questo sarà il passo più complicato da risolvere

4 – Abilita l’autenticazione in modalità mista in SQL Server

inserisci la descrizione dell'immagine qui

Sono riuscito a farlo quando si installa SQL Express passando il parametro /SECURITYMODE=SQL riferisce al collegamento del passaggio 1.

SQL Server Express richiede questo tipo di autenticazione per accettare connessioni remote.

5 – Cambia utente (sa) passowrd predefinito

Di default, l’account sa ha un passaporto NULL. Per accettare le connessioni questo utente deve avere una password. Ho modificato il passowrd predefinito di sa con lo script:

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

6 – finalmente

sarà in grado di connettere se tutti gli ultimi passi sono soddisfatti come:

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

digitandolo nella riga di comando: la stringa di connessione in C # sarà molto simile. Dovrò sostituire -U per utente, -P per password e -S per origine dati. Non ricordo i nomi esatti.

Ho testato sotto il codice con SQL Server 2008 R2 Express e credo che dovremmo avere una soluzione per tutti e 6 i passaggi che hai delineato. Prendiamoli uno per uno:

1 – Abilita TCP / IP

Possiamo abilitare il protocollo TCP / IP con 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 – Apri le porte giuste nel firewall

Credo che la tua soluzione funzionerà, assicurati solo di specificare la porta giusta. Suggerisco di scegliere una porta diversa da 1433 e renderla una porta statica su cui SQL Server Express sarà in ascolto. Userò 3456 in questo post, ma per favore scegli un numero diverso nella reale implementazione (credo che vedremo presto molte applicazioni usando 3456 🙂

3 – Modifica proprietà TCP / IP abilita un indirizzo IP

Possiamo usare di nuovo WMI. Dato che stiamo usando la porta statica 3456, abbiamo solo bisogno di aggiornare due proprietà nella sezione IPAll : disabilitare le porte dinamiche e impostare la porta di ascolto su 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 

Nota che non ho dovuto abilitare nessuno dei singoli indirizzi per farlo funzionare, ma se è necessario nel tuo caso, dovresti essere in grado di estendere facilmente questo script per farlo.

Solo un promemoria che quando si lavora con WMI, WBEMTest.exe è il tuo migliore amico!

4 – Abilita l’autenticazione in modalità mista in SQL Server

Vorrei poter usare nuovamente WMI, ma sfortunatamente questa impostazione non è esposta tramite WMI. Ci sono altre due opzioni:

  1. Utilizzare la proprietà LoginMode della class Microsoft.SqlServer.Management.Smo.Server , come descritto qui .

  2. Utilizzare il valore LoginMode nel registro di SQL Server, come descritto in questo post . Si noti che per impostazione predefinita l’istanza di SQL Server Express è denominata SQLEXPRESS , quindi per l’istanza di SQL Server 2008 R2 Express la chiave di registro corretta era HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQLServer .

5 – Cambia password utente (sa) predefinita

Hai questo coperto.

6 – Infine (connettiti all’istanza)

Poiché utilizziamo una porta statica assegnata all’istanza di SQL Server Express, non è più necessario utilizzare il nome dell’istanza nell’indirizzo del server.

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

Per favore fatemi sapere se questo funziona per voi (dita incrociate!).

Raccomando di usare SMO ( abilita il protocollo di rete TCP / IP per SQL Server ). Tuttavia, non era disponibile nel mio caso.

Ho riscritto i comandi WMI da Krzysztof Kozielczyk a 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'