Как удаленно обнаружить экземпляры SQL Server на машине? Часть II

Содержание предыдущей серии.

Способ посмотреть на удаленной машине установленные сервисы, имеющие отношение к различным фичам в составе SQL Server, к сожалению, ничего не говорит про версию продукта. Установленный экземпляр по умолчанию будет все так же называться MSSQLSERVER и в случае 2008R2, и в случае 2008, и в случае 2005. Здесь нам на помощь придет реджистри, сиречь системный реестр. Меня поражают «знатоки» в форумах, которые на четко поставленный вопрос, как найти информацию о SQL Server в реестре, безапелляционно надув щеки, отвечают you don't have to go through the registry for that - look up the SERVERPROPERTY() function in Books Online. Легко прослыть в форуме знатоком, отвечая не на те вопросы, что тебе задают,а которые ты сам себе придумал. То, что SQL Server в этот момент может быть остановлен или с ним нельзя соединиться еще по каким-либо причинам, знатока, по-видимому, не особенно волнует. Как вытянуть из реестра информацию об установленных экземплярах SQL Server, мы проходили здесь. Теперь давайте посмотрим, как это сделать удаленно.

Конфигурация примера будет та же, что и в предыдущем посте. У меня имеется хост и на нем виртуалка по имени w7x86sql08r2. С хоста требуется забраться в реестр на виртуалке и прочитать там информацию об установленных экземплярах SQL Server. Информация об установленных экземплярах, например, SQL Server Engine, хранится в ключе HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL. Каждое значение (Registry Value) в этом ключе имеет имя, равное имени экземпляра, а в данных значения (Value Data) хранится подключ, в котором можно почерпнуть более детальную информацию об экземпляре.

Рис. 1

Скрипт пробегается по всем значениям, и ходит для каждого в соответствующий ключик, откуда собирает данные по номеру версии (ключ <Подключик экземпляра>\MSSQLServer\CurrentVersion, значение CurrentVersion):

Рис. 2

и установленной функциональности (ключ <Подключик экземпляра>\ConfigurationState, все значения, у которых в данных стоит 0х00000001).

Аналогично поступаем с экземплярами Analysis Services (ключ HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\OLAP) и Reporting Services (...\RS).

Для удаленного доступа к реестру можно использовать WMI, как в предыдущем посте; мы для разнообразия воспользуемся встроенными средствами .NET:

function Detect-Instances 
{ 
 param ([string] $machineName, [string] $feature) 
 [Microsoft.Win32.RegistryKey] $rootSQLKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $machineName).OpenSubKey("SOFTWARE\Microsoft\Microsoft SQL Server") 
 [Microsoft.Win32.RegistryKey] $keyInstances = $rootSQLKey.OpenSubKey("Instance Names\" + $feature) 
 Write-Host $feature : 
 Write-Host "---------------------" 
 foreach ($valName in $keyInstances.GetValueNames()) 
 { 
  [string] $valData = $keyInstances.GetValue($valName) 
  [Microsoft.Win32.RegistryKey] $keyInstance = $rootSQLKey.OpenSubKey($valData) 
  [string] $version = $keyInstance.OpenSubKey("MSSQLServer\CurrentVersion").GetValue("CurrentVersion") 
  Write-Host С именем $valName версии $version 
  [string] $s = "" 
  $keyInstance.OpenSubKey("ConfigurationState").GetValueNames() | Where-Object {$keyInstance.OpenSubKey("ConfigurationState").GetValue($_) -eq 1} | ForEach-Object {$s += $_ + "; "} 
  Write-Host "Установленная функциональность: " $s.Substring(0, $s.Length - 2) 
  Write-Host "---------------------" 
 } 
} 
cls 
[string] $machineName = "w7x86sql08r2" 
Write-Host "Машина $machineName. Обнаружены экземпляры" 
Write-Host "==========================================" 
Detect-Instances $machineName "SQL" 
Detect-Instances $machineName "OLAP" 
Detect-Instances $machineName "RS" 
Write-Host "=========================================="

Скрипт 1

Сохраняем данный код в файл и вызываем его из командной строки PowerShell:

Рис. 3

Рис. 4

Соответствие номера версии человеческому обозначению можно найти здесь же в блоге, в одном из ранних постов.

Для успешной работы скрипта на удаленной машине, на которой мы хотим обнаружить экземпляры SQL Server, должна быть запущена служба Remote Registry, которая по умолчанию обычно выключена:

Рис. 5

Она, в свою очередь, зависит от службы Remote Procedure Call (RPC), которая по умолчанию обычно включена, т.к. от нее много еще чего зависит.

Автор: Алексей Шуленин