none
Bildschirmschoner per PowerShell im Netzwerk verteilen RRS feed

  • Frage

  • Guten Morgen.

    Ich habe gestern den Auftrag erhalten einen Bildschirmschoner an alle Workstations in unserer Domänenumgebung zu verteilen. Nach etwas Überlegen habe ich mich dann dafür entschieden den Bildschirmschoner von meinem Arbeitsplatz aus per PowerShell zu verschicken und habe ein entsprechendes Script geschrieben, welches so weit auch funktioniert, nun geht es mir aber um das Fine-Tuning.

    ---

    Als erstes lese ich das ActiveDirectory über "get-adcomputer" aus.

    Import-Module ActiveDirectory
    
    get-adcomputer -filter { Name -like "NSW7*" -or Name -like "WEW7*" -or Name -like "WSW7*"} | Select-Object Name | Out-File c:\pcname.txt -append

    Hier habe ich allerdings das Problem, dass die Textdatei nachher mit einer Leerzeile startet, gefolgt von "Name" und einer Zeile Bindestriche, das sieht dann so aus:

     
    Name                                                                                                                                                           
    ----                                                                                                                                                           
    NSW7-001   
    .
    .
    .
    

    Hier ist dann die Frage, wie bekomme ich es hin, dass die Textdatei gleich mit dem ersten Computernamen, also mit NSW7-001 in der ersten Zeile beginnt?

    ---

    Danach kommt dann der Kopiervorgang und die "Dokumentation" über einige TXT-Dateien. 

    $pcs = Get-Content "c:\pcname.txt"
    foreach ( $pc in $pcs ){
    	$ziel = "\\$pc\c$\windows\SysWOW64"
    	$online = Test-Path $ziel
    	if ($online -eq $true){
    		$pc | Out-File c:\pc-ONLINE.txt -Append
    		Copy-Item "c:\screensaver.scr" -Destination "$ziel"-Force -Recurse
    		$file = "\\$pc\c$\windows\SysWOW64\screensaver.scr"
    		$erfolg = Test-Path $file
    		if ($erfolg -eq $true){
    			$pc |  Out-File c:\pc-Erfolg.txt -Append
    		}
    		else {
    			$pc |  Out-File c:\pc-Misslungen.txt -Append
    		}
    	}
    	else {
    		$pc | Out-File c:\pc-OFFLINE.txt -Append
    	}
    }

    Bei diesem Codestück ist meine Frage, ob man das eleganter lösen kann als ich es hier getan habe.

    Wie gesagt, die Funktion die ich mir wünsche ist gegeben. Mir geht es nun nurnoch um die Feinheiten.

    Ich danke schon jetzt jedem der sich meinen Beitrag durchliest und vorallem denen, die sich die Zeit nehmen meinen Code zu verbessern.

    Gruss,

    Carsten

    Donnerstag, 22. November 2012 08:44

Antworten

  • Dazu brauchts kein Tutorial: :)

    Dateien kannst du hier kopieren:

    Rechtsclick ins leere Fenster -> NEU -> Datei, und dann

     

     

    Quelldateien sollten natürlich auf einem vom Ziel-PC erreichbaren Share liegen.

    Dann würde ich noch auf dem "Gemeinsame Optionen" Tab die Einstellung "Nur einmalig anwenden" aktivieren. Das wars.

    Was deinen Code bertrifft, wenn er fehlerfrei das gemacht hat was er sollte, ist er der Aufgabe angemessen und damit völlig ok. Verbessern kann man immer was, aber hier wäre die einzige wirklich bedeutende Verbesserung eben gewesen, nicht Powershell zu benutzen. :)

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    Donnerstag, 22. November 2012 15:13
    Moderator
  • Frage 1 (Ungetestet):

    Import-Module ActiveDirectory

    get-adcomputer -filter { Name -like "NSW7*" -or Name -like "WEW7*" -or Name -like "WSW7*"} | ForEach-Object { $_.Name | Out-File c:\pcname.txt -append}



    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Donnerstag, 22. November 2012 09:06
    • Als Antwort markiert toexelchen Freitag, 23. November 2012 07:19
    Donnerstag, 22. November 2012 09:05

Alle Antworten

  • Frage 1 (Ungetestet):

    Import-Module ActiveDirectory

    get-adcomputer -filter { Name -like "NSW7*" -or Name -like "WEW7*" -or Name -like "WSW7*"} | ForEach-Object { $_.Name | Out-File c:\pcname.txt -append}



    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Donnerstag, 22. November 2012 09:06
    • Als Antwort markiert toexelchen Freitag, 23. November 2012 07:19
    Donnerstag, 22. November 2012 09:05
  • Ciao Peter.

    Vielen Dank, das war genau das, was ich gesucht habe. Nun da ich es sehe denk ich mir "Eigentlich klar". Aber beim PowerShell Programmieren sehe ich leider meist vor lauter Bäumen den Wald nicht mehr.

    Sobald ich vielleicht noch die 2. Frage beantwortet bekomme werde ich deinen Beitrag auf jeden Fall als Lösung mit markieren.

    Donnerstag, 22. November 2012 09:42
  • > ist meine Frage, ob man das eleganter lösen kann als ich es hier getan habe.
     

    Mal ne Frage: die Datei ist nun auf dem Rechner, aber wie wird der Screensaver eigentlich aktiviert?

    Für mich ist das Ganze -spätestens in einer Umgebung ab Server 2008- kein Job für Powershell, sondern für eine Gruppenrichtlinie. Damit geht das Verteilen nicht nur deutlich einfacher, sicherer und ist im Eventlog überprüfbar,  du kannst ausserdem noch den Screensaver auch aktivieren.

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 22. November 2012 12:19
    Moderator
  • Den ScreenSaver aktiviere ich nachher über die GPO

    Hier würde ich dann eben den ssText3d.scr durch meinen austauschen.

    Dass ich die Verteilung schon durch eine Gruppenrichtlinie vornehmen kann war mir bisher nicht bekannt. Ich muss zugeben, dass ich von der ICT-Support(Helpdesk) Seite komme und kein ICT-System Engineer oder ICT-System Administrator bin. Habe eigentlich auch kaum Interesse auf Servern rumzuturnen, warum genau ich die glorreiche Aufgabe bekommen habe die Bildschirmschoner zu verteilen und zu aktivieren bleibt mir schleierhaft. Ich gehe davon aus, dass sich jemand gedacht hat "Der Bildschirmschoner ist auf dem Client, also kann sich der Helpdesk drum kümmern".

    Wenn es per Gruppenrichtlinie einfacher geht, hast du da zufällig einen Link mit einem Tutorial oder sowas? Dann könnte ich mir das auch mal anschauen, auch wenn ich den Bildschirmschoner nun schon über mein PowerShell Script verteilt habe.

    Mir gehts hier eben vorallem darum zu erfahren, wo ich meine Code noch schöner/einfacher/verständlicher/eleganter verfassen kann.

    Danke dir auf jeden Fall schonmal für deine Rückmeldung.

    Gruss,

    Carsten

    Donnerstag, 22. November 2012 14:55
  • Dazu brauchts kein Tutorial: :)

    Dateien kannst du hier kopieren:

    Rechtsclick ins leere Fenster -> NEU -> Datei, und dann

     

     

    Quelldateien sollten natürlich auf einem vom Ziel-PC erreichbaren Share liegen.

    Dann würde ich noch auf dem "Gemeinsame Optionen" Tab die Einstellung "Nur einmalig anwenden" aktivieren. Das wars.

    Was deinen Code bertrifft, wenn er fehlerfrei das gemacht hat was er sollte, ist er der Aufgabe angemessen und damit völlig ok. Verbessern kann man immer was, aber hier wäre die einzige wirklich bedeutende Verbesserung eben gewesen, nicht Powershell zu benutzen. :)

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    Donnerstag, 22. November 2012 15:13
    Moderator
  • :) Das ist wirklich eine einfachere Möglichkeit und hätte mich mit Sicherheit um einiges weniger Energie und Zeit gekostet. Auch wenn ich jetzt schon einen anderen Weg gefunden habe, gut fürs nächste Mal zu wissen, vorallem wenn entschieden wird noch etwas am Bildschirmschoner zu verändern oder ähnliches.

    Verbessern kann man immer was, aber hier wäre die einzige wirklich bedeutende Verbesserung eben gewesen, nicht Powershell zu benutzen. :)

    Grüße, Denniver

    Und das nehme ich doch mal als Lösung für mein "Problem" und markiere die Frage als gelöst. Danke nochmal an alle die sich die Zeit genommen haben mir zu helfen.

    Gruss, Carsten
    Freitag, 23. November 2012 07:19