Jump to content

BOfH_666

Expert Member
  • Gesamte Inhalte

    2.036
  • Registriert seit

  • Letzter Besuch

Alle erstellten Inhalte von BOfH_666

  1. Kannst Du keine Foreach-Schleife benutzen?
  2. Da hat der Chef durchaus erstmal recht. Aber ist es auch mit einem vertretbaren Aufwand möglich? Meistens fängt man solche "Manager" mit dem finanziellen Aspekt ein. Du kannst ihm ja anbieten, Dich Vollzeit für 2 oder 3 Wochen damit zu beschäftigen. Mal sehen, was er dann meint. ;) :cool: Du musst ja schließlich ALLE möglichen Fälle abdecken und das erfordert eine entsprechende Komplexität. Vermutlich sind ein paar Studies mit Turnschuhen für ein paar Tage billiger. :D
  3. hmmmm ... wie könnte man sowas nur rausbekommen?? ... ich habe ne verrückte Idee - probier es doch einfach mal! :p ;) :D Powershell nimmt Dir eine Menge Arbeit ab ... Du kannst einfach die Größe angeben, dann den Teiler angeben für die Einheit die Du haben willst und voilá - Powershell rechnet es für Dich um .... so hier z.B. 5242880 / 1MB Du kannst in Variablen packen was auch immer Du gerne möchtest. Was willst Du denn eigentlich damit anfangen? Vielleicht gibt es ja eine ganz andere Lösung für Deine Aufgabe ....
  4. Oooops ... ja lustig ... auf die Powershell-Zeile hatte ich gar nicht geachtet .... so sollte es eigentlich funktionieren: Get-ChildItem -Path Y:\* -Recurse -Include *.jpg, *.neg | Where-Object {$_.length -gt 100mb -and $_.Directory -notmatch 'folder1|folder2'} | Sort-Object -Property length | Format-Table fullname, length -AutoSize
  5. Dann kannst Du jetzt natürlich immernoch robocopy anweisen den Header und die Zusammenfassung wegzulassen, die Liste per Powershell einlesen und weiterparsen .... :-D Also so dann .... robocopy Y:\ c:\temp *.jpg *.nef /L /S /XD Folder1 Folder2 /MIN 104857600 /FP /NJH /NJS /NDL /XX
  6. Ich weiß, es klingt ein bissl "von hinten durch die Brust ins Auge", aber wenn es Dir nur ums Auflisten geht (Du hast ja schließlich ein "ft" am Ende, kannst Du dafür prima robocopy benutzen. Mit der Option /L werden die gefundenen Dateien nur aufgelistet - nicht kopiert. Mit der Option /XD schließt Du Verzeichnisse aus und mit /MIN beschränkst Du die Suche auf Dateien einer bestimmten Mindesgröße .... und schneller dürfte robocopy vermutlich auch noch sein. robocopy Y:\ c:\temp *.jpg *.nef /L /S /XD Folder1 Folder2 /MIN 104857600 /FP ... also so sollte es eigentlich gehen ... und es lässt sich auch noch erweitern wenn Du magst. ;-)
  7. Was heißt "Es funktioniert nicht"? Bekommst Du einen Fehler, oder bekommst Du nicht die Ausgabe, die Du erwartest? Probier ma so: $SearchBase = 'OU=OU_Name,DC=domain,DC=com' Get-ADUser -Filter * -SearchBase $SearchBase -Properties MemberOf | Where-Object {$_.MemberOf -contains 'hier muss der DistinguishedName deiner Security Gruppe rein'} | Sort-Object -Property Name | Select-Object -Property Name
  8. Warum kannst Du das Alter dieser Dateien denn nicht bestimmen? Das funktioniert doch genau so wie bei den PDF-Dateien.
  9. ... naja .... und wo ist da jetzt das Problem?
  10. 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?
  11. 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).
  12. 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.
  13. 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/
  14. hmmm .... ich hätte es ja jetzt noch interessant gefunden, zu erfahren, für welche Lösung Du Dich entschieden hast .... ;)
  15. .... 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.
  16. 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 ...
  17. 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?
  18. 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.
  19. 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
  20. ... "geht nicht" gibt's nicht ... ;) :cool: :p
  21. 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?
  22. ... nur 'ne Idee: Vielleicht baust Du den Wrapper so, dass es egal ist, ob das Script remote oder lokal ausgeführt wird. ;)
  23. Wow ... auf die geilsten Lösungen kommt man einfach manchmal nicht, wenn man nicht ständig damit arbeitet. :thumb1: :jau:
  24. 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 ...
  25. 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.
×
×
  • Neu erstellen...