À moins que vous n'ayez une bonne raison de modifier directement le registre, je vous suggère d'envisager d'utiliser WMI
. WMI vous fournira une implémentation plus indépendante de la version. WMI est accessible via System.Management
espace de noms. Vous pourriez avoir un code qui ressemble à ceci.
public void EnableSqlServerTcp(string serverName, string instanceName)
{
ManagementScope scope =
new ManagementScope(@"\\" + serverName +
@"\root\Microsoft\SqlServer\ComputerManagement");
ManagementClass sqlService =
new ManagementClass(scope,
new ManagementPath("SqlService"), null);
ManagementClass serverProtocol =
new ManagementClass(scope,
new ManagementPath("ServerNetworkProtocol"), null);
sqlService.Get();
serverProtocol.Get();
foreach (ManagementObject prot in serverProtocol.GetInstances())
{
prot.Get();
if ((string)prot.GetPropertyValue("ProtocolName") == "Tcp" &&
(string)prot.GetPropertyValue("InstanceName") == instanceName)
{
prot.InvokeMethod("SetEnable", null);
}
}
uint sqlServerService = 1;
uint sqlServiceStopped = 1;
foreach (ManagementObject instance in sqlService.GetInstances())
{
if ((uint)instance.GetPropertyValue("SqlServiceType") == sqlServerService &&
(string)instance.GetPropertyValue("ServiceName") == instanceName)
{
instance.Get();
if ((uint)instance.GetPropertyValue("State") != sqlServiceStopped)
{
instance.InvokeMethod("StopService", null);
}
instance.InvokeMethod("StartService", null);
}
}
}
Ce code suppose une référence de projet à System.Management.dll
et l'instruction using suivante :
using System.Management;
Les les protocoles SQL le blog a un article cela explique en détail ce que fait le code ci-dessus.
Remarque :Si un pare-feu bloque le(s) port(s), vous ne pourrez toujours pas accéder au serveur via TCP.