none
Probleme bei dem Versand der Ergebnissen einer Inventarisierung RRS feed

  • Frage

  • Hallo Skripter,

    in einem Skript zur Inventarisierung von dem PC und den angeschlossenen Monitoren gibt es Probleme bei dem Versand der Ergebnisse per E-Mail.

    Die Monitordaten werden in einem Array gespeichert, da möglicherweise mehrere angeschlossen werden können. Habe dann versucht diese Array auch im E-Mailbody zu schreiben aber es kommt nur die erste Seriennummer vor und der Rest bleibt leer.

    Wenn diese Arrays auf der Console ausgegeben werden funktioniert es ohne Probleme und alles wird so angezeigt wie es sollte.

    Habe dann versucht die Arrays in Strings umzuwandeln und diese anzuzeigen, aber es ändert nichts am Ergebnis.

    #########################################
    ###Inventarisierung für Win 10 Rechner###
    #########################################
    
    # Informationen über den Computer auslesen #
    ############################################
    
    #Auslesen der Mac-Addresse
    [String] $MacAddress_Computer = (Get-NetAdapter).MacAddress
    
    #Auslesen des Computernamens
    [String] $Name_Computer = $env:COMPUTERNAME
    
    $ComputerInfo = (Get-ComputerInfo)
        #Auslesen des Prozessors
        [String] $Prozessor_Computer = ($ComputerInfo).CsProcessors.Name
        #Auslesen des Herstellers
        [String] $Hersteller_Computer = ($ComputerInfo).CsManufacturer
        #Auslesen des Models
        [String] $Model_Computer = ($ComputerInfo).CsModel
        #Auslesen des Betriebssystems
        [String] $Betriebssystem_Computer = ($ComputerInfo).OsName
        #Auslesen der Seriennummer
        [String] $Seriennummer_Computer = Get-WmiObject -Class Win32_BIOS -ComputerName $Name_Computer
    
    
    #  Informationen über die angeschlossenen Monitore auslesen #
    #############################################################
    
    #Auslesen der Seriennummer(n)
    [array] $Seriennummer_Monitor = Get-WmiObject WmiMonitorId -Namespace root\wmi|ForEach-Object{($_.SerialnumberID|ForEach-Object{[char]$_}) -join ""}
    
    #Auslesen der Product ID(s)
    [array] $ProduktID_Monitor = Get-WmiObject WmiMonitorId -ComputerName $Name_Computer -Namespace root\wmi|ForEach-Object{($_.ProductCodeID|ForEach-Object{[char]$_}) -join ""}
    
    #Auslesen des Herstellers
    [array] $Hersteller_Monitor = Get-WmiObject WmiMonitorId -ComputerName $Name_Computer -Namespace root\wmi|ForEach-Object{($_.ManufacturerName|ForEach-Object{[char]$_}) -join ""}
    
    #Auslesen des Produktionsjahres
    [array] $Produktionsjahr_Monitor = (Get-WmiObject WmiMonitorId -ComputerName $Name_Computer -Namespace root\wmi).YearOfManufacture
    
    #Auslesen des Angeschlossenen Computers
    [array] $Computername_Monitor = (Get-WmiObject WmiMonitorId -ComputerName $Name_Computer -Namespace root\wmi).PSComputerName
    
    #Auslesen der Anzahl an Monitoren
    [int16] $anzahl = $Seriennummer_Monitor.Count
    
    
    
    
    #Ergebnise aufbereiten für den E-Mailversand
    [String] $SN_M0 = ($Seriennummer_Monitor[0]).ToString()
    [String] $PN_M0=($ProduktID_Monitor[0]).ToString()
    [String] $H_M0=($Hersteller_Monitor[0]).ToString()
    [String] $Pj_M0=($Produktionsjahr_Monitor[0]).ToString()
    [String] $Cn_M0=($Computername_Monitor[0]).ToString()
    
    [String] $SN_M1=($Seriennummer_Monitor[1]).ToString()
    [String] $PN_M1=($ProduktID_Monitor[1]).ToString()
    [String] $H_M1=($Hersteller_Monitor[1]).ToString()
    [String] $Pj_M1=($Produktionsjahr_Monitor[1]).ToString()
    [String] $Cn_M1=($Computername_Monitor[1]).ToString()
    
    #Emailversand
    $PSEmailServer = "******"
    
    
    Send-MailMessage -to "test@test.de" -from "Powershell <Test@test.de>" -Subject "Inventarisierung" -Encoding UTF8 -Body "
    PC:
    MAC-Addresse: $MacAddress_Computer      
    Hostname: $Name_Computer                
    Prozessor: $Prozessor_Computer         
    Hersteller: $Hersteller_Computer        
    Model: $Model_Computer                 
    OS: $Betriebssystem_Computer          
    
    
    Monitore angeschlossen: $anzahl Stk. 
    
    Seriennummer: 1. $SN_M0 
                  2. $SN_M1 
    Produktnummer: 1. $PN_M0 
                   2. $PN_M1 
    Hersteller: 1. $H_M0 
                2. $H_M1 
    Produktionsjahr: 1. $Pj_M0 
                     2. $Pj_M1 
    Hostname des angeschlossenen PCs: 1. $Cn_M0 
                                      2. $Cn_M1 
    
    " 
    
    
    
    

    Der E-Mailtext sieht wie folgt aus:

    "

    PC:

    MAC-Adresse: MAC-Adresse

    Hostname: Host

    Prozessor: Prozessor

    Hersteller: Hersteller

    Model: Model

    OS: OS

    Monitor(e):

    Seriennummer: 1. Seriennummer

    "

    Mit freundlichen Grüßen

    Dominik Hartl

    Donnerstag, 14. März 2019 15:14

