none
Unterstützung bei "Hard- und Softwareinformationen in HTML-Report ausgeben" RRS feed

  • 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.html

    Mit freundlichen Grüßen

    Christopher

    Samstag, 15. April 2017 09:02

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''




    Samstag, 15. April 2017 11:12

Alle Antworten

  • Kannst Du zum Posten von Code mal bitte die entsprechende Formatierungs-Option benutzen? So ist der Code quasi nicht lesbar, da die Zeilen automatisch umgebrochen werden.

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Samstag, 15. April 2017 09:49
  • 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''




    Samstag, 15. April 2017 11:12
  • 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

    Sonntag, 16. April 2017 00:03