## blog.schmitouille.net ## Script d'inventaire SQL Server à partir d'une liste de noms de machines [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') ## importation des objets pour interagir avec SqlServer function Get_ProperOS{ ## L'OS nous retourne un numéro de version de Windows, en fonction de celui-ci on convertit le numéro de version en appellation commerciale param($OS) if ($OS -like '5.0*') { return "Windows Server 2000" } elseif ($OS -like '5.2*') { return "Windows Server 2003" } elseif ($OS -like '6.0*') { return "Windows Server 2008" } elseif ($OS -like '6.1*') { return "Windows Server 2008 R2" } elseif ($OS -like '6.2*') { return "Windows Server 2012" } elseif ($OS -like '6.3*') { return "Windows Server 2012 R2" } elseif ($OS -like '10.0*') { return "Windows Server 2016" } else { return "Unknown NT version" } } function Get_ProperSQL{ ## SQL Server nous retourne un numéro de version de SQL, en fonction de celui-ci on convertit le numéro de version en appellation commerciale param($SQL) if ($SQL -like '8.0*') { return "SQL Server 2000" } elseif ($SQL -like '9.0*') { return "SQL Server 2005" } elseif ($SQL -like '10.0*') { return "SQL Server 2008" } elseif ($SQL -like '10.5*') { return "SQL Server 2008 R2" } elseif ($SQL -like '11.0*') { return "SQL Server 2012" } elseif ($SQL -like '12.0*') { return "SQL Server 2014" } elseif ($SQL -like '13.0*') { return "SQL Server 2016" } elseif ($SQL -like '14.0*') { return "SQL Server 2017" } else { return "Unknown SQL version" } } function Get_ServerName{ ## les propriétés ne sont pas exploitables directement, il faut donc faire une recherche dans la collection et extraire la valeur param($SqlHostProperties) $SrvHostname = $SqlHostProperties | where {$_.name -eq "ComputerNamePhysicalNetBios"} | select value ## Nom du serveur, sans le domaine return $SrvHostname.Value } function Get_ServerMemory{ ## les propriétés ne sont pas exploitables directement, il faut donc faire une recherche dans la collection et extraire la valeur param($SqlHostProperties) $SrvMemory = $SqlHostProperties | where {$_.name -eq "PhysicalMemory"} | select value ## Quantité de RAM du serveur, en Mo return $SrvMemory.Value } function Get_ServerProcessors{ ## les propriétés ne sont pas exploitables directement, il faut donc faire une recherche dans la collection et extraire la valeur param($SqlHostProperties) $SrvCPUs = $SqlHostProperties | where {$_.name -eq "Processors"} | select value ## Nombre de processeurs vus par l'OS, attention, ce n'est pas le nombre de proc physiques! si le CPU est un 8 coeurs et 2 threads par coeur, la valeur sera donc 16 (8 x 2) return $SrvCPUs.Value } Write-Host "SQL Server Inventory Powershell Script" Write-Host "======================================" $today = Get-Date -f "yyMMdd" ## date du jour $CsvFile = "C:\temp\SqlServer_Inventory_$today.csv" ## incorporation de la date dans le nom de fichier Clear-Content -path $CsvFile -Force ## si le fichier existe déjà, on le vide $CsvHeader = "ServerName,OS,SqlServerVersion,SqlServerEdition,SqlServicePack,Cores,RAM" ## chaîne d'entête du fichier CSV Add-Content $CsvFile $CsvHeader ## écriture de cette entête sur le disque $SqlSrvListFile = "sqlsrv_list.csv" ## le fichier CSV comportant les noms des serveurs sous l'entête 'ServerName' $SqlSrvList = [object]$SqlSrvList = Import-CSV $SqlSrvListFile ## importation du fichier CSV foreach ($SqlServer in $SqlSrvList.ServerName) { ## début du vrai traitement SQL : pour chaque serveur, on récupère les informations nécessaires, 'ServerName' étant l'entête du fichier CSV en entrée Write-Host "Working on $SqlServer" $SqlHost = New-Object -type Microsoft.SqlServer.Management.Smo.Server -ArgumentList $SqlServer ## SqlHost est l'objet représentant un serveur SQL. if ($SqlHost.ComputerNamePhysicalNetBIOS -ne $null) { ## étant donné qu'il ne semble pas y avoir de timeout si le serveur SQL ne répond pas, on vérifie si l'objet contient un nom de serveur renvoyé par SQL. Si il est vide cela signifie que SQL n'est pas joignable, et donc on passe au suivant. $SqlHostProperties = $SqlHost.Information.Properties | select Name,Value $ServerName = Get_ServerName($SqlHostProperties) $OSVersString = Get_ProperOS($SqlHost.OSVersion) $SqlVersString = Get_ProperSQL($SqlHost.VersionString) $SqlEdit = $SqlHost.Edition $SqlSpack = $SqlHost.ProductLevel $Cpu = Get_ServerProcessors($SqlHostProperties) $Mem = Get_ServerMemory($SqlHostProperties) $Dump = "$ServerName"+","+"$OSVersString"+","+"$SqlVersString"+","+"$SqlEdit"+","+"$SqlSpack"+","+"$Cpu"+","+"$Mem" ## on concatène toutes les infos récupérées dans une chaîne avec des virgules pour bien coller à l'entête Add-Content $CsvFile $Dump ## écriture sur le disque } else { Write-Host "Couldn't query $SqlServer." } } Write-Host "Done."