Benutzer mit den meisten Antworten
Unterstützung bei "Hard- und Softwareinformationen in HTML-Report ausgeben"

Frage
-
Guten Morgen,
ich habe mir vor 2 Tagen das erste Mal die Powershell und WQL-Abfragen angeschaut und mich entschlossen ein kleines Script zu bauen, welches Hard- und Softwareinformationen von einem Computer ausliest und in ein HTML-Dokument ausgibt.
Nun habe ich das Problem, dass die erzeugte HTML-Datei gut aussieht, wenn ich den Code kopiere, anschließend in die Powershell einfüge und ausführe. Jedoch nicht wenn ich die Datei (Info.ps1) über die Powershell direkt aufrufe.
Hier wird das $props der Funktion Get-CSInfo nicht dargestellt. Stattdessen erscheint hier ein zweites mal die Ausgabe der Prozessoren, jedoch ohne Werte.
Züsätzlich würde ich mit der Funktion Get-CSInfo noch gerne die IPv4-Adresse ausgeben.
Für einen guten Rat wäre ich sehr dankbar.
Hier mal der Code:
$computername = $env:computername
$currentuser = Get-ItemProperty -path "HKCU:\Volatile Environment\"
function Get-CSInfo {
param($computername,$currentuser)
$os = Get-WmiObject -Class Win32_OperatingSystem
$startzeit = Get-WmiObject -Class Win32_OperatingSystem
$props = @{
"OS Version" = $os.version
"Current User" = $currentuser.username
"Startzeit" = $startzeit.converttodatetime($startzeit.lastbootuptime)#Hier soll zusätzlich die IP ermittelt werden
}
$obj = New-Object -TypeName PSObject -Property $props
Write-Output $obj
}
$allginfo = Get-CSInfo –computername $computername -currentuser $currentuser | ConvertTo-Html -As LIST -Fragment -PreContent "<h2>Computer Info</h2>" | Out-String
$prozessorinfo = Get-WmiObject win32_processor –computername $computername | Select Name,@{Name="Anzahl der Kerne";Expression ={$_.NumberOfCores}},@{Name="Auslastung in Prozent";Expression ={$_.LoadPercentage}} | ConvertTo-Html -Fragment -PreContent "<h2>Prozessor</h2>" | Out-String
$grafikkarteninfo = get-wmiobject -class Win32_VideoController -Computername $computername | Select Name, DriverVersion, Status | ConvertTo-Html -Fragment -PreContent "<h2>Grafikkarten</h2>" | Out-String
$arbeitsspeicherinfo = Get-WmiObject -ComputerName $ComputerName -Class Win32_operatingsystem | select @{Name="Gesamt (Gbyte)";Expression ={"{0:N1}" -f ($_.TotalVisibleMemorySize/1mb)}},@{Name="davon frei (Gbyte)";Expression ={"{0:N1}" -f ($_.FreePhysicalMemory/1mb)}} | ConvertTo-Html -Fragment -PreContent "<h2>Arbeitsspeicher</h2>" | Out-String
$festplatteninfo = get-wmiobject -class win32_logicaldisk -ComputerName $computername -filter "drivetype=3" | select @{Name="Laufwerk";Expression ={$_.DeviceID}},@{Name="Gesamt (Gbyte)";Expression ={"{0:N1}" -f ($_.Size/1gb)}},@{Name="davon frei (Gbyte)";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}} | ConvertTo-Html -Fragment -PreContent "<h2>Festplatten</h2>" | Out-String
$systemvariablen = Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\" | ConvertTo-Html -As LIST -Fragment -PreContent "<h2>Systemvariablen</h2>" | Out-String
$benutzervariablen = Get-ItemProperty -path "HKCU:\Volatile Environment\" | ConvertTo-Html -As LIST -Fragment -PreContent "<h2>Benutzervariablen</h2>" | Out-String
$softwareinfo = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.DisplayName -ne $Null -and $_.DisplayVersion -ne $Null } | Select-Object DisplayName, DisplayVersion | Sort-Object DisplayName | ConvertTo-Html -Fragment -PreContent "<h2>Installierte Software</h2>" | Out-String
$head = @"
<style>
body { background-color:#dddddd;
font-family:Tahoma;
font-size:12pt; }
td, th { border:1px solid black;
border-collapse:collapse; }
th { color:white;
background-color:black; }
table, tr, td, th { padding: 2px; margin: 0px }
table { margin-left:50px; }
</style>
"@
ConvertTo-HTML -head $head -PostContent $allginfo,$prozessorinfo,$grafikkarteninfo,$arbeitsspeicherinfo,$festplatteninfo,$softwareinfo,$systemvariablen,$benutzervariablen -PreContent "<h1> $computername </h1>" | Out-File -FilePath D:\Test\$Computername.html
#Invoke-Expression D:\Test\$Computername.htmlMit freundlichen Grüßen
Christopher
Antworten
-
So .... ich hab mal ein bissl gebastelt ... bei mir läuft es so:
$OutputPath = 'D:\test' $computername = $env:computername $currentuser = Get-ItemProperty -path 'HKCU:\Volatile Environment' $os = Get-CimInstance -ClassName Cim_OperatingSystem $BasisInfo = [Ordered]@{ 'OS Name' = $os.Caption 'OS Version' = $os.version 'Startzeit' = $os.lastbootuptime 'Current User' = $currentuser.username 'IPv4-Adresse' = (test-connection $env:computername -count 1).IPV4Address.IPAddressToString } $allginfo = $BasisInfo.GetEnumerator() | Select-Object -Property Name,Value | ConvertTo-Html -Fragment -PreContent '<h2>Computer Info</h2>' | Out-String $prozessorinfo = Get-WmiObject win32_processor -ComputerName $computername | Select-Object Name,@{Name='Anzahl der Kerne';Expression ={$_.NumberOfCores}},@{Name='Auslastung in Prozent';Expression ={$_.LoadPercentage}} | ConvertTo-Html -Fragment -PreContent '<h2>Prozessor</h2>' | Out-String $grafikkarteninfo = get-wmiobject -class Win32_VideoController -Computername $computername | Select-Object Name, DriverVersion, Status | ConvertTo-Html -Fragment -PreContent '<h2>Grafikkarten</h2>' | Out-String $arbeitsspeicherinfo = $os| Select-Object @{Name='Gesamt (Gbyte)';Expression ={'{0:N1}' -f ($_.TotalVisibleMemorySize/1mb)}},@{Name='davon frei (Gbyte)';Expression ={'{0:N1}' -f ($_.FreePhysicalMemory/1mb)}} | ConvertTo-Html -Fragment -PreContent '<h2>Arbeitsspeicher</h2>' | Out-String $festplatteninfo = get-wmiobject -class win32_logicaldisk -ComputerName $computername -filter 'drivetype=3' | Select-Object @{Name='Laufwerk';Expression ={$_.DeviceID}},@{Name='Gesamt (Gbyte)';Expression ={'{0:N1}' -f ($_.Size/1gb)}},@{Name='davon frei (Gbyte)';Expression={'{0:N1}' -f ($_.FreeSpace/1gb)}} | ConvertTo-Html -Fragment -PreContent '<h2>Festplatten</h2>' | Out-String $systemvariablen = Get-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' | ConvertTo-Html -As LIST -Fragment -PreContent '<h2>Systemvariablen</h2>' | Out-String $benutzervariablen = $currentuser | ConvertTo-Html -As LIST -Fragment -PreContent '<h2>Benutzervariablen</h2>' | Out-String $softwareinfo = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' | Where-Object { $_.DisplayName -ne $Null -and $_.DisplayVersion -ne $Null } | Select-Object DisplayName, DisplayVersion | Sort-Object DisplayName | ConvertTo-Html -Fragment -PreContent '<h2>Installierte Software</h2>' | Out-String $head = @' <style> body { background-color:#dddddd; font-family:Tahoma; font-size:12pt; } td, th { border:1px solid black; border-collapse:collapse; } th { color:white; background-color:black; } table, tr, td, th { padding: 2px; margin: 0px } table { margin-left:50px; } </style> '@ $OutFile = Join-Path -Path $OutputPath -ChildPath ($Computername + '.html') ConvertTo-HTML -head $head -PostContent $allginfo,$prozessorinfo,$grafikkarteninfo,$arbeitsspeicherinfo,$festplatteninfo,$softwareinfo,$systemvariablen,$benutzervariablen -PreContent "<h1> $computername </h1>" | Out-File -FilePath $OutFile Invoke-Expression $OutFile
Noch'n Tipp:
Wenn Du per Get-WMIObject schon Infos einsammelst und das Ergebnis einer Variable zuweist, genügt es wenn Du das einmal machst. Wenn Du die Daten beim nächsten Mal brauchst, kannst Du die Variable nehmen. Das beschleunigt Deinen Code auch etwas. (z.B. In Deinem Code $os und $Startzeit haben den gleichen Inhalt)Edit: ... noch vergesen: Ich habe für die OS-Geschichte mal Get-CIMInstance benutzt, statt Get-WMIObject. Damit ist die LastBootUptIme-Geschichte einfacher
Noch ein bissl schneller könnte der Code auch sein, wenn Du alle WMI-Abfragen auf CIM umstellst und am Anfang eine CIM-Session öffnest und dann alle Abfragen darüber durchführst. Das ist vielleicht bei einem lokal laufenden Script nicht soo wichtig, aber wenn Du es "remote-fähig" machst, merkt man den Unterschied schon
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Samstag, 15. April 2017 11:22
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 17. April 2017 11:31
- Als Antwort markiert zlim1986 Mittwoch, 19. April 2017 17:28
Alle Antworten
-
So .... ich hab mal ein bissl gebastelt ... bei mir läuft es so:
$OutputPath = 'D:\test' $computername = $env:computername $currentuser = Get-ItemProperty -path 'HKCU:\Volatile Environment' $os = Get-CimInstance -ClassName Cim_OperatingSystem $BasisInfo = [Ordered]@{ 'OS Name' = $os.Caption 'OS Version' = $os.version 'Startzeit' = $os.lastbootuptime 'Current User' = $currentuser.username 'IPv4-Adresse' = (test-connection $env:computername -count 1).IPV4Address.IPAddressToString } $allginfo = $BasisInfo.GetEnumerator() | Select-Object -Property Name,Value | ConvertTo-Html -Fragment -PreContent '<h2>Computer Info</h2>' | Out-String $prozessorinfo = Get-WmiObject win32_processor -ComputerName $computername | Select-Object Name,@{Name='Anzahl der Kerne';Expression ={$_.NumberOfCores}},@{Name='Auslastung in Prozent';Expression ={$_.LoadPercentage}} | ConvertTo-Html -Fragment -PreContent '<h2>Prozessor</h2>' | Out-String $grafikkarteninfo = get-wmiobject -class Win32_VideoController -Computername $computername | Select-Object Name, DriverVersion, Status | ConvertTo-Html -Fragment -PreContent '<h2>Grafikkarten</h2>' | Out-String $arbeitsspeicherinfo = $os| Select-Object @{Name='Gesamt (Gbyte)';Expression ={'{0:N1}' -f ($_.TotalVisibleMemorySize/1mb)}},@{Name='davon frei (Gbyte)';Expression ={'{0:N1}' -f ($_.FreePhysicalMemory/1mb)}} | ConvertTo-Html -Fragment -PreContent '<h2>Arbeitsspeicher</h2>' | Out-String $festplatteninfo = get-wmiobject -class win32_logicaldisk -ComputerName $computername -filter 'drivetype=3' | Select-Object @{Name='Laufwerk';Expression ={$_.DeviceID}},@{Name='Gesamt (Gbyte)';Expression ={'{0:N1}' -f ($_.Size/1gb)}},@{Name='davon frei (Gbyte)';Expression={'{0:N1}' -f ($_.FreeSpace/1gb)}} | ConvertTo-Html -Fragment -PreContent '<h2>Festplatten</h2>' | Out-String $systemvariablen = Get-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' | ConvertTo-Html -As LIST -Fragment -PreContent '<h2>Systemvariablen</h2>' | Out-String $benutzervariablen = $currentuser | ConvertTo-Html -As LIST -Fragment -PreContent '<h2>Benutzervariablen</h2>' | Out-String $softwareinfo = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' | Where-Object { $_.DisplayName -ne $Null -and $_.DisplayVersion -ne $Null } | Select-Object DisplayName, DisplayVersion | Sort-Object DisplayName | ConvertTo-Html -Fragment -PreContent '<h2>Installierte Software</h2>' | Out-String $head = @' <style> body { background-color:#dddddd; font-family:Tahoma; font-size:12pt; } td, th { border:1px solid black; border-collapse:collapse; } th { color:white; background-color:black; } table, tr, td, th { padding: 2px; margin: 0px } table { margin-left:50px; } </style> '@ $OutFile = Join-Path -Path $OutputPath -ChildPath ($Computername + '.html') ConvertTo-HTML -head $head -PostContent $allginfo,$prozessorinfo,$grafikkarteninfo,$arbeitsspeicherinfo,$festplatteninfo,$softwareinfo,$systemvariablen,$benutzervariablen -PreContent "<h1> $computername </h1>" | Out-File -FilePath $OutFile Invoke-Expression $OutFile
Noch'n Tipp:
Wenn Du per Get-WMIObject schon Infos einsammelst und das Ergebnis einer Variable zuweist, genügt es wenn Du das einmal machst. Wenn Du die Daten beim nächsten Mal brauchst, kannst Du die Variable nehmen. Das beschleunigt Deinen Code auch etwas. (z.B. In Deinem Code $os und $Startzeit haben den gleichen Inhalt)Edit: ... noch vergesen: Ich habe für die OS-Geschichte mal Get-CIMInstance benutzt, statt Get-WMIObject. Damit ist die LastBootUptIme-Geschichte einfacher
Noch ein bissl schneller könnte der Code auch sein, wenn Du alle WMI-Abfragen auf CIM umstellst und am Anfang eine CIM-Session öffnest und dann alle Abfragen darüber durchführst. Das ist vielleicht bei einem lokal laufenden Script nicht soo wichtig, aber wenn Du es "remote-fähig" machst, merkt man den Unterschied schon
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Samstag, 15. April 2017 11:22
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 17. April 2017 11:31
- Als Antwort markiert zlim1986 Mittwoch, 19. April 2017 17:28
-
Sorry, dass ich die Funktion nicht genutzt hab, jedoch vielen Dank für deine Hilfe! Läuft einwandfrei und ich werde auch deinen Rat mit dem CIM beherzigen, da es letztendlich nur über remote genutzt werden soll.
Also nochmal vielen Dank für deine Unterstützung.
Mit freundlichem Gruß
Christopher