Как определить зависимость от SQL Server в службе Windows, которая работает с SQL Server Express - PullRequest
7 голосов
/ 15 июня 2009

Я использую следующий код для определения зависимости службы от SQL Server:

serviceInstaller.StartType = ServiceStartMode.Automatic;
serviceInstaller.ServicesDependedOn = new[] { "MSSQLSERVER" }; 
Installers.Add(serviceInstaller);
Installers.Add(processInstaller);

Это работает на двух машинах, один с SQL Server, а другой с SQL Server Express. Но когда я установил службу на клиентском сервере, это не удалось, поскольку имя службы SQL Server Express было другим (SQLSERVEREXPRESS). Есть ли способ определения зависимости, которая работает в обеих ситуациях? Благодарю.

Ответы [ 2 ]

13 голосов
/ 15 июня 2009

Вам необходимо использовать правильное имя сервиса. Имя службы SQL MSSQLSERVER для экземпляров по умолчанию, SQLSERVEREXPRESS для (некоторых) экземпляров Express и MSSQL$<instancename> для именованного экземпляра. Поскольку имя в основном динамическое, лучшим вариантом является перечисление служб SQL Server и выбор правильного имени или запрос пользователя при наличии нескольких вариантов выбора.

К сожалению, я не знаю ни одного API для перечисления установленных экземпляров SQL Server. Даже MS поддерживает обращение к реестру :

Q. Как определить, сколько экземпляры SQL Server установлены на компьютере?

A: Имена всех SQL Server экземпляры на компьютере можно найти из значения InstalledInstances который расположен под следующим ключ реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server

1 голос
/ 04 июня 2016

Вот подробное описание того, что Ремус Русану предложил :

//Source: https://stackoverflow.com/a/7139986/16911
//Get all installed named instances.
var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var rk = localMachine.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server");
var instances = (String[])rk.GetValue("InstalledInstances");

List<String> sqlServices = instances.Select(x => "MSSQL$" + x).ToList();

//Add SQLSERVEREXPRESS and MSSQLSERVER, if they exist.
if(DoesServiceExist("SQLSERVEREXPRESS")) {
    sqlServices.Add("SQLSERVEREXPRESS");
}

if(DoesServiceExist("MSSQLSERVER")) {
    sqlServices.Add("MSSQLSERVER");
}

service.ServicesDependedOn = sqlServices.ToArray();

У меня не было возможности полностью протестировать неназванные экземпляры или проверить различия между x64 / x86 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...