Jeśli nie masz dobrego powodu, aby bezpośrednio modyfikować rejestr, sugeruję rozważenie użycia WMI
. Usługa WMI zapewni bardziej niezależną od wersji implementację. Dostęp do usługi WMI można uzyskać za pośrednictwem System.Management
przestrzeń nazw. Możesz mieć kod, który wygląda mniej więcej tak.
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);
}
}
}
Ten kod zakłada odwołanie do projektu do System.Management.dll
oraz następujące oświadczenie:
using System.Management;
Protokoły SQL blog zawiera artykuł który zawiera pewne szczegóły dotyczące tego, co robi powyższy kod.
Uwaga:Jeśli zapora blokuje porty, nadal nie będziesz mógł uzyskać dostępu do serwera przez TCP.