Как удаленно обнаружить экземпляры 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) хранится подключ, в котором можно почерпнуть более детальную информацию об экземпляре.

image

Рис.1

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

image

Рис.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:

image

Рис.3

image

Рис.4

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

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

image

Рис.5

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

 

 

Алексей Шуленин

Продолжение следует.

Comments

  • Anonymous
    January 01, 2003
    И Вам пасиб. Тока йа Вашего кода савиршенно ниасилел, патамушто ниношол. По приведенной Вами ссылке http://www.pastebin.org/131380 демонстрируется пустой текстбокс :(

  • Anonymous
    January 01, 2003
    Remote Registry можно не включать. Вместо нее можно включить службу SQL Browser, которая читает из реестра информацию об установленных экземплярах и потом щедро делится ею по UDP 1434. Смотрите следующую серию картины :)

  • Anonymous
    August 13, 2010
    собсно эта штука полезна бы была раньш. но я уже сварганил сам аналог работоспособный на обеих архитектурах 3264бита swdukk.livejournal.com/12838.html

  • Anonymous
    August 13, 2010
    вам пасиба за описалово в любом случае! я на павершелле не осилил

  • Anonymous
    August 13, 2010
    Всё очень интересно. Риторическое замечание: для доступа к сервису достаточно прав доступа к WMI объектам на удаленном компьютере. А для дополнительной информации о конкретной версии еще нужно запускать Remote Registry. Считаю что лучше бы версию впихнули куда-нибудь в описание сервиса, чтобы только через WMI можно было получать базовую информацию об эекземляре SQLServer

  • Anonymous
    October 28, 2010
    2 isvrus: извиняюсь, сервиса часто херят почему-то куски кода. перепостил сюда его: http://pastebin.com/b1vLwYBq запись обновлю вечером