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

enter image description here

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

enter image description here

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

enter image description here

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.

37
demandé sur Community 2012-02-04 07:30:43

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:

  1. utiliser LoginMode bien de la catégorie Microsoft.SqlServer.Management.Smo.Server , tel que décrit ici .

  2. 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 était HKEY_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!).

34
répondu Krzysztof Kozielczyk 2017-05-23 12:26:32

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'
0
répondu Der_Meister 2017-05-20 07:26:08