Hoe het Bouwen van een Windows Server Inventory Report Gratis met PowerShell

PowerShell wordt gebruikt door veel server-beheerders. Natuurlijk, een van de meest gebruikte taken is de mogelijkheid voor het bouwen van scripts en functies om een inventaris van uw servers en begrijpen wat uw omgeving heeft.

Hoewel er vele manieren om dit te bereiken, met verschillende niveaus van complexiteit, we bouwen een vrij eenvoudige, maar effect Windows Server Inventory Report in dit artikel.

Voorwaarden

In dit artikel zal worden hands-on. Als u van plan bent om langs te volgen, zorg ervoor dat u de volgende voorwaarden in de eerste plaats:

  • Werken aan een Active Directory (AD) domein Windows PC 10
  • De ActiveDirectory PowerShell module geïnstalleerd van de RSAT-toolkit.
  • De toestemming hebben om query AD computer accounts
  • Kan het uitvoeren van externe WMI/CIM-query ‘ s op externe computers
  • Hebben PowerShell Remoting beschikbaar op externe computers

Het Ophalen Van De Servers

Fundamenteel voor het script die we bouwen zijn de servers zelf. Je kan individueel schrijven ze in een tekst-bestand dat wordt gelezen, of in een array in het script zelf, maar met behulp van PowerShell we kunnen een betere. Om het script meer dynamisch en niet verplichten ons om het aan te passen elke keer dat u een nieuwe server toevoegt, kunnen we gebruik maken van de Active Directory (AD) trekt de lijst van computer-objecten in een bepaalde organisatie-eenheid (OU).

Hieronder gaan we gebruik maken van de ActiveDirectory module, verkrijgbaar in de RSAT-toolkit, query ‘ s op de Servers OU en ophalen van de computer objecten er via Get-ADComputer.

Import-Module ActiveDirectory

$OU = “OU=Servers,DC=domein,DC=local’

$Params = @{
“SearchBase” = $OU
“Filter” = ‘*’
}

$Servers = Get-ADComputer @Params

Op dit punt, we kunnen eruit gefilterd gewoon de naam van de eigenschap voor het vullen van de $servers variabel, maar vaak is het handig om de hele geretourneerde object te gebruiken later.

Het bepalen van de Gegevens te Verzamelen

Nu hebben we onze servers, we moeten uitzoeken wat er precies moet verzamelen we van elke server. Een van de redenen dat het belangrijk kan zijn om de volledige ADVERTENTIE object is de combinatie van die gegevens met de gegevens rechtstreeks van de server zelf te krijgen van een groter beeld van uw omgeving.

In de praktijk wat doet zoiets als dit eruit? Laten we een lijst van enkele van de eigenschappen die zeer handig om te weten.

Server Waarden

  • Server Host Naam
  • Vrije Schijf Ruimte
  • Geheugen
  • Netwerk Verbindingen

AD Waarden

  • Het Wachtwoord Voor Het Laatst Ingesteld
  • Laatste Aanmelding
  • De DNS-hostnaam

Het Ophalen Van Informatie Over De Server

Hoe gaan we over het verzamelen van deze gegevens op onze lijst van servers teruggestuurd? Sindsdien hebben we een lijst van servers, zullen we moeten itereren over de $Servers object en query. Te beginnen met een eenvoudige Foreach-Object-lus kunnen we u een aangepast object om vast te houden aan onze waarden.

$Servers | Foreach-Object {
[PSCustomObject]@{
“ServerHostName” = $_.Naam
“Description” = $_.Beschrijving
“FreeDiskSpace” = $Null
“TotalMemory” = $Null
“Netwerk Verbindingen” = $Null
“PasswordLastSet” = $_.pwdLastSet
“LastLogon” = $_.lastLogon
“DNSHostName” = $_.DNSHostName
“CreationDate” = $_.WhenCreated
}
}

Aangezien u kunt vertellen, door het opslaan van de volledige object in Active Directory toen we voor het eerst opgehaald computers, laat ons het vullen van een breed scala van informatie. Helaas, dit is niet alle informatie die we nodig hebben.

Om de gegevens van elk van de server, we maken gebruik van een vertrouwde interface te veel server beheerders, is dat het Windows Management Instrumentation (WMI) – interface. Je kan merken dat de cmdlets gebruikt uit het Common Information Model (CIM) interface, die WMI is de Microsoft-implementatie van deze standaard.

Voor de Vrije Schijf Ruimte

Met behulp van de beschikbare WMI-klasse van Win32_LogicalDisk, kunnen we alle beschikbare schijven en hun vrije ruimte. Als eerste gaan we de opdracht uitvoeren, Krijgt-CimInstance -ClassName Win32_LogicalDisk, zou je merken dat het niet precies leesbaar op de standaard output.

Het tweede probleem hier is dat we meer dan één schijf worden geretourneerd. Ik zou graag willen weten over elk van deze stations en hoeveel vrije ruimte beschikbaar is in de GBs. Laten we de code te wijzigen om te doen wat transformaties en maak het beter.

$Schijven = Get-CimInstance -ClassName Win32_LogicalDisk

$DisksResult = $Schijven | Foreach-Object {
[PSCustomObject]@{
“Drive” = $_.DeviceID
“FreeSpace” = [Math]::Round(($_.FreeSpace / 1GB),2)
}
}

$DisksResult

Nadat we de opdrachten uitvoeren, onze output is veel schoner en kan nu gebruikt worden in ons script.

