302
Andi2401
boesi666
dog
Frank
GuentherH

kleine Softwareverteilung mit Psexec realisieren

Mitglied: TimoBeil
01.11.2008
16:44:59 Uhr
15045 Aufrufe
2 Antworten
Noch nicht bewertet
Vorab - dieses Tutorial erhebt keinerlei Anspruch auf Vollständigkeit und realisierbarkeit in jedem (Windows) Netzwerk.
Wurden bei der Planung die wichtigsten Standards eingehalten - dann spricht (außer einer ausgewachsenen Softwareverteilung) nichts gegen den Einsatz.

Wir brauchen zuerst einmal Psexec aus den PSTools von Mark Russinovich.

Dann müssen wir die Struktur unseres Netzwerkes "kennen".
Sinnvollerweise haben wir eine Liste aller Netzwerkclients z.B per BGinfo bereits in der Hinterhand.

Wenn nicht - auch nicht tragisch - dann erstellen wir uns auf die schnelle eine.

Natürlich ist man immer im Vorteil, wenn man schon eine Liste hat - in der Computername und zumindestens die Mac Adresse stehen.
Dann kann man "seine" Clients am Wochenende schön einfach per Wake On Lan aufwecken.

Seinen "Job" erledigen und die Systeme mit Shutdown (aus dem Reskit von Windows / oder bereits bei XP dabei) nach getaner Arbeit herunterfahren.

Hat / oder will man das nicht - sondern muß "schnell" etwas auf allen Clients durchführen - dann würde es folgendermaßen funktionieren:

Clients mit einheitlichem Namen

Sind die Clientnamen "ähnlich" strukturiert - Sprich FirmaWorkstationNummer - dann hilft uns dieser Ansatz - alle aktiven System zu finden und dort per PSexec (z.B) eine cmd auszuführen:
01.
FOR /L %%i IN (1,1,999) DO ( 
02.
        Rem Ab Hier werden die Rechner ohne führende 0 gefunden 
03.
        if %%i LEQ 999 SET Ws=FirmaW^^orkstation 
04.
        Rem Hier muß etwas getrixt werden, wenn es Systeme gibt - die mit einer führenden "0" anfangen 
05.
        if %%i LEQ 99 SET Ws=FirmaW^^orkstation0 
06.
        Rem Hier muß etwas getrixt werden, wenn es Systeme gibt - die mit zwei führenden "0"len anfangen 
07.
        if %%i LEQ 9  SET Ws=FirmaW^^orkstation00 
08.
	@title %Ws%%%i 
09.
 	ping -n 1 -w 5 %Ws%%%i|find "TTL=" && psexec \\%Ws%%%i -u Domain\domainadmin -p Password -c "\\server\freigabe\meine.cmd" 
10.
)

Soweit so gut - nun haben wir diverse Systeme (diejenigen, die zum jeweiligen Zeitpunkt aktiv waren) - mit einem Job betraut.

Wie stellen wir sicher, daß beim erneuten Lauf kein System doppelt den Job (\\server\freigabe\meine.cmd) durchführt?


01.
Rem dazu auf \\server\freigabe\ eine "ferig" Datei erstellen 
02.
@if not exist \\server\freigabe\ready.ini @echo .>>\\server\freigabe\ready.ini 
03.
Rem Ist der Rechner bereits in der Liste eingetragen? 
04.
@ findstr %computername% \\server\freigabe\ready.ini >nul 
05.
@if not %errorlevel%==1 goto end 
06.
rem setzte den %errorlevel% zurück 
07.
@color cf  
08.
Rem vergleiche die hostst Datei 
09.
fc \\server\freigabe\hosts. %windir%\system32\drivers\etc\hosts. 
10.
if not %errorlevel%==0 goto hostst 
11.
goto end 
12.
:hostst 
13.
@color cf 
14.
@copy /y \\server\freigabe\hosts. %windir%\system32\drivers\etc\hosts. >nul && if %errorlevel%==0 echo %computername% Hosts kopiert>>\\server\freigabe\ready.ini || echo %computername% Hosts nicht kopiert>>\\server\freigabe\notready.ini 
15.
:end 
16.
Rem eine unsortierte Liste - macht keinen Spass ;-)  
17.
sort \\server\freigabe\ready.ini /o \\server\freigabe\ready.txt 
18.
copy \\server\freigabe\ready.txt \\server\freigabe\ready.ini 
19.
@exit

