none
Hardware Informationen in einem windows- fenster darstellen lassen RRS feed

  • Frage

  • Hallo Zusammen,

    Ich bin neu hier  im Forum, habe seit kurzem mit der Powershell angefangen.

    Ich habe folgendes Problem bzw Frage. ich will mir Informationen über mein computersystem anzeigen lassen das klappt soweit mit dem get-wmiobjekt commandlet.  jetzt will ich dies in einem windows fenster anzeigen lassen. klappt nur nicht ganz so gut. Vielleicht habt ihr eine Idee.

    so sieht es momentan aus
    $hardwaredetails = Get-WmiObject "win32_computersystem"

    $wshsell = New-Object -ComObject wscript.shell
    $wshsell.popup("$hardwaredetails",0,"hardwareinfos")

    leider werden dann nicht die hardwareinfos ausgespuckt sondern nur folgendes 

      \\familie-pc\root\cimv2:win32_computersystem.name="familie-pc"

    wenn ich Get-WmiObject "win32_computersystem" so in die Kommandozeile eingebe funktioniert alles  und er spuckt die hardwareinfos aus.

    jemand eine idee??

    Vielen Dank im Voraus

    niklas

    Mittwoch, 14. Oktober 2015 20:17

Antworten

  • Hallo Niklas.

    schau dir doch dazu bitte folgende sehr simple Demo-Applikation an.

    Bei Fragen einfach melden

    #==============================================================================================
    # XAML Demo-Applikation
    #==============================================================================================
    
    
    # Erstellung der XAML inklusive Anpassen der XAML
    #=====================
    [xml]$XAML = @'
    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OS Details" Height="306" Width="525" WindowStartupLocation="CenterScreen" WindowStyle='None' ResizeMode='NoResize'>
        <Grid Margin="0,0,-0.2,0.2">
            <TextBox HorizontalAlignment="Center" Height="23" TextWrapping="Wrap" Text="Operating System Details" VerticalAlignment="Top" Width="525" Margin="0,-1,-0.2,0" TextAlignment="Center" Foreground="White" Background="#FF98D6EB"/>
            <Label Content="Hostname" HorizontalAlignment="Left" Margin="0,27,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="Operating System Name" HorizontalAlignment="Left" Margin="0,62,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="Available Memory" HorizontalAlignment="Left" Margin="0,97,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="OS Architecture" HorizontalAlignment="Left" Margin="0,132,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="Windows Directory" HorizontalAlignment="Left" Margin="0,167,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="Windows Version" HorizontalAlignment="Left" Margin="0,202,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="System Drive" HorizontalAlignment="Left" Margin="0,237,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Button Name="btnExit" Content="Exit" HorizontalAlignment="Left" Margin="0,272,0,0" VerticalAlignment="Top" Width="525" Height="34" BorderThickness="0"/>
            <TextBox Name="txtHostName" HorizontalAlignment="Left" Height="30" Margin="175,27,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtOSName" HorizontalAlignment="Left" Height="30" Margin="175,62,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtAvailableMemory" HorizontalAlignment="Left" Height="30" Margin="175,97,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtOSArchitecture" HorizontalAlignment="Left" Height="30" Margin="175,132,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtWindowsDirectory" HorizontalAlignment="Left" Height="30" Margin="175,167,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtWindowsVersion" HorizontalAlignment="Left" Height="30" Margin="175,202,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtSystemDrive" HorizontalAlignment="Left" Height="30" Margin="175,236,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
        </Grid>
    </Window>
    '@
    
    
    # Laden der Assembly
    #=====================
    [void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
    
    
    # Laden der XAML
    #=====================
    $reader=(New-Object System.Xml.XmlNodeReader $xaml) 
    try{$Form=[Windows.Markup.XamlReader]::Load( $reader )}
    catch{Write-Host "Unable to load Windows.Markup.XamlReader. Some possible causes for this problem include: .NET Framework is missing PowerShell must be launched with PowerShell -sta, invalid XAML code was encountered."; exit}
    
    
    # Setzen der Variablen
    #=====================
    $xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name ($_.Name) -Value $Form.FindName($_.Name)}
    
    
    # Eventuelle Events hinzufügen
    #=====================
    $btnExit.Add_Click({$form.Close()})
    
    # WMI abrufen
    $oWMIOS = Get-WmiObject win32_OperatingSystem
    
    # Füllen der Textboxen
    $txtHostName.Text = $oWMIOS.PSComputerName
    
    #Formats and displays OS name
    $aOSName = $oWMIOS.name.Split("|")
    $txtOSName.Text = $aOSName[0]
    
    #Formats and displays available memory
    $sAvailableMemory = [math]::round($oWMIOS.freephysicalmemory/1000,0)
    $sAvailableMemory = "$sAvailableMemory MB"
    $txtAvailableMemory.Text = $sAvailableMemory
    
    #Displays OS Architecture
    $txtOSArchitecture.Text = $oWMIOS.OSArchitecture
    
    #Displays Windows Directory
    $txtWindowsDirectory.Text = $oWMIOS.WindowsDirectory
    
    #Displays Version
    $txtWindowsVersion.Text = $oWMIOS.Version
    
    #Displays System Drive
    $txtSystemDrive.Text = $oWMIOS.SystemDrive
    
    #Formular anzeigen
    $Form.ShowDialog() | out-null


    Best regards,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - Munich

    Blog    
    Creating Powershell GUIs with XAML? Take a look! PSGUI

    Mittwoch, 14. Oktober 2015 21:02
  • Ich hätte da noch:
     
     
    Get-WmiObject "win32_computersystem" | Out-GridView

    in der Kategorie "einfach" anzubieten. :)
    Grüße, Denniver
     

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 15. Oktober 2015 13:16
    Moderator
  • In einem Script sollte man ungerichtete Ausgaben immer vermeiden.
    Du erzeugst in jedem deiner Optionen eine Ausgabe, die du aber nirgendwohin zuweist. Das klappt manchmal (wie beim ersten Mal) und landet dann dort wo du es haben willst (in diesem Fall der Konsole), aber meist halt nicht.
    In diesem Fall also, wo das Ziel die Konsole ist, könntest du es folgendermassen machen:
     
    [string]$video  = "Win32_VideoController"
    [string]$memory = "Win32_ComputerSystem"
    [string]$disk   = "Win32_DiskDrive"
    [string]$process= "Win32_Processor"     
    [string]$falsch = write "Falsche Eingabe"
    
    do {
    $ausgabe = read-host -Prompt "Über welche Hardware benötigen Sie Informationen?
    Drücken Sie für Infornmationen über die
    Festplattenmodell=F
    Arbeitsspeicherhersteller=A
    Grafikkartenname=G
    PCname=P"
    
      switch ($ausgabe) {
        A {  Get-WmiObject $memory |select-object manufacturer | Out-Host}
        G {   Get-WmiObject $video |select-object videoprocessor | Out-Host}
        F {  Get-WmiObject $disk   |select-object model | Out-Host}
        P {  Get-WmiObject $process|select-object Systemname | Out-Host}  
        default {$test= New-Object -ComObject wscript.shell ; $test.popup("$falsch")}          
      }
    } 
    until( $ausgabe -eq "q"  )
     
    Unabhängig vom Ziel, ist es aber grundsätzlich immer besser, erst alle benötigten Daten zu sammeln und dann an einer(!) Stelle auszugeben. Anstatt x-Befehlen, die alle Ausgaben erzeugen.
    Schön ist das ganze Script nicht, aber ich nehme an das ist einfach zur Übung gedacht und nicht für User? :)

    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 21. Oktober 2015 12:33
    Moderator

