web-dev-qa-db-fra.com

Activer les connexions distantes tcp\ip au serveur SQL Server avec base de données déjà installée avec code ou script (requête)

Je déploie SQL Express avec mon application. J'aimerai que ce moteur de base de données accepte les connexions distantes. Je sais comment configurer ce manuel en lançant le gestionnaire de configuration du serveur SQL, en activant les connexions TCP/IP, en spécifiant les ports, etc. Je me demande s’il sera possible de faire la même chose à partir de la ligne de commande. 

Ou peut-être devrais-je créer un "projet serveur SQL Server 2008" dans Visual Studio. 

EDIT 1

J'ai posté la même question ici mais j'aimerai faire la même chose sur une instance de SQL Express déjà installée. Jetez un coup d'œil à la question ici

EDIT 2

J'ai trouvé ces liens qui prétendent faire quelque chose de similaire et je ne peux toujours pas le faire fonctionner.

1) http://support.Microsoft.com/kb/839980

2) http://social.msdn.Microsoft.com/Forums/fr-s/lexpress/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


EDIT 3

Comme Krzysztof l’a déclaré dans sa réponse, j’ai besoin (et d’autres choses que je sais qui sont nécessaires)

1 - activer TCP/IP

enter image description here

J'ai réussi à faire cela lors de l'installation d'une nouvelle instance de SQLExpress en passant le paramètre /TCPENABLED=1. Quand j'installe sql express comme dans cet exemple . Cette instance de SQL Express aura TCP/IP activé

2 - Ouvrez les ports de droite dans le pare-feu} _

(Je l'ai fait manuellement, mais je pense pouvoir comprendre comment le faire avec c #) .__

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

3 - Les propriétés de modification TCP/IP activent une adresse IP}

enter image description here

Je n'ai pas été capable de comprendre comment activer une adresse IP, changer un port, etc. _ Je pense que ce sera l'étape la plus compliquée à résoudre

4 - Activer l'authentification en mode mixte sur le serveur SQL} _

enter image description here

J'ai réussi à le faire lors de l'installation de SQL Express en transmettant le paramètre /SECURITYMODE=SQL (reportez-vous au lien de l'étape 1). 

SQL Server Express requiert ce type d'authentification pour accepter les connexions à distance.

5 - Modifier le mot de passe utilisateur par défaut (sa)

Par défaut, le compte sa a un mot de passe NULL. Pour accepter les connexions, cet utilisateur doit avoir un mot de passe. J'ai changé le mot de passe par défaut de la sa avec le script:

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

_ {6 - enfin} _

pourra se connecter si toutes les dernières étapes sont satisfaites comme suit:

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

en tapant cela dans la ligne de commande: la chaîne de connexion en C # sera très similaire. Je devrai remplacer -U pour utilisateur, -P pour mot de passe et -S pour source de données. Je ne me rappelle pas les noms exacts.

37
Tono Nam

J'ai testé le code ci-dessous avec SQL Server 2008 R2 Express et je pense que nous devrions avoir une solution pour les 6 étapes que vous avez décrites. Prenons-les un par un:

1 - Activer TCP/IP

Nous pouvons activer le protocole TCP/IP avec 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 - Ouvrez les bons ports dans le pare-feu

Je crois que votre solution fonctionnera, assurez-vous de spécifier le bon port. Je suggère que nous choisissions un port différent de 1433 et en faisons un port statique sur lequel SQL Server Express écoutera. Je vais utiliser 3456 dans cet article, mais veuillez choisir un numéro différent dans la mise en œuvre réelle (je pense que nous verrons bientôt beaucoup d’applications utilisant 3456 :-)

3 - Modifier les propriétés TCP/IP activer une adresse IP

Nous pouvons utiliser WMI à nouveau. Comme nous utilisons le port statique 3456, il suffit de mettre à jour deux propriétés dans la section IPAll: désactivez les ports dynamiques et définissez le port d'écoute sur 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

Notez que je n'ai pas eu à activer les adresses individuelles pour que cela fonctionne, mais si cela est nécessaire dans votre cas, vous devriez pouvoir étendre ce script facilement pour le faire.

Juste un rappel que lorsque vous travaillez avec WMI, WBEMTest.exe est votre meilleur ami!

4 - Activer l'authentification en mode mixte sur le serveur SQL

J'aimerais que nous puissions utiliser WMI à nouveau, mais malheureusement, ce paramètre n'est pas exposé via WMI. Il y a deux autres options:

  1. Utilisez la propriété LoginMode de la classe Microsoft.SqlServer.Management.Smo.Server, comme décrit ici .

  2. Utilisez la valeur LoginMode dans le registre SQL Server, comme décrit dans cet article . Notez que par défaut, l'instance SQL Server Express est nommée SQLEXPRESS. Par conséquent, pour mon instance SQL Server 2008 R2 Express, la clé de registre appropriée était HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQLServer.

5 - Changer le mot de passe par défaut de l'utilisateur (sa)

Vous avez celui-ci couvert.

6 - Enfin (connectez-vous à l'instance)

Comme nous utilisons un port statique attribué à notre instance SQL Server Express, il n'est plus nécessaire d'utiliser le nom de l'instance dans l'adresse du serveur.

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

S'il vous plaît laissez-moi savoir si cela fonctionne pour vous (doigts croisés!).

34

Je recommande d'utiliser SMO ( Activer le protocole réseau TCP/IP pour SQL Server ) . Cependant, il n'était pas disponible dans mon cas.

J'ai réécrit les commandes WMI de Krzysztof Kozielczyk vers 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
Der_Meister