L'idée du script ci-dessous est de proposer une forme d'inventaire des applications couvertes par une infra SCOM, en utilisant une liste, a maintenir, des principales classes d'objets tel que 'Active Directory Domain Controller Computer Role' ou encore 'IIS Server Role'.
Il est donc necessaire de maintenir un minimum dans le temps, le contenu de $ClassList, et la correspondance faites entre les pattern de nom de classes et les application correspondantes.
SCOM_Inventory_with_Main_Classes.ps1 (12,71 kb)
### SCOM INVENTORY USING APPLICATION MAIN CLASS ###
#Parameters
Param(
$MS= "MyMS.MyDomain",
$cred = $(Get-Credential "MyDomain\")
)
# List of all 'Top' Classes for which we need to get instances
$ClassList=(
# ACTIVE DIRECTORY
'Active Directory Domain Controller Computer Role',` # ACTIVE DIRECTORY
'Certificate Service', # ACTIVE DIRECTORY CERTIFICATE SERVICES
'Federation Server', # ACTIVE DIRECTORY FEDERATION SERVICES
# CITRIX
'Managed Citrix Presentation Server', # CITRIX
# EXCHANGE
'Microsoft Exchange 2010 Server', # EXCHANGE
'Exchange 2007 Server Role', # EXCHANGE
'Exchange 2013 Server', # EXCHANGE
# LYNC/SKYPE
'LS Server Role', # LYNC/SKYPE
# SHAREPOINT
'SharePoint Server', # SHAREPOINT
# SQL
'SQL Server 2008 DB Engine', # SQL (SQL 2008)
'SQL Server 2012 DB Engine', # SQL (SQL 2012)
'SQL Server 2014 DB Engine', # SQL (SQL 2014)
'SQL Server 2016 DB Engine', # SQL (SQL 2016)
'MSSQL on Windows: DB Engine', # SQL (SQL 2017+)
# SQL SSIS
'SQL Server 2014 Integration Services', # SQL SSIS (SQL 2014)
'SQL Server 2016 Integration Services', # SQL SSIS (SQL 2016)
'MSSQL on Windows Integration Services: Local Instance', # SQL SSIS (SQL 2017+)
# SQL SSAS
'SSAS 2008 Instance', # SQL SSAS (SQL 2008)
'SSAS 2012 Instance', # SQL SSAS (SQL 2012)
'SSAS 2014 Instance', # SQL SSAS (SQL 2014)
'SSAS 2016 Instance', # SQL SSAS (SQL 2016)
'MSSQL Analysis Services: Generic Instance', # SQL SSAS (SQL 2017+)
# SQL SSRS
'Microsoft SQL Server 2008 Reporting Services (Native Mode)', # SQL SSRS (SQL 2008)
'Microsoft SQL Server 2012 Reporting Services (Native Mode)', # SQL SSRS (SQL 2012)
'Microsoft SQL Server 2014 Reporting Services (Native Mode)', # SQL SSRS (SQL 2014)
'Microsoft SQL Server 2016 Reporting Services (Native Mode)', # SQL SSRS (SQL 2016)
'MSSQL Reporting Services: Instance (Native Mode)' , # SQL SSRS (SQL 2017)
# WINDOWS CLUSTER NODES
'Cluster Node', # WINDOWS CLUSTER
# IIS
'IIS Server Role', # IIS
# WINDOWS PRINT SERVER
'Print Services Role', # WINDOWS PRINT SERVER
# WINDOWS DNS
'Windows DNS Server', # WINDOWS DNS
# WSUS
'WSUS 3.0 Server', # WSUS
'Microsoft Windows Server Update Services 2012 R2', # WSUS
'Microsoft Windows Server Update Services 2016' # WSUS
)
#Import of SCOM module
try
{
Import-Module -Name OperationsManager -ErrorAction stop
}
catch
{
write-host -ForegroundColor red "Error during import of SCOM Module"
}
#Connection to $MS management server
New-SCOMManagementGroupConnection -ComputerName $MS -Credential $cred
# Create an empty tableau
$Finaltableau = @()
# Get All Instances for each class
foreach ($classname in $ClassList)
{
$class = Get-SCOMClass -DisplayName $classname
# If class is found we can go on
If($class)
{
$instances += Get-SCOMClassInstance -Class $class -ErrorAction SilentlyContinue
foreach ($inst in $instances)
{
$obj = New-Object psobject
switch -Regex ($classname)
{
# ACTIVE DIRECTORY
"Active Directory Domain Controller Computer Role"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.path
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "ACTIVE DIRECTORY"
}
# ACTIVE DIRECTORY CERTIFICATE SERVICES
"Certificate Service"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.displayname
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "ACTIVE DIRECTORY CERTIFICATE SERVICES"
}
# ACTIVE DIRECTORY FEDERATION SERVICES
"Federation Server"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.displayname
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "ACTIVE DIRECTORY FEDERATION SERVICES"
}
# CITRIX
".*Citrix.*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.displayname
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "CITRIX"
}
# EXCHANGE
".*Exchange.*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.displayname
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "EXCHANGE"
}
# LYNC/SKYPE
".*LS Server.*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.Path
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "LYNC/SKYPE"
}
# SHAREPOINT
".*sharepoint.*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.Path
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "SHAREPOINT"
}
# SQL DB ENGINE
"SQL Server.*DB Engine"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.Path
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "SQL"
}
"MSSQL on Windows: DB Engine"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.'[Microsoft.SQLServer.Windows.DBEngine].PrincipalName'.value
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "SQL"
}
# SQL BI
".*(SQL Server.*Integration Services|Analysis Services|Reporting Services|SSAS).*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.Path
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "SQL BI"
}
"MSSQL on Windows Integration Services: Local Instance"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.'[Microsoft.SQLServer.IS.Windows.LocalInstance].PrincipalName'.value
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "SQL BI"
}
# WINDOWS CLUSTER
".*Cluster Node.*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.DisplayName
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "WINDOWS CLUSTER"
}
# IIS
".*IIS Server Role.*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.Path
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "IIS"
}
# WINDOWS PRINT SERVER
".*Print Services Role.*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.Path
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "WINDOWS PRINT SERVER"
}
# WINDOWS DNS
".*Windows DNS Server.*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.Path
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "WINDOWS DNS"
}
# WSUS
".*(Windows Server Update|WSUS).*"
{
$obj | Add-Member -Name "COMPUTER" -membertype Noteproperty -Value $inst.Path
$obj | Add-Member -Name "CLASS" -membertype Noteproperty -Value $classname
$obj | Add-Member -Name "MAIN ROLE" -membertype Noteproperty -Value "WSUS"
}
}
$Finaltableau += $obj
}
}
Else
{
$ClassError = "'$classname' class was not found`n"
}
# Clear of $instances variable for each $classname loop
Clear-Variable instances
}
# Display Final Result
$Finaltableau
# Display If some class was not found
If ($ClassError)
{
Write-Host -F Red "SOME CLASSES WAS NOT FOUND:`n$ClassError"
}