Maar wat als we wilden alert op een lage schijfruimte aandoening? Het zou leuk zijn om uit te breiden dit gewoon een beetje een vlag op elke schijf die voldoet aan die voorwaarde. Het vergelijken van de vrije ruimte naar de totale beschikbare ruimte, kunnen we zien als het onder de 10% of 10 GB. De reden voor de -of aandoening, is dat op zeer grote schijven van 10%, kan nog steeds worden zeer royale zodat het instellen van een absolute limiet helpt.

$Schijven = Get-CimInstance -ClassName Win32_LogicalDisk

$DisksResult = $Schijven | Foreach-Object {
$FreeSpace = [Math]::Round(($_.FreeSpace / 1GB),2)
$TotalSpace = [Math]::Round(($_.Grootte / 1GB),2)

If ( ($FreeSpace / $TotalSpace -LT 0.10) -Of $FreeSpace -LT 10 ) {
$LowDiskSpace = $True
} Else {
$LowDiskSpace = $False
}

[PSCustomObject]@{
“Drive” = $_.DeviceID
“FreeSpace” = $FreeSpace
“LowDiskSpace” = $LowDiskSpace
}
}

$DisksResult

Aangezien u kunt vertellen, we hebben een geweldige verzameling van informatie moet worden opgeslagen met onze servers.

Hoe%20to%20Build%20a%20Windows%20Server%20Inventory%20Report%20for/Untitled%202.png

Voor het Beschikbare Geheugen

Het is handig om te weten hoeveel RAM-geheugen is toegewezen aan elke server, in het bijzonder in een virtuele machine van de omgeving. Als u vindt dat sommige over-provisioned kunt u het redden van waardevolle rijkdommen door right-sizing servers. Gelukkig, dit is veel eenvoudiger op te halen.

Met behulp van de Win32_PhysicalMemory WMI-klasse, kunnen we de som van alle van de geretourneerde Capaciteit eigenschappen te krijgen van het totale geheugen.

(Voor-CimInstance -ClassName Win32_PhysicalMemory | Maatregel-Object -Eigendom Capaciteit -Som).Som / 1GB

Alle Netwerk Verbindingen

Tot slot willen we voor het ophalen van alle netwerk verbindingen samen. Dit is nuttig om te weten als u een bepaalde server meerdere interfaces te worden bezorgd. Met behulp van een iets ander mechanisme van deze tijd, wij zijn met behulp van de Get-NetAdapter cmdlet, maar omdat deze niet hebben van een parameter Computernaam, zullen we gebruik maken van PS Remoting te maken op deze lokaal op de server en de resultaten terug naar ons script.

$Netwerk Verbindingen = Beroepen-Opdracht -Computernaam $_.DnsHostName -ScriptBlock {
Get-NetAdapter -Fysieke | Select-Object Naam, Status, LinkSpeed
}

Onze uitvoer ziet er ongeveer zo dat hieronder en dan kunnen wij dit opslaan in ons script.

Houd in gedachten dat voor de Beroepen-Opdracht om te werken, PS Remoting moet worden ingesteld op de target servers.

Putting het Allemaal Samen

Nu hebben we alle stukken, laten we dit allemaal samen. Het definitieve script is hieronder en combineert de code voor het maken van een aangepaste output object met slechts wat we willen rapport op.

Import-Module ActiveDirectory

$OU = “OU=Servers,DC=domein,DC=local’

$Params = @{
“SearchBase” = $OU
“Filter” = ‘*’
}

$Servers = Get-ADComputer @Params

$Servers | Foreach-Object {
$Schijven = Get-CimInstance -Computernaam $_.DnsHostName -ClassName Win32_LogicalDisk

$DisksResult = $Schijven | Foreach-Object {
[PSCustomObject]@{
“Drive” = $_.DeviceID
“FreeSpace” = [Math]::Round(($_.FreeSpace / 1GB),2)
}
}

$Netwerk Verbindingen = Beroepen-Opdracht -Computernaam $_.DnsHostName -ScriptBlock {
Get-NetAdapter -Fysieke | Select-Object Naam, Status, LinkSpeed
}

[PSCustomObject]@{
“ServerHostName” = $_.Naam
“Description” = $_.Beschrijving
“FreeDiskSpace” = $DisksResult
“TotalMemory” = ((Get-CimInstance -Computernaam $_.DnsHostName -ClassName Win32_PhysicalMemory | Maatregel-Object -Eigendom Capaciteit -Som).Som / 1GB)
“Netwerk Verbindingen” = $Netwerk Verbindingen
“PasswordLastSet” = $_.pwdLastSet
“LastLogon” = $_.lastLogon
“DNSHostName” = $_.DNSHostName
“CreationDate” = $_.WhenCreated
}
}

Conclusie

Wat hebben we hier wordt getoond is slechts het topje van de ijsberg in termen van wat het kan worden gebouwd voor een inventarisatie rapport. Er zijn veel meer nuttige eigenschappen die je kunt toevoegen aan dit rapport. Het nemen van dit meer, je kon bouwen in een HTML-pagina, een taak uitvoeren wekelijks, of zelfs wikkel deze in andere programma ‘ s zoals Ansible.

PowerShell maakt het kinderlijk eenvoudig om alle informatie die u nodig hebt om samen op één plek. Zodra je analyseert je omgeving en bepalen wat u moet weten, het bouwen van het rapport in PowerShell om te helpen de toekomst van uw vermogen om te controleren uw omgeving.


Posted

in

by

Tags: