Jump to content

BOfH_666

Expert Member
  • Gesamte Inhalte

    2.100
  • Registriert seit

  • Letzter Besuch

Alle erstellten Inhalte von BOfH_666

  1. Wenn ich das jetzt richtig verstanden habe, sind die Text-Dateien dann also jeweils genauso alt wie die PDF-Dateien. Dann brauchst Du doch nur Deinen "Suchfilter" von "nur PDF" auf "PDF und TXT" erweitern und bist am Ziel!? Oder hab ich's doch noch nicht richtig verstanden?
  2. Was heißt: "Warum funktioniert .... nicht?" Was funktioniert denn nicht? "fl" ist der Alias für Format-List und mit "pa*" schränkst Du die Ausgabe auf alle Eigenschaften ein, die mit "pa" beginnen. Das ergibt bei mir z.B. "ParentFolder" und "ParentPath". Bei mir funktioniert das. Dafür funktioniert in meiner Umgebung der erste Befehl so nicht. (Exchange 2013 auf Windows Server 2012R2).
  3. Du machst Dir's gern selbst ein bissl schwer, oder? ;) # *** THIS SCRIPT IS PROVIDED WITHOUT WARRANTY, USE AT YOUR OWN RISK *** $testcomputers = "PCHostName1", "PCHostname2" #oder Get-Content -Path 'C:\computers.txt' $exportLocation = 'C:\pcInventoryPC.csv' # PC Connection Test bevor die PC´s ihre Inventur bekommen (Wenn online = speichern in live-PCs.txt Start Inventory, wenn offline = Gespeichert in dead.pcs.txt = keine Aktion) foreach ($computer in $testcomputers) { if (Test-Connection -ComputerName $computer -Quiet -count 1){ Add-Content -value $computer -path C:\livePCs.txt }else{ Add-Content -value $computer -path C:\deadPCs.txt } } # Nun wissen wir welche PC online sind # Prozedur mit der Inventory $computers = Get-Content -Path 'C\livePCs.txt' $Inventory = foreach ($computer in $computers) { $Bios = Get-WmiObject win32_bios -Computername $computer $Hardware = Get-WmiObject Win32_computerSystem -Computername $computer $Sysbuild = Get-WmiObject Win32_WmiSetting -Computername $computer $OS = Get-WmiObject Win32_OperatingSystem -Computername $computer $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $computer | Where-Object {$_.IPEnabled} $driveSpace = Get-WmiObject win32_volume -computername $Computer -Filter 'drivetype = 3' | Select-Object PScomputerName, driveletter, label, @{LABEL='GBfreespace';EXPRESSION={'{0:N2}' -f($_.freespace/1GB)} } | Where-Object { $_.driveletter -match 'C:' } $cpu = Get-WmiObject Win32_Processor -computername $computer $username = Get-ChildItem "\\$computer\c$\Users" | Sort-Object LastWriteTime -Descending | Select-Object Name, LastWriteTime -first 1 [ARRAY]$MonitorList = Get-WmiObject -Class WMIMonitorID -Namespace root\wmi -ComputerName $computer [PSCustomObject]@{ ComputerName = $Computer.ToUpper() Manufacturer = $Hardware.Manufacturer Model = $Hardware.Model Processor_Type = $cpu.Name System_Type = $Hardware.SystemType Operating_System = $OS.Caption Operating_System_Version = $OS.version Operating_System_BuildVersion = $SysBuild.BuildVersion Serial_Number = $Bios.serialnumber IP_Address = $Networks.IpAddress[0] MAC_Address = $Networks.MACAddress Last_User = $username.Name User_Last_Login = $username.LastWriteTime 'C:_FreeSpace_GB' = $driveSpace.GBfreespace Total_Memory_GB = [math]::round($Hardware.TotalPhysicalMemory/1024/1024/1024, 2) Last_ReBoot = $OS.ConvertToDateTime($OS.LastBootUpTime) Monitor1Hersteller = If($MonitorList[0]){($MonitorList[0].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor1Typ = If($MonitorList[0]){($MonitorList[0].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor1Seriennummer = If($MonitorList[0]){($MonitorList[0].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor2Hersteller = If($MonitorList[1]){($MonitorList[1].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor2Typ = If($MonitorList[1]){($MonitorList[1].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor2Seriennummer = If($MonitorList[1]){($MonitorList[1].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor3Hersteller = If($MonitorList[2]){($MonitorList[2].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor3Typ = If($MonitorList[2]){($MonitorList[2].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor3Seriennummer = If($MonitorList[2]){($MonitorList[2].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} } ### End PSCustomObject } ### End Foreach Computer $Inventory $Inventory | Export-Csv $exportLocation -NoTypeInformation -Force ... den Rest darfst Du gern selbst noch ein bissl verbessern.
  4. na das klingt doch supi .... dann denke ich, würde es sich für Dich bestimmt lohnen, Dir die Basics von Powershell mal "geordnet, strukturiert und didaktisch vernünftig aufbereitet" überzuhelfen. ;-) Hier sind ein paar Ressourcen verlinkt, die Dir einen guten Einstieg ermöglichen sollten. Besonders die beiden "Jump Starts", die in Jeffrey's Post verlinkt sind, sind sehr zu empfehlen. https://powershell.org/forums/topic/using-csv-files/
  5. hmmm .... ich hätte es ja jetzt noch interessant gefunden, zu erfahren, für welche Lösung Du Dich entschieden hast .... ;)
  6. .... outsch .. das kommt davon wenn man aus 3 Scripten eins machen will ... Danke für's "Debuggen" .... aber dann hat ja Pikus jetzt quasi gleich noch ein bissl Verbesserungspotential .... na ma kukn, ob er sich nochmal meldet.
  7. Hmmm ... ok ... bestimmt nicht der eleganteste oder effizienteste Code, aber als Inspirationsquelle sollte es genügen, hoffe ich. $ComputerList = Get-Content -Path 'C:\livePCs.txt' $Inventory = foreach ($ComputerName in $ComputerList) { $SessionOption = New-CimSessionOption -Protocol Dcom $CIMSession = New-CimSession -ComputerName $ComputerName $Bios = Get-CimInstance -ClassName win32_bios -CimSession $CIMSession $Hardware = Get-CimInstance -ClassName Win32_computerSystem -CimSession $CIMSession [ARRAY]$MonitorList = Get-WmiObject -Class WMIMonitorID -Namespace root\wmi -ComputerName $ComputerName [PSCustomObject]@{ ComputerName = $ComputerName.ToUppper() SystemBios = $Bios.serialnumber Monitor1Manufacturer = If($MonitorList[0]){($MonitorList[0].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor1UserFriendlyName = If($MonitorList[0]){($MonitorList[0].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor1SerialNumberID = If($MonitorList[0]){($MonitorList[0].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor2Manufacturer = If($MonitorList[1]){($MonitorList[1].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor2UserFriendlyName = If($MonitorList[1]){($MonitorList[1].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor2SerialNumberID = If($MonitorList[1]){($MonitorList[1].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor3Manufacturer = If($MonitorList[2]){($MonitorList[2].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor3UserFriendlyName = If($MonitorList[2]){($MonitorList[2].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor3SerialNumberID = If($MonitorList[2]){($MonitorList[2].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} } } $Inventory ... das lässt sich natürlich noch beliebig erweitern oder verbessern. ... na probier erst mal ;) Achso ... Du brauchst Powershell 3.0 wenn ich mich nicht irre ...
  8. Pikus, es wäre einfacher und schneller, wenn Du beide Abfragen, also PC und Monitore, in einer Schleife erledigst. Du musst Dir dabei nur überlegen, wie Du damit umgehst, wenn ein PC mehr als einen Monitor angeschlossen hast. Wieviele Monitore kann ein PC in Deiner Infrastruktur denn maximal haben?
  9. Wozu startest Du denn aus einem Befehlsinterpreter (Powershell-Konsole) einen weiteren Befehlsinterpreter (CMD-Konsole)? Die Powershell-Konsole kann ganz wunderbar andere Tools starten ... da brauchst Du keine CMD mehr. Wenn Du die Powershell dann mit erhöhten Rechten startest, läuft auch das darin gestartete Tool mit Adminrechten. Meines Wissens gibt es aber keine einfache und trotzdem sichere Methode, einem PoweshellSkript oder einer Batch-Datei die nötigen Credentials für eine Rechteerhöhung mitzugeben.
  10. Du kannst für einen kleinen Obulus die ISE erweitern ... mit den ISE-Steroids. Es gibt auch noch das Powershell Studio von Sapien (auch kostenpflichtig aber bestimmt das Geld wert) oder das kostenlose Visual Studio Code. Von MS aber Open Source und erweiterbar
  11. ... "geht nicht" gibt's nicht ... ;) :cool: :p
  12. Hmmm ... die Anfrage ist etwas wage ... für Services gibt's ganz normale cmdlets Get-Command -Noun service so kannst Du Dir die in der Konsole oder in der ISE anzeigen lassen. Dann gibt's auch noch Group Policy cmdlets in Powershell Wenn das nicht reicht, brauchen wir mehr Informationen. Was willst Du denn genau erreichen?
  13. ... nur 'ne Idee: Vielleicht baust Du den Wrapper so, dass es egal ist, ob das Script remote oder lokal ausgeführt wird. ;)
  14. Wow ... auf die geilsten Lösungen kommt man einfach manchmal nicht, wenn man nicht ständig damit arbeitet. :thumb1: :jau:
  15. Get-Eventog ist veraltet und sollte für neue Scripte nicht mehr verwendet werden. Schau Dir einfach mal die Hilfe für Get-WinEvent an .... inclusive der Beispiele ...
  16. Indem Du die die CSV-Datei einliest und dann mit einer Schleife über die einzelnen Elemente "iterierst". z.B. mit einem Foreach oder mit Pipeline und Foreach-Object.
  17. Ja - das ist möglich. :) ;) :thumb1:
  18. Is jebont ;) ... kommt mit in meine Sammlung ... falls ich's doch mal brauchen kann ... :thumb1:
  19. Ein Tool, welches seit fast 13 Jahren nicht mehr aktualisiert wurde, würde mich ja erst mal stutzig machen .... ;) ... lässt man das wirklich noch auf aktuelle Installationen los?
  20. Du liest den Inhalt der Datei mit Get-Content ein. Dabei erhältst Du einen String. Den kannst Du zum Integer "casten" und kannst das dann mit Deinem $VarA.Matches.Count vergleichen. ... also ungefähr so [INT]$SavedCount = Get-Content -Path "Pfad\Flag.Txt" ... jetzt hast Du die vorher dort gespeicherte Anzahl in der Variablen $SavedCount und kannst damit weiterspielen. ;) ... was mir noch einfällt ... Du müsstest dann vielleicht noch das Datum der Datei Flag.txt mit beachten, damit Du nicht beim ersten Durchlauf des Tages den "Error-Count" mit dem Vortag vergleichst. ;)
  21. Hmmm ... Du bräuchtest dann wohl doch eine "Zählvariable". Die Kannst Du dann (pro Tag) auswerten und entsprechend reagieren. Oder Du schreibst - so wie Du es oben schon selbst angeregt hast - den "Zähler" in eine Datei und liest diesen dann aus. Was genau fehlt Dir denn für die Umsetzung der Zählvariable?
  22. Wenn es sowieso neu erzeugt wird, kann man es nicht einfach löschen / leeren, nachdem es "bearbeitet" / "gescannt" wurde?
  23. ... per Powershell so hier: If(Test-Connection -Count 1 -Quiet -ComputerName "RemoteComputer"){ Get-Service -Name "Service" -ComputerName "RemoteComputer" | Restart-Service -Force } ... wenn der Host "RemoteComputer" nicht erreichbar ist, wird auch kein Service neu gestartet. ;) :cool: :D <SCNR> Wenn Du das Ganze in ein Script packst und es "parametriesierst" (heißt das überhaupt so?), dann kann man es mit dem Zielcomputer als Parameter aufrufen und die Sache ist erledigt. ... sind wir mal heute nicht so ... (wer kennt noch "Timur und sein Trupp"?) Nur mal so als Startpunkt könnte das dann als Script im einfachsten Fall so aussehen: param( [Parameter(Position=0, Mandatory=$true)] [ValidateNotNullOrEmpty()] [System.String] $ComputerName ) If(Test-Connection -Count 1 -Quiet -ComputerName $ComputerName){ Get-Service -Name "Service" -ComputerName $ComputerName | Restart-Service -Force } Mit einem beliebigen Namen als Powershell-Script (*.ps1) abgespeichert und in einer mit Adminrechten gestarteten Konsole aufgerufen, fragt das Script sogar nach dem Computernamen und startet den Service neu, wenn der Computer erreichbar ist. Den Service-Namen müsstest Du dann im Script natürlich noch entsprechend anpassen. Fragen? Fragen! ;)
  24. Nur mal noch so aus Neugier: Wie groß ist das "Netzwerk", um das es hier geht?
  25. Na wer denn sonst? Soll sich der Domain-Admin oder Enterprise-Admin um die Clients kümmern? ;) Bei uns heißt die Gruppe "WorkstationAdmins"
×
×
  • Neu erstellen...