Clients in einem bestimmten IP Bereich


01.
Rem "fast" identisch mit dem vorherigen Ansatz - nur findet dieser Ansatz auch Netzwerkdrucker, Server und Switche - von daher mit "Vorsicht" zu genießen 
02.
SET ip=192.168.0. 
03.
FOR /L %%i IN (10,1,254) DO ( 
04.
 	title %ip%%%i 
05.
        ping -n 1 -w 5 %ip%%%i|find "TTL=" && psexec \\%ip%%%i -u Domain\domainadmin -p Password -c "\\server\freigabe\meine.cmd" 
06.
)

Clients in einem bestimmten IP Bereich (die eine Freigabe c$ haben)

Wobei der Fairness halber dazu geschrieben werden muß:
  • das diese Alternative extrem Zeitaufwenig ist
  • und ich diese "Alternative" nicht wirklich im produktiven Einsatz benutzen würde.

01.
SET ip=192.168.0. 
02.
FOR /L %%i IN (10,1,254) DO ( 
03.
 	title %ip%%%i 
04.
	echo y|net use \\%ip%%%i\c$>c:\test.txt 
05.
	findstr "Benutzernamen" c:\test.txt && psexec \\%ip%%%i -u Domain\domainadmin -p Password -c "\\server\freigabe\meine.cmd" 
06.
)

Wie Stelle ich sicher, daß kein Client vergessen wurde?

Ohne eine komplette Liste aller Clients wird das schwierig - da ich damit keine Erfahrung habe (Ich bin im Besitz einer kompletten Liste) kann ich diese Frage nicht aus dem Stehgreif beantworten.
Eine komplette Liste kann man sich jedoch mittels LDIFDE oder NETSH DHCP SERVER export \\server\freigabe\complete.ini all besorgen.

Ps:
Vielen Dank an diejenigen im Forum, die mich auf die Idee gebracht haben und noch mehr dank an diejenigen, die mein Wissen erweitert haben.

Ps²
"Selbstverständlich" ist dieses Script nicht wirklich haargenauso im Einsatz - ich habe es mal dazu benutzt das Bios der Clients zu aktualisieren.

Mitglied: dog
dog schreibt am 02.11.2008 um 04:27:34 Uhr
Hallo,

schöne Anleitung face-smile

Ich würde allerdings den Status ob ein Client eine Software bereits installiert hat nicht auf dem Server sondern auf dem Client speichern, aus zwei Gründen:

a. Clients können neu installiert werden und brauchen die Software erneut
b. Es gibt Wächtersysteme, die die PCs automatisch zurücksetzen - während die Software also aus Serversicht installiert ist, muss das auf dem Client nicht der Fall sein.

Evtl. wäre hier eine Duale Lösung gut: Log auf dem Server, eigentlicher Status auf dem Client. face-smile

Grüße

Max
Mitglied: TimoBeil
TimoBeil schreibt am 02.11.2008 um 10:46:06 Uhr
Zitat von dog:
Hallo,

schöne Anleitung face-smile
Merci vielmals für das Lob face-smile

Ich würde allerdings den Status ob ein Client eine Software
bereits installiert hat nicht auf dem Server sondern auf dem Client
speichern, aus zwei Gründen:

a. Clients können neu installiert werden und brauchen die
Software erneut

Für diesen Fall würde sich eine weitere Batch anbieten - die so aussehen könnte:
01.
Set /p renewjob = Software xy erneut installieren: 
02.
find /v "%renewjob%" \\server\freigabe\ready.ini >> \\server\freigabe\ready.txt 
03.
copy \\server\freigabe\ready.txt \\server\freigabe\ready.ini
b. Es gibt Wächtersysteme, die die PCs automatisch
zurücksetzen - während die Software also aus Serversicht
installiert ist, muss das auf dem Client nicht der Fall sein.
Aus diesem Grund habe in in der Batch - die auf dem Client ausgeführt wird - folgende Zeilen (ab 8) angedeutet:

01.
#Rem vergleiche die hostst Datei  
02.
fc \\server\freigabe\hosts. %windir%\system32\drivers\etc\hosts.  
03.
if not %errorlevel%==0 goto hostst  
04.
goto end 

Evtl. wäre hier eine Duale Lösung gut: Log auf dem Server,
eigentlicher Status auf dem Client. face-smile

Grüße

Max
zurück face-wink
mehr ...Ähnliche Beiträge