xxsadmin
Goto Top

Domäne PCs durchsuchen und eine Datei ersetzen

Guten Tag zusammen,

zuerst möchte ich die Gelegenheit nutzen, um mich beim allen Helfer hier zu bedanken. Bis heute habe ich immer eine Antwort auf meiner Fragen gefunden, ohne dafür einen Beitrag schreiben zu müssen.

Zu meinem jetzigen Problem:

habe natürlich bereits nach einer Lösungen gesucht aber nichts gefunden. Und jetzt bin ich mir nicht mehr sicher ob überhaupt so was möglich ist.

Das Problem:

Wir haben in unsere Domäne sich ca. 1000 Clients. Auf ungefähr 200 davon ist ein CAD Programm installiert und in dessen Verzeichnis muss ich eine Datei ersetzen.

Meine Vorstellung:

Schritt 1. Eine Liste mit Ps's aus bestimmte OU erstellen.
Schritt 2. Auf PCs nach der Datei suchen und diese ersetzen ( ich weiß nicht auf welcher PCs dass Programm installiert wurde. Und auch der Installation Pfad ist unterschiedlich.
Schritt 3. Log files erstellen.

Fragen:

Ist so etwas überhaupt möglich? Am besten mit einer Bachdatei.
Warum? Damit kenne ich mich zumindest ein wenig aus. Außer jemand hat bereits was Fertiges.

Ich würde gerne die Bachdatei NICHT an den PCs verteilen, sonder das ganze wirklich als Stapelverarbeitung in Netzwerk laufen lassen. (PS's - pingen – verbinden – durchsuchen – Dateiersetzen – Ergebnis in Log Datei schreiben)


Für euer mühe bin euch dankbar.

Mfg
xxs

Content-Key: 139158

Url: https://administrator.de/contentid/139158

Printed on: April 19, 2024 at 22:04 o'clock

Mitglied: 60730
60730 Mar 25, 2010, updated at Oct 18, 2012 at 16:41:29 (UTC)
Goto Top
Servus,

schau u.a mal in meinen Beiträgen / Anleitungen da findest du .

Da ließt du dich mal ein und dann wirst du 99.9% deiner Fragen "irgendwie" beantwortet bekommen.

Wobei ein zehntel Prozentpunkte dann natürlich fieserweise
Und auch der Installation Pfad ist unterschiedlich.

Nicht wirklich nett werden.

Gruß
Member: xxsadmin
xxsadmin Mar 25, 2010 at 14:18:44 (UTC)
Goto Top
Ok. Vielen dank.

Werde mich durcharbeiten und melde mich dann wieder.
Mitglied: 60730
60730 Mar 25, 2010 at 14:37:48 (UTC)
Goto Top
Zitat von @xxsadmin:
Ok. Vielen dank.

Werde mich durcharbeiten und melde mich dann wieder.

Jo,
und wenn du rausfindest, ob das CAD Programm sich in der Reg verankert hat und dort seinen Install Pfad hinterlegt hat - oder ob es im Pfad liegt - macht es dann leichter.
Member: xxsadmin
xxsadmin Mar 25, 2010 at 20:50:56 (UTC)
Goto Top
Hallo Timo,

ich habe in ersten Anschnitt ein Fehler und kommen nicht drauf wo. So sieht die Ausgabe aus:


D:\>(
if 9 LEQ 999 SET Ws=sccm
if 9 LEQ 99 SET Ws=sccm0
if 9 LEQ 9 SET Ws=sccm00

ping -n 1 -w 5 9 | find "TTL=" && psexec \\9 -u home\administrator -p 111111
-c "\\dc01\installation\meine.cmd"
)


FOR /L %%i IN (1,1,9) DO (
if %%i LEQ 999 SET Ws=sccm
if %%i LEQ 99 SET Ws=sccm0
if %%i LEQ 9 SET Ws=sccm00
@title %Ws%%%i
ping -n 1 -w 5 %Ws%%%i|find "TTL=" && psexec \\%Ws%%%i -u home\administrator -p 111111 -c "\\dc01\installation\meine.cmd"
)
pause
Member: Edi.Pfisterer
Edi.Pfisterer Mar 26, 2010 at 20:11:32 (UTC)
Goto Top
Hallo!
ich geb jetzt auch mal meinen Senf dazu...

auch wenn Du das Script von TimoBeil (das im übrigen bemerkenswert praktisch sein dürfte!) zum laufen bekommst, dann läuft ja lediglich die meine.cmd ab.
And now?
Hier beginnt Dein Problem doch erst, oder?

Falls Du von Deinen ursprünglichen Plan:
Ich würde gerne die Bachdatei NICHT an den PCs verteilen, sonder das ganze wirklich als Stapelverarbeitung in Netzwerk laufen lassen.
abrücken kannst / musst, hilft vielleicht folgendes:

Ich hab ein ähnliches Problem mit vbs gelöst (aber das Script halt in der Firma, weil issa schon Wochänändä...)

Mein Lösungsansatz:
per Gruppenrichtlinie wird diese .vbs beim Systemstart aufgerufen.
Die prüft, ob die Datei vorhanden ist, falls dem so ist, wird sie umbenannt und die neue Datei auf das System kopiert (bei mir gings um ein Lizenzfile). Dadurch stellt das auch kein Problem dar, wenn dieses Script auf einem Client aufgerufen wird, der die Software nicht installiert hat)
Abschliessend wird am Server eine log-Datei erstellt, in die der Client eingetragen wird...
Bei mir waren die Pfade halt auf allen Rechnern gleich...

Falls Du für das Pfadthema schon eine Lösung hast, dann wäre mein Ansatz für Dich ja brauchbar. (Ich denke nebenbei, so viele unterschiedliche Möglichkeiten gibts da ja vermutlich auch nicht... Such halt von jedem Beschaffungsjahr einen Rechner und notiere dir den Pfad, dann wirst Du die meisten Pfade schon kennen, denke ich...
ausserdem: wie kreativ könnt ihr bei der Installation schon gewesen sein...
Ich denke, mit 2 bis 3 Varianten (englisch, deutsches System u sonstiges) kannst Du 99% abdecken, der Rest meldet sich dann ohnehin bei Dir, wenn CAD nicht mehr läuft...)

Gib Bescheid, wenn Du das Script brauchen kannst, dann stell ichs hier am Montag ab.

lg
Edi
Member: bastla
bastla Mar 26, 2010 at 20:32:53 (UTC)
Goto Top
... und wenn's tatsächlich nur um das Austauschen einer Datei geht, hat der BS-Hersteller sogar mitgedacht:
replace /?
Defaultmäßig wird damit nur ersetzt, wenn's was zu ersetzen gibt (außer Du verwendest "/A"), das aber dann in allen Unterordnern ("/S") und auf Wunsch nur für ältere Dateien ("/U") ...

Grüße
bastla
Member: Edi.Pfisterer
Edi.Pfisterer Mar 27, 2010 at 09:41:26 (UTC)
Goto Top
@ bastla:
Man lernt nie aus face-wink
DANKE
Member: Edi.Pfisterer
Edi.Pfisterer Mar 27, 2010 at 10:21:55 (UTC)
Goto Top
Hallo!

Aufgrund des Tipps von bastla nun folgender Lösungsansatz (hat nun mit meinem gestrigen Vorschlag in vbs nix mehr zu tun...)

login.bat (die du per GPO beim Systemstart laufen lässt)
Annahmen:
SERVER1 ist der Server, auf dem die logdatei erstellt wird bzw. die neue Lizenzdatei liegt
die lizenzdatei nennt sich lizenz.txt
(wenn zu erwarten ist, dass es am Client nur eine einzige Datei gibt, die lizenz.txt heisst, dann kommst Du auch mit einem Replace-Befehl aus)
Vergiss nicht, die NTFS-Rechte auf der CADlog.txt entsprechend zu setzen...

md c:\temp1
replace \\server1\share\lizenz.txt c:\programme\CAD /S >>c:\temp1\echo.txt
replace \\server1\share\lizenz.txt c:\programs\CAD /S >>c:\temp1\echo.txt
find /c /i "1" c:\temp1\echo.txt  
if errorlevel 1 goto Ente
echo %computername% >>\\server1\share\CAD_log.txt
Goto Ente
:Ente
del c:\temp1\echo.txt
rd c:\temp1

alternativ dazu (und vermutlich aussagekräftiger):
md c:\temp1
replace \\server1\share\lizenz.txt c:\programme\CAD /S >>c:\temp1\echo.txt
replace \\server1\share\lizenz.txt c:\programs\CAD /S >>c:\temp1\echo.txt
set cont=
for /F "delims=" %%f in (c:\temp1\echo.txt) do (  
	set "cont=%%f am Client %computername%"  
)
echo %cont% >>\\server1\share\log.txt
del c:\temp1\echo.txt
rd c:\temp1

alles ungetestet!

lg und erholsames WE

Edi
Member: bastla
bastla Mar 27, 2010 at 13:23:51 (UTC)
Goto Top
@urobe73
Um die Gesamtzahl aller Ersetzungen zu ermitteln, brauchst Du eigentlich keine Temp-Datei:
@echo off & setlocal
set /a count=0
for %%i in (c:\programme\CAD c:\programs\CAD c:\CAD) do (
    for /f %%a in ('replace \\server1\share\lizenz.txt %%i /S /U 2^>nul') do set /a count+=%%a  
)
if %count% gtr 0 >>\\server1\share\log.txt echo %computername%;%date%;%count%
Der Parameter "/U" bei "replace" sollte dafür sorgen, dass nicht bei jedem Hochfahren erneut die Datei ersetzt und die Protokollierung vorgenommen wird - falls kein "/U" verwendet wird, könnte zumindest anhand des hinzugefügten Datums im (nachträglich sortierten) Log eine Mehrfacherfassung des jeweiligen Computers erkannt werden ...

Noch eine kurze Anmerkung zum "set /a count+=%%a" für alle von "replace" ausgegebenen Zeilen: Hier kann man sich zunutze machen, dass nur eine einzige (die letzte) Zeile mit einem Zahlenwert und einem Leerzeichen beginnen kann (und damit die Summe in %count% erhöht); für Text wie "Ersetzen" oder "Keine" wird hingegen jeweils 0 addiert ...

Grüße
bastla
Member: Edi.Pfisterer
Edi.Pfisterer Mar 27, 2010 at 14:53:10 (UTC)
Goto Top
@bastla:
ich wiederhole mich gerne:
Du hast meinen Tag mal wieder bereichert face-wink
lg
Edi
Member: bastla
bastla Mar 27, 2010 at 15:10:27 (UTC)
Goto Top
Hallo Edi!

Danke für die Blümchen face-smile - und schöne Ferien!
bastla
Member: xxsadmin
xxsadmin Mar 27, 2010 at 16:54:54 (UTC)
Goto Top
Danke erstmals für eure Hilfe.
Obwohl ich ein andere Weg gehen wollte, habe ich mich letztendlich endschieden die Datei mit unsere Verteilungssoft zu ersetzen.
Warum den nicht gleich so? Die blöde Soft erkennt erstmals nicht alle Pc’s (Agent fehlt = PC wird nicht berücksichtig) und wenn das CAD Programm nicht damit verteilt wurde, wird der PC in einer Abfrage nicht miteinbezogen. Wir werden in der nächste Zeit sowieso auf SCCM umsteigen.

So möchte ich es angehen:

@echo off & setlocal
REG Query "HKEY_LOCAL_MACHINE\SOFTWARE\ISD Software und Systeme" >NUL 2>&1 && goto :ersetzen
@echo HICAD nicht installiert %COMPUTERNAME% %DATE% %TIME% > \\ccm01\dsm_netinstall\hicad\filedat_akt\fehler.log
GOTO :ende
:ersetzen
FOR /F "tokens=3 SKIP=4" %%i IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\ISD Software und Systeme\HiCAD\3" /v HomeDir') DO replace "\\ccm01\dsm_netinstall\hicad\filedat_akt\filegrup.dat" "%%i\exe"
:ende

Mein Problem "replace" gibt mir den errorlevel 0 aus, egal ob eine Datei ersetzt wurde oder nicht (keine Datei zum ersetzen --> errorlevel0 --> Meldung 0 Dateie wurde ersetz). Ich würde gerne aber in meiner Logdatei eintragen, wenn keine Datei ersetzt wurde. Wie könnte ich so was bewältigen?
Member: bastla
bastla Mar 27, 2010 at 17:05:07 (UTC)
Goto Top
Hallo xxsadmin!
Ich würde gerne aber in meiner Logdatei eintragen, wenn keine Datei ersetzt wurde. Wie könnte ich so was bewältigen?
Falls Du Dir einen der oben dargestellten Entwürfe etwas näher ansiehst (bei meinem Ansatz zB die Zeile 4), hättest Du eigentlich schon die gesuchte Lösung ...

Übrigens: In Deiner Zeile 3 fehlt ein ">" (dafür könntest Du aber das "@" einsparen; und wenn bei ":ende" ohnehin nix mehr passiert, würde ich ein "goto :eof" bevorzugen).

Grüße
bastla

P.S.: <code>-Tags machen geposteten Batch besser lesbar ...
Member: xxsadmin
xxsadmin Mar 27, 2010 at 20:36:15 (UTC)
Goto Top
Hallo bastla,

danke erst mal für deine schnelle Hilfe.

Zitat von @bastla:
Falls Du Dir einen der oben dargestellten Entwürfe etwas näher ansiehst (bei meinem Ansatz zB die Zeile 4), hättest
Du eigentlich schon die gesuchte Lösung ...

Das mit dem "count" habe ich jetzt mit eingebaut. Brauch ich jetzt nicht unbedingt, aber trotzdem gut zu wissen.
Ich möchte aber das in meiner zweite Liste ( gleiche Liste wie oben in Skript: @echo HICAD nicht installiert %COMPUTERNAME% %DATE% %TIME% >> \\ccm01\dsm_netinstall\hicad\filedat_akt\fehler.log), alle PC's haben wo die Datei nicht getauscht wurde (z.B. weil nicht vorhanden)
z.B. @echo Datei wurde nicht ersetzt %COMPUTERNAME% %DATE% %TIME% >> \\ccm01\dsm_netinstall\hicad\filedat_akt\fehler.log.

@echo off & setlocal
set /a count=0
REG Query "HKEY_LOCAL_MACHINE\SOFTWARE\ISD Software und Systeme" >NUL 2>&1 && goto :ersetzen  
echo HICAD nicht installiert %COMPUTERNAME% %DATE% %TIME% >>\\ccm01\dsm_netinstall\hicad\filedat_akt\fehler.log
GOTO :eof
:ersetzen
FOR /F "tokens=3 SKIP=4" %%i IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\ISD Software und Systeme\HiCAD\3" /v HomeDir') DO ( for /f %%a in ('replace "\\ccm01\dsm_netinstall\hicad\filedat_akt\filegrup.dat" "%%i\exe" /S /U 2^>nul') do set /a count+=%%a )  
if %count% gtr 0 >>\\ccm01\dsm_netinstall\hicad\filedat_akt\passt.log echo %computername%;%date%;%count%

Übrigens: In Deiner Zeile 3 fehlt ein ">" (dafür könntest Du aber das "@" einsparen; und
wenn bei ":ende" ohnehin nix mehr passiert, würde ich ein "goto :eof" bevorzugen).

Danke. Bin gerade in der Lernphase und solche Bemerkungen sind herzlichst willkommen. Wenn du mehrere solche Fehler siehst, gib mir bitte Bescheid .
Member: bastla
bastla Mar 27, 2010 at 21:06:56 (UTC)
Goto Top
Hallo xxsadmin!

Versuch es damit (weiterhin ungetestet face-wink):
@echo off & setlocal
REG Query "HKEY_LOCAL_MACHINE\SOFTWARE\ISD Software und Systeme" >NUL 2>&1 && goto :ersetzen  
echo HICAD nicht installiert %COMPUTERNAME% %DATE% %TIME% >>\\ccm01\dsm_netinstall\hicad\filedat_akt\fehler.log
GOTO :eof

:ersetzen
set /a count=0
FOR /F "tokens=3 SKIP=4" %%i IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\ISD Software und Systeme\HiCAD\3" /v HomeDir') DO (  
    for /f %%a in ('replace "\\ccm01\dsm_netinstall\hicad\filedat_akt\filegrup.dat" "%%i\exe" /S /U 2^>nul') do set /a count=%%a  
)
if %count% gtr 0 (
    >>\\ccm01\dsm_netinstall\hicad\filedat_akt\passt.log echo %computername%;%date%;%count%
) else (
    >>\\ccm01\dsm_netinstall\hicad\filedat_akt\fehler.log echo Datei wurde nicht ersetzt: %COMPUTERNAME% %DATE% %TIME%
)
Wenn es nur einen möglichen Zielordner gibt, muss auch nicht "hochgezählt" werden - es genügt dann, der Variablen %count% den ersten Wert aus der letzten Zeile - dieser sollte ja entweder "Keine" oder "1" sein (außer in den Unterordnern des Zielordners befände(n) sich noch (eine) weitere "filegrup.dat") - einfach zuzuweisen, wobei "Keine" eben das numerische Ergebnis 0 liefert.

