#sql-server #powershell
#sql-server #powershell
Вопрос:
Строго говоря, вопрос в том, что я использую это решение, и оно работает, но есть ли лучший способ?
Со следующими оговорками.
1) Я не хочу выполнять поиск по всей сети для экземпляров SQL, я опрашиваю известные серверы SQL, но я хочу получить имена экземпляров на каждом.
2) Код предполагает, что Microsoft никогда не изменит отображаемое имя для службы SQL Server.
function getSQLInstance ([string]$SERVER) {
$services = Get-Service -Computer $SERVER
# Filter for SQL services
$services = $services | ? DisplayName -like "SQL Server (*)"
# Remove MSSQL$ qualifier to get instance name
try {
$instances = $services.Name | ForEach-Object {($_).Replace("MSSQL`$","")}
}catch{
# Error if none found
return -1
}
return $instances
}
getSQLInstance "YOUR_SERVER"
Ответ №1:
Вместо того, чтобы заново изобретать колесо, взгляните на то, как SQL Power Doc обнаруживает экземпляры на сервере. Который, судя по NetworkScan.psm1
, очень похож на ваш подход:
$ManagedComputer.Services | ForEach-Object {
if (($_.Name).IndexOf('$') -gt 0) {
$InstanceName = ($_.Name).Substring(($_.Name).IndexOf('$') 1)
$IsNamedInstance = $true
$ManagedComputerServerInstanceName = $InstanceName
} else {
$InstanceName = $null
$IsNamedInstance = $false
$ManagedComputerServerInstanceName = $_.Name
}
Или просто используйте SQL Power Doc и укажите его на определенные имена серверов, чтобы собрать эти и другие данные об экземплярах.