Alle Antworten

  • Hallo Niklas.

    schau dir doch dazu bitte folgende sehr simple Demo-Applikation an.

    Bei Fragen einfach melden

    #==============================================================================================
    # XAML Demo-Applikation
    #==============================================================================================
    
    
    # Erstellung der XAML inklusive Anpassen der XAML
    #=====================
    [xml]$XAML = @'
    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OS Details" Height="306" Width="525" WindowStartupLocation="CenterScreen" WindowStyle='None' ResizeMode='NoResize'>
        <Grid Margin="0,0,-0.2,0.2">
            <TextBox HorizontalAlignment="Center" Height="23" TextWrapping="Wrap" Text="Operating System Details" VerticalAlignment="Top" Width="525" Margin="0,-1,-0.2,0" TextAlignment="Center" Foreground="White" Background="#FF98D6EB"/>
            <Label Content="Hostname" HorizontalAlignment="Left" Margin="0,27,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="Operating System Name" HorizontalAlignment="Left" Margin="0,62,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="Available Memory" HorizontalAlignment="Left" Margin="0,97,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="OS Architecture" HorizontalAlignment="Left" Margin="0,132,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="Windows Directory" HorizontalAlignment="Left" Margin="0,167,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="Windows Version" HorizontalAlignment="Left" Margin="0,202,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Label Content="System Drive" HorizontalAlignment="Left" Margin="0,237,0,0" VerticalAlignment="Top" Height="30" Width="170" Background="#FF98D6EB" Foreground="White"/>
            <Button Name="btnExit" Content="Exit" HorizontalAlignment="Left" Margin="0,272,0,0" VerticalAlignment="Top" Width="525" Height="34" BorderThickness="0"/>
            <TextBox Name="txtHostName" HorizontalAlignment="Left" Height="30" Margin="175,27,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtOSName" HorizontalAlignment="Left" Height="30" Margin="175,62,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtAvailableMemory" HorizontalAlignment="Left" Height="30" Margin="175,97,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtOSArchitecture" HorizontalAlignment="Left" Height="30" Margin="175,132,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtWindowsDirectory" HorizontalAlignment="Left" Height="30" Margin="175,167,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtWindowsVersion" HorizontalAlignment="Left" Height="30" Margin="175,202,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
            <TextBox Name="txtSystemDrive" HorizontalAlignment="Left" Height="30" Margin="175,236,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="343" IsEnabled="False"/>
        </Grid>
    </Window>
    '@
    
    
    # Laden der Assembly
    #=====================
    [void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
    
    
    # Laden der XAML
    #=====================
    $reader=(New-Object System.Xml.XmlNodeReader $xaml) 
    try{$Form=[Windows.Markup.XamlReader]::Load( $reader )}
    catch{Write-Host "Unable to load Windows.Markup.XamlReader. Some possible causes for this problem include: .NET Framework is missing PowerShell must be launched with PowerShell -sta, invalid XAML code was encountered."; exit}
    
    
    # Setzen der Variablen
    #=====================
    $xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name ($_.Name) -Value $Form.FindName($_.Name)}
    
    
    # Eventuelle Events hinzufügen
    #=====================
    $btnExit.Add_Click({$form.Close()})
    
    # WMI abrufen
    $oWMIOS = Get-WmiObject win32_OperatingSystem
    
    # Füllen der Textboxen
    $txtHostName.Text = $oWMIOS.PSComputerName
    
    #Formats and displays OS name
    $aOSName = $oWMIOS.name.Split("|")
    $txtOSName.Text = $aOSName[0]
    
    #Formats and displays available memory
    $sAvailableMemory = [math]::round($oWMIOS.freephysicalmemory/1000,0)
    $sAvailableMemory = "$sAvailableMemory MB"
    $txtAvailableMemory.Text = $sAvailableMemory
    
    #Displays OS Architecture
    $txtOSArchitecture.Text = $oWMIOS.OSArchitecture
    
    #Displays Windows Directory
    $txtWindowsDirectory.Text = $oWMIOS.WindowsDirectory
    
    #Displays Version
    $txtWindowsVersion.Text = $oWMIOS.Version
    
    #Displays System Drive
    $txtSystemDrive.Text = $oWMIOS.SystemDrive
    
    #Formular anzeigen
    $Form.ShowDialog() | out-null


    Best regards,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - Munich

    Blog    
    Creating Powershell GUIs with XAML? Take a look! PSGUI

    Mittwoch, 14. Oktober 2015 21:02
  • Hallo,

    du kannst dir alternativ auch mal das Tool "BgInfo" ansehen.

    Regards

    TC

    Donnerstag, 15. Oktober 2015 08:05
  • Ich hätte da noch:
     
     
    Get-WmiObject "win32_computersystem" | Out-GridView

    in der Kategorie "einfach" anzubieten. :)
    Grüße, Denniver
     

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 15. Oktober 2015 13:16
    Moderator
  • Hallo Zusammen,

    habe folgendes kleines Progrämmchen gebastelt, dass die Hardwareinfos des PCs ausgibt. Problem ist, sobald ich z.B (A )gedrückt habe, gibt es mir auch die Infos aus, dannach aber mich nochmal abfragt und ich z.B (F) abfrage, gibt es nur eine leere Ausgabe. Jemand ne Idee ?  Vielen Dank schon mal im Vorraus. gruß niklas

      [string]$video  = "Win32_VideoController"
    [string]$memory = "Win32_ComputerSystem"
    [string]$disk   = "Win32_DiskDrive"
    [string]$process= "Win32_Processor"     
    [string]$falsch = write "Falsche Eingabe"


    do
    {
                                                                                            

    $ausgabe = read-host -Prompt "Über welche Hardware benötigen Sie Informationen?
    Drücken Sie für Infornmationen über die
    Festplattenmodell=F
    Arbeitsspeicherhersteller=A
    Grafikkartenname=G
    PCname=P"

    switch ($ausgabe) {
    A { Get-WmiObject $memory     |select-object manufacturer}
        G { Get-WmiObject $video  |select-object videoprocessor}
        F { Get-WmiObject $disk   |select-object model }
        P { Get-WmiObject $process|select-object Systemname}  
        default {$test= New-Object -ComObject wscript.shell                                        
                                                                                                   
       $test.popup("$falsch")}          

    }

    } until( $ausgabe -eq "q"  )  
       

    Montag, 19. Oktober 2015 11:23
  • In einem Script sollte man ungerichtete Ausgaben immer vermeiden.
    Du erzeugst in jedem deiner Optionen eine Ausgabe, die du aber nirgendwohin zuweist. Das klappt manchmal (wie beim ersten Mal) und landet dann dort wo du es haben willst (in diesem Fall der Konsole), aber meist halt nicht.
    In diesem Fall also, wo das Ziel die Konsole ist, könntest du es folgendermassen machen:
     
    [string]$video  = "Win32_VideoController"
    [string]$memory = "Win32_ComputerSystem"
    [string]$disk   = "Win32_DiskDrive"
    [string]$process= "Win32_Processor"     
    [string]$falsch = write "Falsche Eingabe"
    
    do {
    $ausgabe = read-host -Prompt "Über welche Hardware benötigen Sie Informationen?
    Drücken Sie für Infornmationen über die
    Festplattenmodell=F
    Arbeitsspeicherhersteller=A
    Grafikkartenname=G
    PCname=P"
    
      switch ($ausgabe) {
        A {  Get-WmiObject $memory |select-object manufacturer | Out-Host}
        G {   Get-WmiObject $video |select-object videoprocessor | Out-Host}
        F {  Get-WmiObject $disk   |select-object model | Out-Host}
        P {  Get-WmiObject $process|select-object Systemname | Out-Host}  
        default {$test= New-Object -ComObject wscript.shell ; $test.popup("$falsch")}          
      }
    } 
    until( $ausgabe -eq "q"  )
     
    Unabhängig vom Ziel, ist es aber grundsätzlich immer besser, erst alle benötigten Daten zu sammeln und dann an einer(!) Stelle auszugeben. Anstatt x-Befehlen, die alle Ausgaben erzeugen.
    Schön ist das ganze Script nicht, aber ich nehme an das ist einfach zur Übung gedacht und nicht für User? :)

    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 21. Oktober 2015 12:33
    Moderator
  • Hallo Niklas,

    hier die Lösung Deines urspünglichen Problems:

    $hardwaredetails = Get-WmiObject -Class Win32_ComputerSystem
    (New-Object -ComObject WScript.Shell).Popup((($hardwaredetails | Out-String).Trim()),0,"hardwareinfos")

    Grüße
    Uwe

    Sonntag, 25. Oktober 2015 20:19