Noch als Anmerkung: Die Semikola als Trennzeichen zwischen %computername%, %date% und %count% verwende ich, um im Fall des Falles das Log einfach zB in Excel oder Access importieren zu können ...

Grüße
bastla
Member: xxsadmin
xxsadmin Mar 28, 2010 at 07:27:19 (UTC)
Goto Top
vielen dank, euch allen für eure Zeit und Gedult.

@bastla

vielleicht kannst du mir noch sagen was "2^>nul" bewirken soll?

Vielen dank
Gruß
xxs
Member: bastla
bastla Mar 28, 2010 at 07:58:32 (UTC)
Goto Top
Hallo xxsadmin!

Mit "2^>nul" werden allfällige Fehlermeldungen (auf Kanal 2 = "STDERR") ins "Nichts" umgeleitet (= unterdrückt) - für die Auswertung des Ergebnisses werden sie hier ohnehin nicht benötigt ...

Grüße
bastla
Member: xxsadmin
xxsadmin Mar 28, 2010 at 08:22:03 (UTC)
Goto Top
Hallo bastlaa,

also gleich wie "2>&1". Oder täusche ich mich?
Member: bastla
bastla Mar 28, 2010 at 10:44:34 (UTC)
Goto Top
Hallo xxsadmin!
Oder täusche ich mich?
Ja. Mit "2>&1" werden Fehlermeldungen zum selben Ausgabekanal wie die "gewöhnlichen" Ausgaben ("STDOUT", Kanal 1) geschickt - hier war aber das Gegenteil gemeint: Fehlermeldungen sollten einfach verschwinden (deshalb eigens als Ziel das "nul"-Device angegeben).

