Kecuali Anda memiliki alasan yang baik untuk memodifikasi registri secara langsung, saya sarankan Anda mempertimbangkan untuk menggunakan WMI
. WMI akan memberi Anda implementasi agnostik versi yang lebih banyak. WMI dapat diakses melalui System.Management
ruang nama. Anda dapat memiliki kode yang terlihat seperti ini.
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);
}
}
}
Kode ini mengasumsikan referensi proyek ke System.Management.dll
dan menggunakan pernyataan berikut:
using System.Management;
Protokol Sql blog memiliki artikel yang masuk ke beberapa detail tentang apa yang dilakukan kode di atas.
Catatan:Jika firewall memblokir port, Anda tetap tidak dapat mengakses server melalui TCP.