public static List <SqlServerInstance> EnumLocalInstances() { var retVal = new List <SqlServerInstance>(); try { var registryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32; using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView)) { var instanceKey = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", false); if (instanceKey != null) { retVal.AddRange(instanceKey.GetValueNames().Select(SqlServerInstance.CreateLocal)); } } } catch (Exception ex) { LogWrapper.WriteError(ex.ToString()); } return(retVal); }
public static List <SqlServerInstance> EnumRemoteInstances() { var socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp) { EnableBroadcast = true, ReceiveTimeout = 1000, DualMode = true }; var bytes = new List <byte>(4096); try { var ipv4ep = new IPEndPoint(IPAddress.Broadcast, 1434); var ipv6ep = new IPEndPoint(IPAddress.Parse("ff02::1"), 1434); byte[] msg = { 0x02 }; socket.SendTo(msg, ipv4ep); socket.SendTo(msg, ipv6ep); int cnt = 0; byte[] byteBuffer = new byte[4096]; do { cnt = socket.Receive(byteBuffer); bytes.AddRange(byteBuffer.Take(cnt)); } while (cnt != 0); } catch (SocketException sex) { const int WSAETIMEDOUT = 10060; // Connection timed out. const int WSAEHOSTUNREACH = 10065; // No route to host. if (sex.ErrorCode == WSAETIMEDOUT || sex.ErrorCode == WSAEHOSTUNREACH) { } else { LogWrapper.WriteError(sex.ToString()); return(new List <SqlServerInstance>()); } } finally { socket.Close(); } string text = Encoding.ASCII.GetString(bytes.ToArray()); var servers = text.Split(new[] { ";;" }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Substring(s.IndexOf("ServerName", StringComparison.Ordinal))); return(servers .Select(server => PatternRegex.Match(server)) .Select(match => SqlServerInstance.Create(match.Groups["server"].Value, match.Groups["instance"].Value)) .Distinct(SqlServerInstance.Comparer) .Where(instance => !instance.IsLocal) .OrderBy(instance => instance.ServerName) .ThenBy(instance => instance.InstanceName) .ToList()); }