Die Schreibweise "2>&1" ist dann sinnvoll (bzw sogar nötig), wenn alle Ausgaben in eine Datei umgeleitet werden sollen - ">Datei.txt 2>Datei.txt" funktioniert nicht, weil das System dazu die "Datei.txt" gleichzeitig zweimal zum Schreiben öffnen müsste ...

Grüße
bastla
Member: xxsadmin
xxsadmin Mar 28, 2010 at 17:46:30 (UTC)
Goto Top
Alles klar. Und noch mal vielen, vielen dank für deine Unterstützung.

Gruß
xxs
Member: bastla
bastla Mar 28, 2010 at 17:50:36 (UTC)
Goto Top
Hallo xxsadmin!

Gerne - aber ich war ja hier nicht der einzige ...

Grüße
bastla
Member: xxsadmin
xxsadmin Mar 29, 2010 at 20:14:39 (UTC)
Goto Top
Zitat von @bastla:
Hallo xxsadmin!

Gerne - aber ich war ja hier nicht der einzige ...

Grüße
bastla

beim den anderen habe ich mich fünf steps nach oben bereits bedankt face-wink

==> vielen dank, euch allen für eure Zeit und Gedult.

Heute hat übrigens alles prima geklappt. Datei getauscht und alle Systeme noch funktionsfähig.

Gruß
xxs
Member: bastla
bastla Mar 29, 2010 at 20:26:50 (UTC)
Goto Top
Hallo xxsadmin!

beim den anderen habe ich mich fünf steps nach oben bereits bedankt face-wink
Sorry, war mir nicht aufgefallen; jedenfalls schön, dass Du sie doch nicht vergessen hast ...

... und freut mich, wenn Du Erfolg hattest ... face-smile

Grüße
bastla