12.08.15

[How-To] Programme auf mehreren PCs automatisiert updaten

Da in letzter Zeit sehr viele Sicherheitsupdates für Anwendungen wie beispielsweise Adobe Flash oder Java released werden, stellte sich mir die Frage, wie ich in unserem Unternehmensnetzwerk mit dem geringstmöglichen Aufwand unsere Standardanwendungen per Taskplanner automatisiert patchen kann (das manuelle Patchen von 100+ PCs verursacht einen immensen administrativen Aufwand).

Als Anwendung, welche das Patchen an sich übernimmt, fiel meine Wahl auf Ninite, da diese in der ProVersion sehr viele Funktionen bereithält, welche man per Kommandozeile automatisieren kann.

Darüberhinaus lädt Ninite den jeweiligen Patch für ein Programm einmalig herunter und verteilt ihn dann über das lokale Netz, anstatt dass jeder PC selbständig die Anwendung aktualisiert.

Per Taskplanner lasse ich stündlich ein Skript (ninite_PC.bat) ausführen, welches Ninite auf allen laufenden PCs im Firmennetzwerk ausführt. Um alle laufenden PCs zu erhalten, wird wiederum ein weiteres Skript (running_machines.bat) ausgeführt, welches per Ping alle laufenden Rechner in ein Textfile schreibt. Dieses Textfile wird vom ersten Batchskript als Grundlage für die zu prüfenden und ggf. zu patchenden Rechner benutzt.

Nach Ausführung des Patchvorganges versendet die "ninite_PC.bat" per Powershell-Skript (ninite.ps1) noch eine E-Mail mit einem Patchreport an unser Support-Postfach.


ninite_PC.bat

@echo OFF

rem Variable für Arbeitsverzeichnis setzen

set PFAD=D:\Tools\Ninite

rem ermitteln der eingeschalteten Rechner im Netzwerk

CALL %PFAD%\running_machines.bat

echo.
echo.
cls
echo Running Ninite on responding machines

rem laufende PCs prüfen und patchen

%PFAD%\NinitePro.exe /remote file:%PFAD%\IPs.txt /locale de-DE /silent %PFAD%\report\report_PC.txt /select Acrobat Chrome Firefox Flash "Flash (IE)" Java Reader "Reader DC" Silverlight Skype /updateonly /disableshortcuts /disableautoupdate

rem Report per mail an Support versenden

Powershell.exe  -ep RemoteSigned -File "D:\Tools\Ninite\ninite.ps1"

rem löschen des versendeten Reports

del "%PFAD%\report\report_PC.txt"



running_machines.bat

@echo OFF

set PFAD=D:\Tools\Ninite


echo running_machines.bat
echo Probing alive computers in Local Area Network
echo.
 

ping -n 2 127.0.0.1 > NUL

rem delete old files if existing
echo.
echo.
echo deleting old probing files!
del %PFAD%\ping.txt
del %PFAD%\results.txt
del %PFAD%\IPs.txt

echo.
ping -n 2 127.0.0.1 > NUL

rem pingen der PCs, welche in der machines.txt definiert wurden

echo pinging local workstations
echo.
echo.
for /F "tokens=*" %%A in (%PFAD%\machines.txt) do ping -n 1 %%A >> %PFAD%\ping.txt

echo writing responding machines to results.txt
echo.
echo.

ping -n 4 127.0.0.1 > NUL
CALL :RESULTS

echo writing IPs of alive machines to IPs.txt
echo.
echo.

ping -n 4 127.0.0.1 > NUL
CALL :IPs


:RESULTS

rem entfernen aller nicht benötigten Zeilen der Pingausgabe

rem aaa.bbb.ccc steht hier für IPs, welche gefiltert werden sollen
type %PFAD%\ping.txt | findstr "."  | findstr /v Ping | findstr /v aaa.bbb.ccc | findstr /v Pakete | findstr /v Ca. | findstr /v nicht | findstr /v Verlust | findstr /v Minimum | findstr /v Zeitberschreitung > %PFAD%\results.txt
EXIT /B

:IPs


rem IP-Adressen in temporäre Datei schreiben
for /F "tokens=3" %%i in (%PFAD%\results.txt) do echo %%i >> %PFAD%\IPs_temp.txt
ping -n 2 127.0.0.1 > NUL
for /F "tokens=*" %%A in (%PFAD%\IPs_temp.txt) do CALL :SUB_A %%A
CALL :SUB_B

GOTO :EOF

:SUB_A

rem Doppelpunkte hinter den IP-Adressen entfernen
set str=%1
set str=%str::=%
echo %str% >> %PFAD%\IPs.txt
EXIT /B

:SUB_B

rem entfernen der temporären IP-Liste
del %PFAD%\IPs_temp.txt
EXIT /B



ninite.ps1

Send-MailMessage -from "sender@domain.com" `
                       -to "recipient@domain.com" `
                       -subject "Ninite Report" `
                       -body "Results of Ninite" `
                       -Attachment "D:\Tools\Ninite\report\report_PC.txt" -smtpServer server.domain.com

05.08.15

[How-To] Timestamp mit führenden Nullen erzeugen

Will man Dateien mit einem Timestamp versehen (Logfiles, Backups, etc.), bekommt man spätestens dann Probleme, wenn man die Uhrzeit in den Timestamp einfügen will und es vor 10:00 Uhr ist.

Cmd entfernt bei der Stunde die führende Null und ersetzt sie durch ein Leerzeichen, was dazu führt, das Skripte aufgrund eines Syntaxerrors abbrechen.

Um dies zu umgehen, kann man sich mit einer Batchdatei behelfen, die wiederum das Leerzeichen durch eine Null ersetzt.

:prepare timestamp
set year=%date:~6,4%
set month=%date:~3,2%
set day=%date:~0,2%
set hour=%time:~0,2%
:fuehrendes Leerzeichen durch 0 ersetzen - Stunden kleiner 10
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set minute=%time:~3,2%
set timeStamp=%year%-%month%-%day%_%hour%-%minute%


Dies kann man nun als Batchdatei speichern und mittels Call aus anderen Batchdateien heraus aufrufen. So muss man dies nur einmalig zentral konfigurieren, anstatt in jeder Batchdatei auf's Neue.

Bsp.:


@echo OFF
call tmstmp.bat
example.exe /install /silent /log:install_%timeStamp%.txt

04.08.15

[How-To] Programm remote auf mehreren PCs beenden

Um ein Programm remote auf mehreren PCs zu beenden, kann man folgendermaßen vorgehen.

Diese Anleitung setzt voraus, dass die ps-tools installiert sind.

for /F "tokens=*" %%A in (computerliste.txt) do pskill programm.exe \\%%A

Der obige Befehl gilt für Batchfiles, führt man den Befehl direkt in der Kommandozeile aus, ist %%A durch %A zu ersetzen.

[How-To] installierte Programme auf entfernten Rechnern anzeigen

Möchte man auf einem Remote-PC prüfen welche Programme installiert sind, kann man folgendermaßen vorgehen:

Diese Anleitung setzt voraus, dass die ps-tools installiert sind.

Aktivieren der Remote Registrierung (benötigt um installierte Programme auszulesen)
psexec \\computer cmd
sc config RemoteRegistry start= auto
net start RemoteRegistry
exit 
 
Auslesen der installierten Programme 

psinfo -s \\computer

Suchen nach einem bestimmten Programm
psinfo -s \\computer | find "Programmname"