Tenzij je een goede reden hebt om het register rechtstreeks aan te passen, raad ik je aan om WMI
te gebruiken . WMI zal u voorzien van een meer versie-agnostische implementatie. WMI is toegankelijk via de System.Management
naamruimte. Je zou een code kunnen hebben die er ongeveer zo uitziet.
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);
}
}
}
Deze code gaat uit van een projectverwijzing naar System.Management.dll
en de volgende gebruiksverklaring:
using System.Management;
De Sql-protocollen blog heeft een artikel dat gaat in enig detail over wat de bovenstaande code doet.
Opmerking:als een firewall de poort(en) blokkeert, hebt u nog steeds geen toegang tot de server via TCP.