Jump to content

nv_it

Members
  • Gesamte Inhalte

    19
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von nv_it

  1. Hallo zusammen,

     

    ich baue aktuell mal wieder ein Skript mit Powershell welches zum einen eine Bestimmte Gerätesammlung aus dem Active Directory ausliest.

    Für jeden Computer in dieser Liste soll in bestimmten Pfaden sollen Dateien die älter sind als X Tage gelöscht werden.

    Außerdem soll mit dem Skript auf einem Server in verschiedenen Pfaden ebenfalls Dateien die älter sind als X Tage gelöscht werden. 

    Ich habe das ganze bisher so realisiert was auch an sich gut funktioniert:

    $MDE = (Get-ADComputer -Filter "Name -like 'COMPUTER'").Name
    
    $SourceMDE1 = "\\$PC\c$\XXX\XXX\"
    $SourceMDE2 = "\\$PC\c$\XXX\XXX\"
    $SourceMDE3 = "\\$PC\c$\XXX\XXX\"
    $SourceFVS1 = "\\server\c$\XXX\XXX\"
    $SourceFVS2 = "\\server\c$\XXX\XXX\"
    $SourceFVS3 = "\\server\c$\XXX\XXX\"
    $SourceFVS4 = "\\server\c$\XXX\XXX\"
    $LogSourceMDE = "\\server\c$\XXX\XXX\"
    $LogSourceFVS = "\\server\c$\XXX\XXX\"
    $Days1 = 10
    $Days2 = 30	
    $ext = "*.bat","*.cat","*.txt","*.ini","*.zip","*.pdf","*.log"	
    $logMDE = "$LogSourceMDE$(get-date -format yymmddHHmmss).txt"
    $logFVS = "$LogSourceFVS$(get-date -format yymmddHHmmss).txt"
    $DateBeforeXDays1 = (Get-Date).AddDays(-$Days1)
    $DateBeforeXDays2 = (Get-Date).AddDays(-$Days2)
    
    ForEach ($PC in $MDE)
    {
       
        start-transcript $logMDE
        write-host "--------------------------------------------------------------------------------------"
        write-host "Löschen aller Dateien ($ext) im Ordner $SourceMDE1 $SourceMDE2 $SourceMDE3 die älter sind als $Days1 und $Days2 Tage."
        write-host "--------------------------------------------------------------------------------------"
        get-childitem $SourceMDE1\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
        get-childitem $SourceMDE2\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
        get-childitem $SourceMDE3\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
        stop-transcript
    }
     
    
    start-transcript $logFVS
    write-host "--------------------------------------------------------------------------------------"
    write-host "Löschen aller Dateien ($ext) im Ordner $SourceFVS1 $SourceFVS2 $SourceFVS3 $SourceFVS4 die älter sind als $Days1 und $Days2 Tage."
    write-host "--------------------------------------------------------------------------------------"
    get-childitem $SourceFVS1\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays2 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    get-childitem $SourceFVS2\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays2 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    get-childitem $SourceFVS3\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays2 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    get-childitem $SourceFVS4\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    stop-transcript

     

     

    Jetzt hab ich leider noch ein Problem, und zwar in einem der Pfade (SourceFVS2) sind Unterordner die ich auch nach dem gleichen Schema mit löschen möchte.

    Steh gerade etwas auf dem Schlauch welchen Parameter ich ändern muss damit er in diesem Pfad die Unterordner mit löscht.

    Ansonsten bin ich allgemein offen für Verbesserungsvorschläge :-)

     

    Vielen Dank im voraus.

    Gruß Niklas

  2. Gerne,

     

    es sind 2 Skripte:

     

    Skript zum Kopieren von einer Datei von mehreren bestimmten Rechnern im Active Directory:

    #liest Rechner aus dem Active Directory
    $Rechner = (Get-ADComputer -Filter "Name -like 'XX*-M'-or Name -like 'YY*-S'").Name
    #Kopiert Datei von Rechner zu Share
    ForEach ($PC in $Rechner)
    {
        Copy-Item -Path "\\Pfad\zur\Quell\Datei\Datei.ini" -Destination "\\Server\Share\$PC.Datei.ini" -ErrorAction Ignore
    }

    Skript zum Abfragen der letzten Startzeit von mehreren bestimmten Rechnern im AD:

     

    #liest Rechner aus dem Active Directory
    $Rechner = (Get-ADComputer -Filter "Name -like 'XX*-M'-or Name -like 'YY*-S'").Name
    #fragt die letzte Startzeit der Rechner ab
    ForEach ($PC in $Rechner)
    {
        (Get-CimInstance -ClassName CIM_OperatingSystem -ComputerName $PC -ErrorAction Ignore| Select-Object -Property LastBootUpTime, PSComputerName)
    }

    Da bei meinem Fall zu jedem Rechner meist ein Computerobjekt existiert was nicht erreichbar ist habe ich noch das -ErrorAction Ignore mitgegeben.

  3. Okay danke, das hilft mir schonmal weiter :-)

    jetzt habe ich nochmal eine andere Frage zu meinem LastBootUpTime, das Skript sieht aktuell so aus:

    $Rechner = (Get-ADComputer -Filter 'Name -like "XX*-M"').Name
    
    ForEach ($PC in $Rechner)
    {
        (Get-CimInstance -ClassName CIM_OperatingSystem -ComputerName $PC | Select-Object -Property LastBootUpTime)
    }

    das gibt mir schonmal brav die Startzeiten der Rechner aus, wie kann ich hier jetzt einstellen das mir das Skript zusätzlich den Rechnernamen zur jeweiligen Startzeit mitgibt?

  4. Moin,

    danke schonmal für die vielen hilfreichen Antworten und Tipps.

    Bin etwas weitergekommen, beide Skripte funktionieren jetzt soweit das wenn ich die Rechner einzelnd mit in das Skript (in die Variable) schreibe.

    $PCListe = @('PC1','PC2')
    ForEach ($PC in $PCListe)
    {
       Copy-Item -Path \\$PC\c$\xxx\xxx\xxx.ini -Destination "\\server\xxx\xxx\$PC.xxx.ini"
    }

    Wenn ich allerdings versuche da das Get-ADComputer mit einzubauen erhalte ich aktuell noch Fehler:

    $PCListe = Get-ADComputer -Filter 'Name -like "xx*-S"' -Properties Name | FT Name
    
    ForEach ($PC in $PCListe)
    {
        Copy-Item -Path "\\$PC\c$\xxx\xxx\xxx.ini" -Destination "\\server\xxx\xxx\$PC.xxx.ini"
    }

    Fehler: Der Pfad "\\Microsoft.PowerShell.Commands.Internal.Format.GroupStartData\\XX\xx.ini" kann nicht gefunden werden... in Zeile 5 Zeichen 5 Copy-Item....

    Also er sucht den Pfad garnich nach dem Rechnernamen. Bin gerade etwas ratlos.

     

    Wenn ich mir einfach mal die Variable $PCListe ausgeben lasse sehe ich aber das diese richtig gefüllt ist.

  5. nein ich habe das jetzt Testweise mit 2 Rechnern gemacht. wenn ich das bei jedem Rechner einzelnd abfrage funktioniert es einwandfrei, wenn ich jedoch beide rechner in die Variable schreibe klappt es nicht, da scheint er schon ab dieser Zeile ein Problem zu haben:

    $os = Get-WmiObject -ComputerName $Rechner -Class win32_operatingsystem
  6. Hallo zusammen,

     

    ich habe mal wieder zwei kleine Aufgaben die ich mit Powershell realisieren möchte.

    Folgende Situation: Ich habe ca. 145 Rechner von denen ich eine Datei kopieren will, die bei allen Rechnern im gleichen Pfad liegt.

    Ich hab das soweit schonmal mit dem Copy-Item gebaut jedoch kommt es mir so vor als würde es auch schöner gehen als jeden Rechner in eine eigene Variable zu packen. Da die kopierten Dateien im gleichen Share landen und jeweils mit Rechnername benannt werden sollen.

    Hier mal mein Ansatz:

    $Rechner1="\\XXX-X"
    
    $Speicherort1="\\SERVER\SHARE\Unterordner\$Rechner1.Datei.ini"
    
    Copy-Item -Path "$Rechner1.FQDN\c$\xxx\xxx\Datei.ini" -Destination $Speicherort1
    
    
    $Rechner2="\\YYY-Y"
    
    $Speicherort2="\\SERVER\SHARE\Unterordner\$Rechner2.Datei.ini"
    
    Copy-Item -Path "$Rechner2.FQDN\c$\xxx\xxx\Datei.ini" -Destination $Speicherort2
      
    ...
    ...

    Wäre toll wenn mir da jemand einen evt. besseren Weg zeigen kann.

     

    Zusätzlich dazu muss ich ein separates Skript erstellen mit dem ich die LastBootUpTime von mehreren Rechnern abfrage. Dazu habe ich auch etwas geschrieben was mir allerdings immer nur von einer Maschine die LastBootUpTime liefert:

    $Rechner = "PC-XY.FQDN"
    
    $os = Get-WmiObject -ComputerName $Rechner -Class win32_operatingsystem
    $os.ConvertToDateTime($os.LastBootUpTime)

    bei diesem Skript würde ich nach meinem Verständnis einfach mehrere Rechner in die Variable mit reinschreiben jedoch kommt dann der Fehler:

    "Get-WmiObject : Der RPC-Server ist nicht verfügbar. 0x8007068A"

    Wenn ich den Rechner jedoch einzelnd abfrage funktioniert das Skript.

    Kann mir da evt. jemand sagen wo der Fehler liegt?

     

    Vielen Danke schon jetzt für die Hilfe ;-)

     

    Gruß Niklas

  7. Moin,

     

    @zahni Also vom Windows Image her ist ja alles schon fertig, das heißt die Rechner werden alle mit dem gleichen Stand installiert. Was ich mit dem Skript dann machen will ist für jeden Markt die jeweiligen Einstellungen setzen, wie Computername, Domänenbeitritt, Ip-Adresse, Gateway, DNS usw..

    Wenn das das ist was du mit Sysprep gemeint hast.

  8. Hi und danke ;)

     

    Das Windows 10 wird von uns mit einem fertigen Image erst installiert und im Nachgang würden wir dann das Skript ausführen wollen.

     

    Client-Management ist erst noch in Klärung welches wir da genau einsetzen werden.

    Da wir aber vorher in einem Projekt die Systeme neu installieren werden war so ein Skript geplant.

     

  9. Hallo zusammen,

     

    ich bin gerade dabei mich etwas in Powershell einzuarbeiten, habe zwar mit Batch etwas Erfahrung aber die müsste ich auch erst wieder auffrischen und warum nicht gleich für Powershell.

    Als erstes will ich euch kurz Erklären was ich mit Powershell realisieren möchte.

    Wir haben viele Fillialen (Märkte) im Einsatz und wollen für alle Märkte die Kassensysteme neu installieren.

    Das Skript soll also beim Ausführen eine kleine GUI bereitstellen wo ich eine bestimmte Marktnummer eingebe und das Skript mir dann die richtigen Daten zu genau dieser Marktnummer aus einer CSV-Datei ausliest und als Einstellungen im Windows (10) setzt.

    Die CSV-Datei wird voraussichtlich so aufgebaut sein:

    Markt-Nr. ; Computername ; Domäne ; IP-Adresse ; Subnetzmaske : Gateway ; DNS ; DNS2 ; DNS3 ; DNS-Suffix

     

    Ich gehe davon aus dass dieses Skript etwas Zeit beim Erstellen in Anspruch nimmt, daher bin ich für jeden Hinweis und Tipp sehr Dankbar ;-)

     

    Vielen Dank schonmal im voraus und liebe Grüße

     

    Niklas

×
×
  • Neu erstellen...