Jump to content

Pikus1234

Members
  • Gesamte Inhalte

    28
  • Registriert seit

  • Letzter Besuch

Beste Lösungen

  1. Pikus1234's post in PS 4.0 Arrayfehler = wie kann ich den abfangen? wurde als beste Lösung markiert.   
    Leider klappt dieser Schritt nicht zufriedenstellend. Add-Content -Value....klappt aber die Ausgabe ist nicht wie gewünscht. PS scheint also alle PC entsprechend zu verarbeiten, als nur die Online-PC. Oder die Zuordnung bei der Dateispeicherung klemmt. Kurz gesagt....
    Ich lasse also lieber doch die Schleifen und lese die PC wieder ein. Denn ehrlich gesagt dauert dieser Schritt gar nicht so lange.
     
    Schlimmer wird es ja in der Abfrageschleife $Inventory....
    Hier habe ich, auch mit Hilfe von Euch ein Monitor-Array erstellt, um die bis zu 4 angeschlossene Monitore per WMI auslesen zu können.
    Das Problem ist jetzt:
    Wenn der PC einen WMI-Fehler aufweist und die Abfrage nicht klappt, muss ich diesen Fehler abfangen. Ihr hattet hier den Tipp gegeben es mit Try und Catch zu tun. Ich habe mich mal ausprobiert und versucht den Fehler in nachfolgender Form abzufangen....
    Ideenratgeber war dazu:
    https://kevinmarquette.github.io/2017-04-10-Powershell-exceptions-everything-you-ever-wanted-to-know/#trycatch
    try {[ARRAY]$MonitorList = Get-WmiObject -Class WMIMonitorID -Namespace root\wmi -ComputerName $computer} catch {Write-Output $computer "kein Monitor erkannt"} Aber natürlich klappt das nur bedingt.....Das Script läuft zwar weiter durch (arbeitet alle PC ab)
    Aber wie kann ich jetzt noch dem "catch" mitteilen, dass ich dennoch zur CSV-Ausgabe eine Zeile mit dem PC-Namen erhalten will? Die anderen PC erzeugen ja entsprechende Ausgaben, welche anschließend in eine CSV-Datei gespeichert werden?!
    Nur 1 PC  erzeugt also Fehler bei der WMI-Abfrage und in der Folge bei der Monitorarrayerstellung und erzeugt keine Zeile im CSV. Der PC fehlt mir in der CSV schlichtweg. Dennoch will ich auch diesen PC erfasst wissen.  
    Mir würde also der Eintrag reichen :
    PCName ($Computer);  "keine WMI-Abfrage möglich" oder ähnliches?
     
    Mhhh....Ich weiß = viele Fragen aber ich hoffe auf eure Hilfe hier und darf mich für die vielen schnellen Antworten bisher bedanken..... :thumb1:  :)  
     
    Hier nochmal die ganze Inventory-Abfrage und die erzeugten Fehlermeldung des 1. PC aus dieser Abfrage:
    $Inventory = foreach ($computer in $computers) { 12. $Bios = Get-WmiObject win32_bios -Computername $computer 13. $Hardware = Get-WmiObject Win32_computerSystem -Computername $computer 14. $Sysbuild = Get-WmiObject Win32_WmiSetting -Computername $computer 15. $OS = Get-WmiObject Win32_OperatingSystem -Computername $computer 16. $GUID = Get-wmiobject Win32_ComputerSystemProduct -Computername $computer | Select-Object -ExpandProperty UUID 17. $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $computer | Where-Object {$_.IPEnabled} 18. $driveSpace = Get-WmiObject win32_volume -Computername $Computer -Filter 'drivetype = 3' | 19. Select-Object PScomputerName, driveletter, label, @{LABEL='GBfreespace';EXPRESSION={'{0:N2}' -f($_.freespace/1GB)} } | 20. Where-Object { $_.driveletter -match 'C:' } 21. $cpu = Get-WmiObject Win32_Processor -Computername $computer 22. $CDROM = Get-WmiObject win32_CDROMDrive -ComputerName $computer 23. $Video = Get-WmiObject Win32_Videocontroller -ComputerName $computer -Filter "NOT name LIKE '%DameWare%'" |Select-Object 'Name*' 24. $username = Get-ChildItem "\\$computer\c$\Users" | Sort-Object LastWriteTime -Descending | Select-Object Name, LastWriteTime -first 1 25.#Fehler abfangen mit try und catch?! 26. try{[ARRAY]$MonitorList = Get-WmiObject -Class WmiMonitorID -Namespace root\wmi -ComputerName $Computer}catch{write-Output $Computer "keine WMI-Abfrage möglich"} 27. $PrinterHP = Get-WmiObject -Class Win32_Printer -ComputerName $Computer |Where-Object { $_.Local -like 'True' -and $_.Name -like 'HP*'}| Select-Object Name 28. $PrinterSamsung = Get-WmiObject -Class Win32_Printer -ComputerName $Computer |Where-Object { $_.Local -like 'True' -and $_.Name -like 'Samsung*'}| Select-Object Name 29. $PrinterCanon = Get-WmiObject -Class Win32_Printer -ComputerName $Computer |Where-Object { $_.Local -like 'True' -and $_.Name -like 'Canon*'}| Select-Object Name 30. 31. [PSCustomObject]@{ 32. ComputerName = $Computer.ToUpper() 33. Manufacturer = $Hardware.Manufacturer 34. Model = $Hardware.Model 35. Serial_Number = $Bios.serialnumber 36. MAC_Address = $Networks.MACAddress 37. Netboot_GUID = $GUID 38. IP_Address = $Networks.IpAddress[0] 39. Processor_Type = $cpu.Name 40. System_Type = $Hardware.SystemType 41. Total_Memory_GB = [math]::round($Hardware.TotalPhysicalMemory/1024/1024/1024, 2) 42. CDROM_Drive = $CDROM.Caption 43. Graphics = $Video.Name 44. Last_User = $username.Name 45. User_Last_Login = $username.LastWriteTime 46. 'C:_FreeSpace_GB' = $driveSpace.GBfreespace 47. Last_ReBoot = $OS.ConvertToDateTime($OS.LastBootUpTime) 48. Operating_System = $OS.Caption 49. Operating_System_Version = $OS.version 50. Operating_System_BuildVersion = $SysBuild.BuildVersion 51.# Fehler Abfangen wegen des Null-Arrays wenn die WMI-Abfrage nicht klappt 52. Monitor1Hersteller = If($MonitorList[0]){($MonitorList[0].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} 52. Monitor1Typ = If($MonitorList[0]){($MonitorList[0].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} 53. Monitor1Seriennummer = If($MonitorList[0]){($MonitorList[0].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} 54. Monitor2Hersteller = If($MonitorList[1]){($MonitorList[1].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} 55. Monitor2Typ = If($MonitorList[1]){($MonitorList[1].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} 56. Monitor2Seriennummer = If($MonitorList[1]){($MonitorList[1].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} 57. Monitor3Hersteller = If($MonitorList[2]){($MonitorList[2].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} 58. Monitor3Typ = If($MonitorList[2]){($MonitorList[2].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} 59. Monitor3Seriennummer = If($MonitorList[2]){($MonitorList[2].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} 60. Drucker_HP = $PrinterHP.Name 61. Drucker_Samsung = $PrinterSamsung.Name 62. Drucker_Canon = $PrinterCanon.Name 63. } ### End PSCustomObject 64. 65.} ### End Foreach Computer 66. 67.$Inventory Fehler 1:
    Get-WmiObject : Nicht unterstützt
    At C:\test.ps1:26 char:36
    + ... nitorList = Get-WmiObject -Class WMIMonitorID -Namespace root\wmi -Co ...
     
    Fehler 2:
    Cannot index into a null array.
     
    At C:\test.ps1:52 char:41
    + Monitor1Hersteller = If($MonitorList[0]){($MonitorLis ...
     
     
     
     
     
    Ich hoffe nun auf eure Vorschläge.....Bedenkt bitte ich bin echter Newbie in Sachen Power Shell.
  2. Pikus1234's post in Powershell Array-Ausgabe verändern, sortieren, korrigieren wurde als beste Lösung markiert.   
    :schreck:  :D  :jau:  so einfach kann es sein..... Ich sagte ja "Anfänger" grinsss. Da hab ich die Macht der geschweiften Klammern unterschätzt. Vielen Dank natürlich für den erfahrenen Weitblick.
    Jetzt bin ich tatsächlich hochauf und zufrieden mit dem Ergebnis.
     
    Also weiter im Text und schauen wie Drucker und Scanner sich finden lassen. Vielen Dank. Neue Fragen werden kommen.
    :thumb1:  :thumb1: :thumb1:  :thumb1:  
  3. Pikus1234's post in VB Script - Hilfe gesucht. wurde als beste Lösung markiert.   
    Au ersteinmal vielen Dank für die unkomplizierte Hilfe.
     
    Ich habe deinen Vorschlag jetzt mal gespeichert und probiere mich mal daran aus.
     
    Nur als Zusatz habe ich das Problem, so profan es auch klang, gelöst und das Script läuft nun wie es soll.
     
    Am Ende muss es lauten:
    if IPadr = "" then MsgBox "Von " & PCname & " konnte die IP-Adr. nicht ermittelt werden! Ursache: Offline oder Abbruch", , WScript.ScriptName if not IPadr = "" then MsgBox PCname & " hat die IP-Adr. " & IPadr , , WScript.ScriptName if IPadr = "" then Wscript.quit Nur falls jemand überhaupt daran interessiert sein sollte. Am Ende war es so einfach dass man darauf nur zuletzt kommt. Jetzt werde ich doch mehr in Richtung Powershell schauen und mich daran versuchen.
     
    Vielen Dank allen Mitdenkenden. :thumb1:
     
    LG :jau:  :)
×
×
  • Neu erstellen...