Om du inte har en bra anledning att ändra registret direkt, föreslår jag att du överväger att använda WMI
. WMI kommer att förse dig med en mer version av agnostisk implementering. WMI kan nås via System.Management
namnutrymme. Du kan ha kod som ser ut ungefär så här.
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);
}
}
}
Den här koden förutsätter en projektreferens till System.Management.dll
och följande med sats:
using System.Management;
Sql-protokollen bloggen har en artikel som går in i detalj på vad ovanstående kod gör.
Obs:Om en brandvägg blockerar porten/portarna kommer du fortfarande inte att kunna komma åt servern via TCP.