Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Способ посмотреть на удаленной машине установленные сервисы, имеющие отношение к различным фичам в составе 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), которая по умолчанию обычно включена, т.к. от нее много еще чего зависит.
Алексей Шуленин
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.htmlAnonymous
August 13, 2010
вам пасиба за описалово в любом случае! я на павершелле не осилилAnonymous
August 13, 2010
Всё очень интересно. Риторическое замечание: для доступа к сервису достаточно прав доступа к WMI объектам на удаленном компьютере. А для дополнительной информации о конкретной версии еще нужно запускать Remote Registry. Считаю что лучше бы версию впихнули куда-нибудь в описание сервиса, чтобы только через WMI можно было получать базовую информацию об эекземляре SQLServerAnonymous
October 28, 2010
2 isvrus: извиняюсь, сервиса часто херят почему-то куски кода. перепостил сюда его: http://pastebin.com/b1vLwYBq запись обновлю вечером