Antworten

  • Wow! ...  ;-)  ... ich hatte da vor ner ganzen Weile mal etwas zusammengebastelt, was in eine ähnliche Richtung geht ... vielleicht kannst Du damit ja was anfangen ... Dein Code müsste ziemlich "lange" laufen, oder? Get-ComputerInfo sammelt so viel meist unnütze Informationen ein, dass es meistens besser ist, sich die Sachen mittels CIM einzeln zusammen zu suchen.

    Also hier schon mal der Anfang ... das Ergebnis kann man in einer Variablen speichern, die man dann mit evtl. weiteren Informationen an Send-Mailmessage verfüttert.

    <#
    .SYNOPSIS
    
    Get-PCInfo [[-ComputerName] <Object>]
    
    .DESCRIPTION
    
    .PARAMETER ComputerName
      
    #>
    function Get-WMIPCInfo {
        [CmdletBinding()]
        param(
            $ComputerName = $ENV:ComputerName
        )
        if (Test-Connection $ComputerName -Quiet -Count 1) {
            Write-Debug -Message "$ComputerName reachable"
            $so = New-CimSessionOption -Protocol DCOM 
            $WMIData = New-CimSession -CN $ComputerName -SessionOption $so
            $BIOS = Get-CimInstance -Class CIM_BIOSElement -CimSession $WMIData | Select-Object -Property *
            $OS = Get-CimInstance -Class CIM_OperatingSystem -CimSession $WMIData | Select-Object -Property *
            $ServiceBranch = (([wmiclass]"\\$($ComputerName)\root\default:stdRegProv").GetStringValue(2147483650, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ReleaseID')).svalue
            $DISK = Get-CimInstance -Class CIM_LogicalDisk -CimSession $WMIData | Where-Object {$_.DeviceID -eq "C:"} | Select-Object -Property *
            $Computer = Get-CimInstance -Class CIM_ComputerSystem -CimSession $WMIData | Select-Object -Property *
            $IPConfig = Get-CimInstance -Class Win32_NetworkAdapterConfiguration -CimSession $WMIData | Where-Object {$_.DefaultIPGateway -match "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}"}  | Select-Object -Property *
            $UserQuery = ( C:\Windows\System32\quser.exe /server:$ComputerName 2> null)
            if ($UserQuery) {
                $UserQuery[1].Trim() -match "^(\S+)\s+.*((\d{2}\.){2}\d{4}\s+\d{2}:\d{2})" | Out-Null
                $LoggedOnUser = $Matches[1]
                $LogonTime = Get-Date -Date $Matches[2]
            }
            Remove-CimSession $WMIData
            Write-Debug -Message "`$BIOS: $BIOS"
            Write-Debug -Message "`$OS:  $OS"
            Write-Debug -Message "`$DISK:  $DISK"
            Write-Debug -Message "`$Computer:  $Computer"
            Write-Debug -Message "`$IPConfig:  $IPConfig"
            Write-Debug -Message "`$LoggedOnUser:  $LoggedOnUser"
            $CIMOutput = [PSCustomObject]@{
                ComputerName   = $BIOS.PSComputerName;
                Model          = $Computer.Model;
                BIOSName       = $BIOS.Name;
                SMBIOSVersion  = $BIOS.SMBIOSBIOSVersion;
                BIOSVersion    = $BIOS.BIOSVersion;
                ReleaseDate    = $BIOS.ReleaseDate;
                SerialNumber   = $BIOS.SerialNumber;
                OSCaption      = $OS.Caption;
                OSVersion      = $OS.Version;
                ServiceBranch  = $ServiceBranch;
                InstallDate    = $OS.InstallDate;
                LastBootUpTime = $OS.LastBootUpTime;
                PhysicalRAM    = [math]::round((($Computer.TotalPhysicalMemory) / 1GB), 2);
                DiskSize       = [math]::round(($DISK.Size / 1GB), 2);
                DiskFreeSpace  = [math]::round(($DISK.FreeSpace / 1GB), 2);
                IPV4Address    = $IPConfig.IPAddress[0];
                DefaultGateway = $IPConfig.DefaultIPGateway[0];
                DNSDomain      = $IPConfig.DNSDomain;
                DHCPEnabled    = $IPConfig.DHCPEnabled;
                LoggedOnUser   = $LoggedOnUser
                LogonTime      = $LogonTime
            }
            $CIMOutput
        }
        else {
            Write-Host "`tDer Rechner '$($ComputerName)' ist nicht erreichbar`n" -ForegroundColor Yellow
        }
    }

    Die Funktion gibt, ohne weiteren Parameter die lokalen Informationen aus, mit -ComputerName läuft sie remote.  ... und vermutlich etwas schneller als Dein Code ... vielleicht probierst Du's mal ... ich guck mir jetzt mal Deinen "Monitor-Code" an ...

    Edit 1:

    So ... es ist ziemlich ineffizient, die gleichen Daten mehrfach abzufragen. Besser ist es die Abgefragten Daten in einer Variablen zu speichern und damit weiterzuarbeiten. Das auf Deine Monitor-Abfrage angewendet könnte dann so aussehen ...

    $MonitorListe = Get-WmiObject WmiMonitorId -Namespace root\wmi | 
        ForEach-Object {
            [PSCUstomObject]@{
                Seriennummer = ($_.SerialnumberID|ForEach-Object {[char]$_}) -join ""
                ProduktID = ($_.ProductCodeID|ForEach-Object {[char]$_}) -join ""
                Manufacturer = ($_.ManufacturerName|ForEach-Object {[char]$_}) -join ""
                YearOfManufacture = $_.YearOfManufacture
            }
        }

    So ...  jetzt der Teil mit dem Mailversand ... komme gleich ... ;-)

    Edit 2:

    So ... das Ganze jetzt quick 'n dirty mit dem Mailversand zusammengeklöppelt kommt dann das hier raus:

    [CmdletBinding()]
    param(
        $ComputerName = $ENV:ComputerName
    )
    
    <#
    .SYNOPSIS
    
    Get-PCInfo [[-ComputerName] <Object>]
    
    .DESCRIPTION
    
    .PARAMETER ComputerName
      
    #>
    function Get-WMIPCInfo {
        [CmdletBinding()]
        param(
            $ComputerName = $ENV:ComputerName
        )
        if (Test-Connection $ComputerName -Quiet -Count 1) {
            Write-Debug -Message "$ComputerName reachable"
            $so = New-CimSessionOption -Protocol DCOM 
            $WMIData = New-CimSession -CN $ComputerName -SessionOption $so
            $BIOS = Get-CimInstance -Class CIM_BIOSElement -CimSession $WMIData | Select-Object -Property *
            $OS = Get-CimInstance -Class CIM_OperatingSystem -CimSession $WMIData | Select-Object -Property *
            $ServiceBranch = (([wmiclass]"\\$($ComputerName)\root\default:stdRegProv").GetStringValue(2147483650, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ReleaseID')).svalue
            $DISK = Get-CimInstance -Class CIM_LogicalDisk -CimSession $WMIData | Where-Object {$_.DeviceID -eq "C:"} | Select-Object -Property *
            $Computer = Get-CimInstance -Class CIM_ComputerSystem -CimSession $WMIData | Select-Object -Property *
            $IPConfig = Get-CimInstance -Class Win32_NetworkAdapterConfiguration -CimSession $WMIData | Where-Object {$_.DefaultIPGateway -match "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}"}  | Select-Object -Property *
            $UserQuery = ( C:\Windows\System32\quser.exe /server:$ComputerName 2> null)
            if ($UserQuery) {
                $UserQuery[1].Trim() -match "^(\S+)\s+.*((\d{2}\.){2}\d{4}\s+\d{2}:\d{2})" | Out-Null
                $LoggedOnUser = $Matches[1]
                $LogonTime = Get-Date -Date $Matches[2]
            }
            Remove-CimSession $WMIData
            Write-Debug -Message "`$BIOS: $BIOS"
            Write-Debug -Message "`$OS:  $OS"
            Write-Debug -Message "`$DISK:  $DISK"
            Write-Debug -Message "`$Computer:  $Computer"
            Write-Debug -Message "`$IPConfig:  $IPConfig"
            Write-Debug -Message "`$LoggedOnUser:  $LoggedOnUser"
            $CIMOutput = [PSCustomObject]@{
                ComputerName   = $BIOS.PSComputerName;
                Model          = $Computer.Model;
                BIOSName       = $BIOS.Name;
                SMBIOSVersion  = $BIOS.SMBIOSBIOSVersion;
                BIOSVersion    = $BIOS.BIOSVersion;
                ReleaseDate    = $BIOS.ReleaseDate;
                SerialNumber   = $BIOS.SerialNumber;
                OSCaption      = $OS.Caption;
                OSVersion      = $OS.Version;
                ServiceBranch  = $ServiceBranch;
                InstallDate    = $OS.InstallDate;
                LastBootUpTime = $OS.LastBootUpTime;
                PhysicalRAM    = [math]::round((($Computer.TotalPhysicalMemory) / 1GB), 2);
                DiskSize       = [math]::round(($DISK.Size / 1GB), 2);
                DiskFreeSpace  = [math]::round(($DISK.FreeSpace / 1GB), 2);
                IPV4Address    = $IPConfig.IPAddress[0];
                DefaultGateway = $IPConfig.DefaultIPGateway[0];
                DNSDomain      = $IPConfig.DNSDomain;
                DHCPEnabled    = $IPConfig.DHCPEnabled;
                LoggedOnUser   = $LoggedOnUser
                LogonTime      = $LogonTime
            }
            $CIMOutput
        }
        else {
            Write-Host "`tDer Rechner '$($ComputerName)' ist nicht erreichbar`n" -ForegroundColor Yellow
        }
    }
    
    
    $PCDaten = Get-WMIPCInfo -ComputerName $ComputerName
    
    $MonitorListe = Get-CimInstance WmiMonitorId -ComputerName $ComputerName -Namespace root\wmi | 
    ForEach-Object {
        [PSCUstomObject]@{
            Seriennummer = ($_.SerialnumberID|ForEach-Object {[char]$_}) -join ""
            ProduktID = ($_.ProductCodeID|ForEach-Object {[char]$_}) -join ""
            Manufacturer = ($_.ManufacturerName|ForEach-Object {[char]$_}) -join ""
            YearOfManufacture = $_.YearOfManufacture
        }
    }
    
    $Body = $PCDaten + $MonitorListe
    
    $MailParam = @{
        from = 'Powershell <Test@test.de>'
        to = 'test@test.de'
        subject = 'Inventarisierung'
        Encoding = 'UTF8'
        SmtpServer = '*************'
        Body = $Body
    }
    
    Send-MailMessage @MailParam

    Noch'n Tipp zu Deinem Code : Powershell-Code ist ziemlich "deklarativ" und die cmdlets sind leicht lesbar und wenn man ihn - gerade für Scripte - so ausführlich wie möglich schreibt, ist er quasi selbst erklärend. Jeder der Powershell kennt, weiß daß Get-Process die Liste der laufenden Prozesse ausgibt. Da braucht man dann keinen Kommentar dran schreiben, der erklärt, daß man die Liste der Prozesse ausgibt.  ;-)  ... Kommentare sind nur empfehlenswert, wo sie etwas nicht sowieso offensichtliches erklären. Da ist dann also weniger mehr.

    So ... schau's Dir alles mal an und prüfe, ob Du was davon gebrauchen kannst.


    Live long and prosper!

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




    Donnerstag, 14. März 2019 15:42

Alle Antworten

  • Wow! ...  ;-)  ... ich hatte da vor ner ganzen Weile mal etwas zusammengebastelt, was in eine ähnliche Richtung geht ... vielleicht kannst Du damit ja was anfangen ... Dein Code müsste ziemlich "lange" laufen, oder? Get-ComputerInfo sammelt so viel meist unnütze Informationen ein, dass es meistens besser ist, sich die Sachen mittels CIM einzeln zusammen zu suchen.

    Also hier schon mal der Anfang ... das Ergebnis kann man in einer Variablen speichern, die man dann mit evtl. weiteren Informationen an Send-Mailmessage verfüttert.

    <#
    .SYNOPSIS
    
    Get-PCInfo [[-ComputerName] <Object>]
    
    .DESCRIPTION
    
    .PARAMETER ComputerName
      
    #>
    function Get-WMIPCInfo {
        [CmdletBinding()]
        param(
            $ComputerName = $ENV:ComputerName
        )
        if (Test-Connection $ComputerName -Quiet -Count 1) {
            Write-Debug -Message "$ComputerName reachable"
            $so = New-CimSessionOption -Protocol DCOM 
            $WMIData = New-CimSession -CN $ComputerName -SessionOption $so
            $BIOS = Get-CimInstance -Class CIM_BIOSElement -CimSession $WMIData | Select-Object -Property *
            $OS = Get-CimInstance -Class CIM_OperatingSystem -CimSession $WMIData | Select-Object -Property *
            $ServiceBranch = (([wmiclass]"\\$($ComputerName)\root\default:stdRegProv").GetStringValue(2147483650, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ReleaseID')).svalue
            $DISK = Get-CimInstance -Class CIM_LogicalDisk -CimSession $WMIData | Where-Object {$_.DeviceID -eq "C:"} | Select-Object -Property *
            $Computer = Get-CimInstance -Class CIM_ComputerSystem -CimSession $WMIData | Select-Object -Property *
            $IPConfig = Get-CimInstance -Class Win32_NetworkAdapterConfiguration -CimSession $WMIData | Where-Object {$_.DefaultIPGateway -match "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}"}  | Select-Object -Property *
            $UserQuery = ( C:\Windows\System32\quser.exe /server:$ComputerName 2> null)
            if ($UserQuery) {
                $UserQuery[1].Trim() -match "^(\S+)\s+.*((\d{2}\.){2}\d{4}\s+\d{2}:\d{2})" | Out-Null
                $LoggedOnUser = $Matches[1]
                $LogonTime = Get-Date -Date $Matches[2]
            }
            Remove-CimSession $WMIData
            Write-Debug -Message "`$BIOS: $BIOS"
            Write-Debug -Message "`$OS:  $OS"
            Write-Debug -Message "`$DISK:  $DISK"
            Write-Debug -Message "`$Computer:  $Computer"
            Write-Debug -Message "`$IPConfig:  $IPConfig"
            Write-Debug -Message "`$LoggedOnUser:  $LoggedOnUser"
            $CIMOutput = [PSCustomObject]@{
                ComputerName   = $BIOS.PSComputerName;
                Model          = $Computer.Model;
                BIOSName       = $BIOS.Name;
                SMBIOSVersion  = $BIOS.SMBIOSBIOSVersion;
                BIOSVersion    = $BIOS.BIOSVersion;
                ReleaseDate    = $BIOS.ReleaseDate;
                SerialNumber   = $BIOS.SerialNumber;
                OSCaption      = $OS.Caption;
                OSVersion      = $OS.Version;
                ServiceBranch  = $ServiceBranch;
                InstallDate    = $OS.InstallDate;
                LastBootUpTime = $OS.LastBootUpTime;
                PhysicalRAM    = [math]::round((($Computer.TotalPhysicalMemory) / 1GB), 2);
                DiskSize       = [math]::round(($DISK.Size / 1GB), 2);
                DiskFreeSpace  = [math]::round(($DISK.FreeSpace / 1GB), 2);
                IPV4Address    = $IPConfig.IPAddress[0];
                DefaultGateway = $IPConfig.DefaultIPGateway[0];
                DNSDomain      = $IPConfig.DNSDomain;
                DHCPEnabled    = $IPConfig.DHCPEnabled;
                LoggedOnUser   = $LoggedOnUser
                LogonTime      = $LogonTime
            }
            $CIMOutput
        }
        else {
            Write-Host "`tDer Rechner '$($ComputerName)' ist nicht erreichbar`n" -ForegroundColor Yellow
        }
    }

    Die Funktion gibt, ohne weiteren Parameter die lokalen Informationen aus, mit -ComputerName läuft sie remote.  ... und vermutlich etwas schneller als Dein Code ... vielleicht probierst Du's mal ... ich guck mir jetzt mal Deinen "Monitor-Code" an ...

    Edit 1:

    So ... es ist ziemlich ineffizient, die gleichen Daten mehrfach abzufragen. Besser ist es die Abgefragten Daten in einer Variablen zu speichern und damit weiterzuarbeiten. Das auf Deine Monitor-Abfrage angewendet könnte dann so aussehen ...

    $MonitorListe = Get-WmiObject WmiMonitorId -Namespace root\wmi | 
        ForEach-Object {
            [PSCUstomObject]@{
                Seriennummer = ($_.SerialnumberID|ForEach-Object {[char]$_}) -join ""
                ProduktID = ($_.ProductCodeID|ForEach-Object {[char]$_}) -join ""
                Manufacturer = ($_.ManufacturerName|ForEach-Object {[char]$_}) -join ""
                YearOfManufacture = $_.YearOfManufacture
            }
        }

    So ...  jetzt der Teil mit dem Mailversand ... komme gleich ... ;-)

    Edit 2:

    So ... das Ganze jetzt quick 'n dirty mit dem Mailversand zusammengeklöppelt kommt dann das hier raus:

    [CmdletBinding()]
    param(
        $ComputerName = $ENV:ComputerName
    )
    
    <#
    .SYNOPSIS
    
    Get-PCInfo [[-ComputerName] <Object>]
    
    .DESCRIPTION
    
    .PARAMETER ComputerName
      
    #>
    function Get-WMIPCInfo {
        [CmdletBinding()]
        param(
            $ComputerName = $ENV:ComputerName
        )
        if (Test-Connection $ComputerName -Quiet -Count 1) {
            Write-Debug -Message "$ComputerName reachable"
            $so = New-CimSessionOption -Protocol DCOM 
            $WMIData = New-CimSession -CN $ComputerName -SessionOption $so
            $BIOS = Get-CimInstance -Class CIM_BIOSElement -CimSession $WMIData | Select-Object -Property *
            $OS = Get-CimInstance -Class CIM_OperatingSystem -CimSession $WMIData | Select-Object -Property *
            $ServiceBranch = (([wmiclass]"\\$($ComputerName)\root\default:stdRegProv").GetStringValue(2147483650, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ReleaseID')).svalue
            $DISK = Get-CimInstance -Class CIM_LogicalDisk -CimSession $WMIData | Where-Object {$_.DeviceID -eq "C:"} | Select-Object -Property *
            $Computer = Get-CimInstance -Class CIM_ComputerSystem -CimSession $WMIData | Select-Object -Property *
            $IPConfig = Get-CimInstance -Class Win32_NetworkAdapterConfiguration -CimSession $WMIData | Where-Object {$_.DefaultIPGateway -match "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}"}  | Select-Object -Property *
            $UserQuery = ( C:\Windows\System32\quser.exe /server:$ComputerName 2> null)
            if ($UserQuery) {
                $UserQuery[1].Trim() -match "^(\S+)\s+.*((\d{2}\.){2}\d{4}\s+\d{2}:\d{2})" | Out-Null
                $LoggedOnUser = $Matches[1]
                $LogonTime = Get-Date -Date $Matches[2]
            }
            Remove-CimSession $WMIData
            Write-Debug -Message "`$BIOS: $BIOS"
            Write-Debug -Message "`$OS:  $OS"
            Write-Debug -Message "`$DISK:  $DISK"
            Write-Debug -Message "`$Computer:  $Computer"
            Write-Debug -Message "`$IPConfig:  $IPConfig"
            Write-Debug -Message "`$LoggedOnUser:  $LoggedOnUser"
            $CIMOutput = [PSCustomObject]@{
                ComputerName   = $BIOS.PSComputerName;
                Model          = $Computer.Model;
                BIOSName       = $BIOS.Name;
                SMBIOSVersion  = $BIOS.SMBIOSBIOSVersion;
                BIOSVersion    = $BIOS.BIOSVersion;
                ReleaseDate    = $BIOS.ReleaseDate;
                SerialNumber   = $BIOS.SerialNumber;
                OSCaption      = $OS.Caption;
                OSVersion      = $OS.Version;
                ServiceBranch  = $ServiceBranch;
                InstallDate    = $OS.InstallDate;
                LastBootUpTime = $OS.LastBootUpTime;
                PhysicalRAM    = [math]::round((($Computer.TotalPhysicalMemory) / 1GB), 2);
                DiskSize       = [math]::round(($DISK.Size / 1GB), 2);
                DiskFreeSpace  = [math]::round(($DISK.FreeSpace / 1GB), 2);
                IPV4Address    = $IPConfig.IPAddress[0];
                DefaultGateway = $IPConfig.DefaultIPGateway[0];
                DNSDomain      = $IPConfig.DNSDomain;
                DHCPEnabled    = $IPConfig.DHCPEnabled;
                LoggedOnUser   = $LoggedOnUser
                LogonTime      = $LogonTime
            }
            $CIMOutput
        }
        else {
            Write-Host "`tDer Rechner '$($ComputerName)' ist nicht erreichbar`n" -ForegroundColor Yellow
        }
    }
    
    
    $PCDaten = Get-WMIPCInfo -ComputerName $ComputerName
    
    $MonitorListe = Get-CimInstance WmiMonitorId -ComputerName $ComputerName -Namespace root\wmi | 
    ForEach-Object {
        [PSCUstomObject]@{
            Seriennummer = ($_.SerialnumberID|ForEach-Object {[char]$_}) -join ""
            ProduktID = ($_.ProductCodeID|ForEach-Object {[char]$_}) -join ""
            Manufacturer = ($_.ManufacturerName|ForEach-Object {[char]$_}) -join ""
            YearOfManufacture = $_.YearOfManufacture
        }
    }
    
    $Body = $PCDaten + $MonitorListe
    
    $MailParam = @{
        from = 'Powershell <Test@test.de>'
        to = 'test@test.de'
        subject = 'Inventarisierung'
        Encoding = 'UTF8'
        SmtpServer = '*************'
        Body = $Body
    }
    
    Send-MailMessage @MailParam

    Noch'n Tipp zu Deinem Code : Powershell-Code ist ziemlich "deklarativ" und die cmdlets sind leicht lesbar und wenn man ihn - gerade für Scripte - so ausführlich wie möglich schreibt, ist er quasi selbst erklärend. Jeder der Powershell kennt, weiß daß Get-Process die Liste der laufenden Prozesse ausgibt. Da braucht man dann keinen Kommentar dran schreiben, der erklärt, daß man die Liste der Prozesse ausgibt.  ;-)  ... Kommentare sind nur empfehlenswert, wo sie etwas nicht sowieso offensichtliches erklären. Da ist dann also weniger mehr.

    So ... schau's Dir alles mal an und prüfe, ob Du was davon gebrauchen kannst.


    Live long and prosper!

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




    Donnerstag, 14. März 2019 15:42
  • Vielen Dank für die schnelle Antwort.

    Ich werde versuchen jetzt alle Tipps von dir umzusetzten, da die Variante mit Get-ComputerInfo wirklich um ein vielfaches länger dauert als deine Variante.

    Nochmal bzgl. der E-Mail weißt du ob diese Arrays generell als E-Mailbody Probleme machen oder an was das genau liegen könnte?

    Freitag, 15. März 2019 11:04
  • Nochmal bzgl. der E-Mail weißt du ob diese Arrays generell als E-Mailbody Probleme machen oder an was das genau liegen könnte?
    Als Body funktioniert ja sowieso nur Plain Text oder HTML. Du könntest die Sachen explizit mittels der .ToString() Methode in Plain Text umwandeln oder Du erzeugst Dir einen HTML-Body. Das ist ein bissl aufwändiger, aber dafür hat man deutlich mehr Formatierungsoptionen ... mit Schriftarten und -Stilen und Tabellen und Farben und allem anderen.   In grün sehen z.B. negative Zahlen gar nicht mehr so negativ aus.  ;-)

    Live long and prosper!

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

    Freitag, 15. März 2019 11:19