An dieser Stelle das vollständige Skript, wie es sich im Einsatz bewährt hat. Nicht alle Befehlssequenzen und Abläufe mögen optimal sein, da dieses historisch gewachsen ist, mit der einen oder anderen Anleihe aus Fundstellen im Internet.
Dieses Skript wird beim Herunterfahren des Rechners über entsprechende Gruppenrichtlinien im Active Directory ausgeführt.
Falls das Skript unter Windows 10 beim Herunterfahren nicht ausgeführt wird, muss der Schnellstart deaktiviert werden.
Auf die Freigabe für die Logdateien brauchen die Domänenrechner Schreibzugriff, ebenso jener Anwender, der die Auswertung ggf. manuell im weiteren Verlauf vornimmt. PowerShell-Scripting auf den PCs muss aktiviert sein, ggf. sollte das Skript nach Anpassung an die eigene Umgebung signiert werden.
Variablen und Einträge, die angepasst werden müssen:
$strRelevantGroups - sollte die jeweilige primäre Gruppe der Benutzer beinhalten, um die logischen PC-Zuweisungen auswerten zu können
$logfile - muss auf eine beschreibbare Freigabe verweisen
Der Name der Datei wird mittels des Computernamens gebildet (und selbige überschrieben), das Dateidatum hilft dabei, den letzten erfolgreichen Vorgang direkt im Dateisystem zu erkennen.
#PC-Information sammeln
Function Get-FreeDiskSpace($drive)
{
$driveData = Get-WmiObject -class win32_LogicalDisk -filter "Name = '$drive'"
"{0:n2}" -f ($driveData.FreeSpace/1GB)# + " GB"
}
$ErrorActionPreference = 'SilentlyContinue'
$strCompName = ($env:Computername)
$CompNameLength = ($env:Computername).length
$logfile = "\\server\assetLog$\Computer\$strCompName.csv"
#Benutzerinfos des letzten angemeldeten Benutzers ermitteln und Variablen zuweisen
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.SearchScope = "Subtree"
$objSearcher.Filter = "(&(objectClass=computer)(cn=$strCompName))"
$system = $objSearcher.FindOne()
$dn = $system.properties["distinguishedname"]
$dn = $dn[0].toString()
$ou = $dn.substring(4+$CompNameLength)
$lastuser = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI).LastLoggedOnSAMUser
$lastuser = $lastuser.split("\")
$lastuser = $lastuser[1]
$objSearcher.Filter = "(&(objectClass=user)(cn=$lastuser))"
$userinfo = $objSearcher.FindOne()
$userdn = [adsi]$userinfo.path
$username = $userdn.displayname
$lastuser = $lastuser + " (" + $username + ")"
$strRelevantGroups = "Domain Users" #durch kommaseparierte reale Benutzergruppen ersetzen!
$groups = $userdn.memberof
$strGroups = ""
foreach($group in $groups)
{
$strGroup = $group.split(',')[0]
$strGroup = $strGroup.split('=')[1]
if($strRelevantGroups.contains($strGroup))
{
$strGroups = $strGroups + "," + $strGroup
}
}
if($strGroups.Length -gt 0){
$strGroups = $strGroups.split(",")
$team = [string]$strGroups[1]
} else {
$team = "N/A"
}
#Seriennummer des PCs auslesen
$computer = gwmi win32_computersystem
$bios = gwmi win32_bios
$os = (gwmi win32_operatingsystem).caption
$serial = $bios.serialnumber
#Prozessoren ermitteln
$colCPUs = gwmi win32_processor
$n = 0
foreach ($cpu in $colCPUs)
{
$n = $n + 1
$processor = ((($cpu.name -replace ' {2,}',' ') -replace "\(TM\)") -replace '\(R\)')
}
$cpuspeed = "{0:0.00 GHz}" -f($cpu.maxclockspeed/1000)
#Größe des physischen Arbeitsspeichers ermitteln
$totalmem = 0
$memsticks = gwmi -Class win32_physicalmemory
foreach ($stick in $memsticks) { $totalmem += $stick.capacity }
$physmem = ([int] ($($totalmem) / 1MB))
#Größe der Datenträger ermitteln
$disk = gwmi win32_diskdrive -filter "InterfaceType <> 'USB'"
$disksize=""
foreach ($objitem in $disk) {$disksize=$disksize+";"+[Convert]::ToString(([int]($objitem.size/1000000000)))}
$disksize = $disksize.substring(1)
$diskfree = ""
$diskfree = Get-FreeDiskSpace -drive "C:"
#Ermitteln der IP-Adresse(n)
# new (Test): $ip = Get-WmiObject Win32_NetworkAdapterConfiguration -filter 'IPEnabled="True"' | Select -expand IPAddress | ?{$_ -notmatch ':'}
$lan = get-wmiobject win32_networkadapterconfiguration -filter "ipenabled=true"
$lancount = get-wmiobject win32_networkadapterconfiguration -filter "ipenabled=true"
$ip=""
foreach($lan in $lancount){$ip = $ip + ";" + [string]($lan.ipaddress[0])}
$ip = $ip.substring(1)
#Erzeugen der Logdatei mit Zeitstempel im Logeintrag
$timestamp = get-date -format "M/d/yyyy HH:mm"
#Testausgabe am Bildschirm
#write-host $computer.name $computer.model $serial $processor $cpuspeed $physmem $disksize $os $ip $ou $lastuser $team $timestamp $diskfree -separator ";"
#Zusammenfassung für CSV-tauglichen String, separiert mit Tabulatoren
$allinfo=[string]$computer.name+"`t"+[string]$computer.model+"`t"+[string]$serial+"`t"+[string]$processor+"`t"+[string]$cpuspeed+"`t"+[string]$physmem+"`t"+[string]$disksize+"`t"+[string]$os+"`t"+[string]$ip+"`t"+[string]$ou+"`t"+[string]$lastuser+"`t"+$team+"`t"+[string]$timestamp+"`t Inventory Script`t1"+"`t"+[string]$diskfree
#Ausgabe in Logdatei
write-output $allinfo | format-table | out-file $logfile -encoding ASCII
#Informationen zu angeschlossenen Monitoren sammeln (ab Windows 7/2008R2)
try {
$ActiveMonitors = Get-WmiObject -Namespace root\wmi -Class wmiMonitorID
}
catch {
break
$computer.name
}
$monitorInfo = @()
$pcserial = $serial
$i = 1
foreach ($monitor in $ActiveMonitors)
{
$mon = New-Object PSObject
$manufacturer = $null
$dspserial = $null
$name = $null
$week = $null
$year = $null
$monitor.ManufacturerName | foreach {$manufacturer += [char]$_}
$monitor.SerialNumberID | foreach {$dspserial += [char]$_}
$monitor.UserFriendlyName | foreach {$name += [char]$_}
$mon | Add-Member NoteProperty Manufacturer $manufacturer
$mon | Add-Member NoteProperty PCSerial $serial
$mon | Add-Member NoteProperty SerialNumber $dspserial
$mon | Add-Member NoteProperty Name $name
$mon | Add-Member NoteProperty Week $monitor.WeekOfManufacture
$mon | Add-Member NoteProperty Year $monitor.YearOfManufacture
$mon.SerialNumber = $dspserial.trim()
$monitorInfo += $mon
#Erzeugen eines Strings für Datei, Name wird aus DSP und Computername erzeugt, um die relevante Datei schnell im Dateisystem zu finden
$displayinfo = [string]$name+"`t"+[string]$dspserial+"`t"+$pcserial+"`t"+[string]$timestamp+"`t Inventory Script`t1"
$dsplogfile = "DSP" + $i + "_" + $computer.name
$dsplogfile = "\\server\assetLog$\Monitor\$dsplogfile.csv"
$i++
$displayinfo | format-table | out-file $dsplogfile -encoding ASCII
}
Samstag, 24. September 2016
PowerShell: PC-Hardware inventarisieren: 6. Skript und Hinweise
Trackbacks
Trackback-URL für diesen Eintrag
Keine Trackbacks