Activer les connexions à distance tcpip vers sql server express base de données déjà installée avec du code ou un script(requête)
je déploie sql express avec mon application. J'aimerais que ce moteur de base de données Accepte les connexions à distance. 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 si il sera possible de faire la même chose à partir de la ligne de commande.
ou peut-être que je vais devoir créer un" projet de 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 qui est déjà installé. regardez 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/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
EDIT 3
comme Krzysztof a déclaré dans sa réponse j'ai besoin (plus d'autres choses que je sais qui sont nécessaires)
1 - Activer TCP / IP
j'ai réussi à le faire lors de l'installation d'une nouvelle instance de SQLExpress 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
( j'ai fait cela à la main mais je crois que je vais être capable de le faire avec c#) Jusqu'à présent, je dois jouer à aroud avec cette commande de la console:
netsh firewall set portopening protocol = TCP port = 1433 name = SQLPort mode = ENABLE scope = SUBNET profile = CURRENT
3 - Modifier les propriétés TCP/IP activer une adresse IP
Je n'ai pas été capable de comprendre comment activer une IP, changer un port, etc.. je pense que ce sera l'étape plus compliquée à résoudre
4 - Activer l'authentification en mode mixte dans sql server
j'ai réussi à le faire lors de L'installation de SQL Express en passant le paramètre /SECURITYMODE=SQL
se référer au lien de l'étape 1.
SQL Server express nécessite ce type d'authentification pour accepter les connexions à distance.
5 - Changer d'utilisateur (sa) par défaut passowrd
par défaut le compte sa a un passowrd nul. Pour accepter les connexions, cet utilisateur doit avoir un mot de passe. J'ai changé le passowrd par défaut de la sa avec le script:
ALTER LOGIN [sa] WITH PASSWORD='*****newPassword****'
6-enfin
sera être capable de se connecter si toutes les dernières étapes sont satisied comme:
SQLCMD -U sa -P newPassword -S 192.168.0.120SQLEXPRESS,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 l'utilisateur,- P pour le mot de passe et-S pour la source de données. Je ne me souviens pas des noms exacts.
2 réponses
j'ai testé ci-dessous le code avec SQL Server 2008 R2 Express et je crois que nous devrions avoir une solution pour les 6 étapes que vous avez décrites. Prenons-les un à 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 ports de droite dans le pare-feu
je crois que votre solution va fonctionner, assurez-vous juste vous spécifiez le bon port. Je suggère que nous choisissions un port différent de 1433 et en faire un port SQL Server Express statique sera à l'écoute. Je vais être en utilisant 3456 dans ce post, mais s'il vous plaît choisir un autre numéro dans la mise en œuvre réelle (je pense que nous allons voir beaucoup d'applications à l'aide de 3456 bientôt :-)
3-Modifier les propriétés TCP/IP activer une adresse IP
Nous pouvons utiliser WMI de nouveau. Puisque nous utilisons le port 3456 statique, nous avons juste besoin de mettre à jour deux propriétés dans IPAll section: Désactiver les ports dynamiques et régler le port d'écoute à 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 à activer l'une des adresses individuelles pour le faire fonctionner, mais si c'est nécessaire dans votre cas, vous devriez être en mesure d'étendre ce script facilement à le faire.
Juste un rappel que lorsque l'on travaille avec WMI, WBEMTest.exe est votre meilleur ami!
4-Activer l'authentification en mode mixte dans le serveur sql
j'aimerais que nous puissions utiliser WMI à nouveau, mais malheureusement ce cadre n'est pas exposé par WMI. Il y a deux autres options:
-
utiliser
LoginMode
bien de la catégorieMicrosoft.SqlServer.Management.Smo.Server
, tel que décrit ici . -
utiliser la valeur LoginMode dans le registre SQL Server, comme décrit dans ceci post . Notez que par défaut L'instance SQL Server Express est appelée
SQLEXPRESS
, donc pour mon instance SQL Server 2008 R2 Express la clé de registre de droite étaitHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQLServer
.
5 - Changer d'utilisateur (sa) mot de passe par défaut
tu t'en occupes.
6-Enfin (connexion à l'instance)
puisque nous utilisons un port statique assigné à notre SQL Server Express par exemple, il n'est plus nécessaire d'utiliser le nom d'instance dans l'adresse du serveur.
SQLCMD -U sa -P newPassword -S 192.168.0.120,3456
s'il vous plaît faites-moi savoir si cela fonctionne pour vous (doigts croisés!).
je recommande D'utiliser SMO ( activer le protocole réseau TCP/IP pour le serveur SQL ). Cependant, il n'était pas disponible dans mon cas.
j'ai réécrit les commandes WMI de Krzysztof Kozielczyk à 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'