moringle
Goto Top

Batch-Datei zum überprüfen ob eine Software installiert installiert wurde

Hallo Admins
Ich habe folgendes Pfoblem / Frage:

In unserem Firmennetz wurden diverse Programme per Gruppenrichtlinie verteilt.
Das Netzwerk besteht aus ca. 300 Win XP Prof Rechnern, die über eine Domäne miteinander kommunizieren.

Leider ging bei der Verteilung etwas schief.
Die Programme wurden nur zu ca. 85% verteilt.
Ein Netzwerkproblem wurde schon ausgeschlossen.

Was ich jetzt machen will ist im Prinzip schnell gesagt:

Ich möchte eine Batch-Datei schreiben die erst prüft welche Pcs online sind und welche offline.
Die Ergebnisse möchte ich dann in 2 *.txt-Dateien schreiben (online.txt und offline.txt).
Wichtig ist mir hierbei, dass es über den Computernamen klappt, da dießer fortlaufend ist (z.B. ABC001, ABC002,.......ABC300)
Als nächstes soll die Batch-Datei alle online PCs überprüfen ob z.B. VLC-Player installiert wurde und die Ergebnisse dann wieder mit entsprechendem
Computernamen in 2 *.txt-Dateien schreiben (installiert.txt und nicht_installiert.txt).

Step1 würde ich mit einem ping /n 1 Befehl reallisieren und über die Error-Levels meine online/offline PCs erhalten.
Step2 würde ich mit einem If exist / if not exist und dann dem jeweiligem Pfad reallisieren. z.B. if exist \\Client\c$\Programme\VideoLAN\VLC

wäre nett, wenn mir einer von euch sagen kann ob das so möglich ist und ggf. ein wenig unter die Arme greift.
Bin echt am verzweifeln ich bekomms einfach ned hin.

Danke schonmal im Vorraus, ich hoffe ich kann noch ein paar hilfreiche Tipps von euch erhalten.

Content-Key: 129228

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

Ausgedruckt am: 29.03.2024 um 10:03 Uhr

Mitglied: Logan000
Logan000 12.11.2009 um 15:45:16 Uhr
Goto Top
Moin Moin

Ich bin die sicher keine Hilfe in Batch.
Aber wenn ihr mit Softwareverteilung arbeitet habt ihr das Problem ja evtl. häufiger. Wäre es da nicht sinnvoll sich über eine Inventartisierung Gedanken zu machen?
Wie z.B. .

Step2 würde ich mit einem If exist / if not exist und dann dem jeweiligem Pfad reallisieren. z.B. if exist \\Client\c$\Programme\VideoLAN\VLC
ich würde nicht nur den Pfad prüfen, sondern auch in der Registry unter
HKEY_LOCAL_MACHINE\SOFTWARE\ bzw.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\... schauen ob sich deine Installation, da was hinterlassen hat.

Gruß L.
Mitglied: bastla
bastla 12.11.2009 um 16:19:05 Uhr
Goto Top
Hallo moringl und willkommen im Forum!

Der Batch für das Abklappern der Rechner "ABC001" bis "ABC300" könnte (ungetestet) etwa so aussehen:
@echo off & setlocal
set "Online=D:\Online.txt"  
set "Offline=D:\Offline.txt"  

if exist "%Online%" del "%Online%"  
if exist "%Offline%" del "%Offline%"  
for /L %%i in (1,1,9) do ping ABC00%%i -n 1 >nul && >>"%Online%" echo ABC00%%i || >>%Offline% echo ABC00%i  
for /L %%i in (10,1,99) do ping ABC0%%i -n 1 >nul && >>"%Online%" echo ABC0%%i || >>%Offline% echo ABC0%i  
for /L %%i in (100,1,300) do ping ABC%%i -n 1 >nul && >>"%Online%" echo ABC%%i || >>%Offline% echo ABC%i  
Um dann alle (zumindest vorhin face-wink) erreichbaren Rechner zu überprüfen:
@echo off & setlocal
set "Online=D:\Online.txt"  
set "Ja=D:\Installiert.txt"  
set "Nein=D:\Nicht_installiert.txt"  

for /f "usebackq delims=" %%i in ("%Online%") do if exist "\\%%i\c$\Programme\VideoLAN\VLC\vlc.exe" (>>"%Ja%" echo %%i) else (>>"%Nein%" echo %%i)  
Grundsätzlich stimme ich Logan000 hinsichtlich der Überprüfung des Reg-Eintrages zwar zu, aber wenn die Programmdatei fehlt, besteht auf jeden Fall Handlungsbedarf - insofern sollte das "if exist [UNC-Pfad zur Programmdatei]" genügen ...

Grüße
bastla
Mitglied: -ricardo-
-ricardo- 12.11.2009 um 17:18:19 Uhr
Goto Top
Anderer Lösungsansatz wäre das zuweisen eine Scripte per GPO, was beim start ausgeführt wird ...
Der Rechener führt das Script aus (in dem ebenfalls die UNC-Pfade angegeben sind) und guckt ob die Dateien da sind.

Wenn etwas fehlt, wird eine Vraiable "s_all" auf "false" gesetzt und er schreibt die Namen der Fehlernden Software in eine Datei "Rechnername.csv" (... momentan erfolgt die Ablage Local auf "C:\", kannst dann ja gegen "\\servername\freigabeordner$\ "ersetzten )

Wenn nichts fehlen sollte geht er hin und guckt ob noch eine alte datei mit seinem Rechnernamen da ist und löscht diese

Somit hättest du dann einen Ordner auf dem Server wo du sehen kann welcher Rechner noch nicht vollständig sind ( anhand der Dateinamens) und wenn du die datei öffnest kannst du sehen welche softwar es ist ...

Ist zwar nicht optimal aber geht

'***************** Dim Vars   
Dim soll_software(100) 'Falls 100 zu wenig ist erweitern :)   
Dim s_all 
Dim strHost
Dim objWMIService
Dim colItems
Dim strHostname
Dim s_false
Dim strSoftware


' Soll Software  
' Als String 	    Softwarename ; Pfad  
soll_software(0) = "VLC;C:\Programme\VLC\vlc.exe"  
soll_software(1) = "CDBurnXP;C:\Programme\CDBurnerXP\cdbxpp.exe"  



' wird sobald eins fehlt auf false gesetzt *******  
s_all = true 


'zum sammeln der fehlernden software   
s_false = ""  


'Hostname auslesen  
strHost = "."  
Set objWMIService = GetObject("winmgmts:\\" & strHost & "\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)  
For Each objItem In colItems
   strHostname = objItem.Name
Next


Set fso = CreateObject("Scripting.FileSystemObject")  

'Überprüfung   
For Each software In soll_software
   
	If software <> "" Then    
		'********************* String zerlegen   
		strSoftware = Split(software,";")  
		If (fso.FileExists(strSoftware(1))) Then
		Else
		s_all = flase
		s_false= s_false & strSoftware(0) & ";"  
	End If
End If

Next



' Wenn irgendws gefehlt hat wird die eine Datei mit den fehlenden Programmen angelegt   
If s_all = flase Then 
	Set strOutDatei = FSO.CreateTextFile("C:\" & strHostname & ".csv")  
	
	s_false = Split(s_false,";")  
	
	For Each line in s_false 
   		strOutDatei.writeline line
	Next

Else 

	'Wenn nichts fehlt und noch eine alte Meldedatei abgelegt ist ... wir diese gelöscht  
	If (fso.FileExists("C:\" & strHostname & ".csv")) Then  
		Set file = fso.GetFile("C:\" & strHostname & ".csv")  
		file.Delete
	End IF 
End If 

Die Rechtschreibfehler gibt es um sonst dazu.... ist auch nur auf die schnelle und könnte besser gemacht werden
Mitglied: 60730
60730 12.11.2009 um 17:51:58 Uhr
Goto Top
Servus,

Logans Idee ist gut, Bastlas Ansatz - wie immer rischdisch - (und nu komm ich...)

Ich würde das per Psexec realisieren, und VLC starten, via Tasklist nachsehen, ob VLC läuft und das protokollieren.

Mehr oder weniger kann es beim VLC z.b schon bei der Verteilung daran scheitern, dass eine alte Vorgängerversion drauf war.

daher prüfe ich vorm installieren, ob VLC da ist - wenn ja deinstallier ich den und installiere Ihn dann in der neuen Version.

Gruß
Mitglied: DerWoWusste
DerWoWusste 12.11.2009 um 19:54:47 Uhr
Goto Top
N'Abend.
Noch ein Gedanke: Eigentlich ist eine gut geplante MSI-Verteilung nahezu sorgenfrei. Schau mal nach, woran es scheitert. Im Eventlog steht das drin unter System - Application management.
Mitglied: 60730
60730 12.11.2009 um 21:02:27 Uhr
Goto Top
Nabend zurück,

aber beim VLC "lohnt" es sich nicht wirklich "jedesmal" auf ein neues ein msi zu schnüren.

Oder war vlc nur ein Beispiel?

Gruß
Mitglied: bastla
bastla 12.11.2009 um 21:10:26 Uhr
Goto Top
@-ricardo-
Da Timo Dich in seiner Aufzählung ausgelassen hatte: Wenn es nicht "gleich und auf der Stelle" sein soll, ist Dein Ansatz sicher sinnvoll und einfacher (da das Handling der Listen - besonders "Online"/"Offline" - entfällt) ... face-smile
Ich weiß, dass Dein Vorschlag nur eine Skizze ist, aber trotzdem eine kurze technische Anmerkung: Anstelle des Zusammensetzens und später wieder Zerlegens von "s_false" anhand der Semikolons könntest Du gleich in Zeile 47 "vbCrLf" als Trennzeichen einbauen und dann später den gesamten String ohne Schleife in die Datei schreiben ...

Grüße
bastla
Mitglied: moringle
moringle 13.11.2009 um 00:33:15 Uhr
Goto Top
Hallo Ihr lieben,

zunächst will ich mich für eure Antworten bedanken.
Hab schon gedacht ich bekomm erst in einem Jahr oder so ne Antwort, wo dann womöglich noch
sowas drinsteht wie "Benutze die Suchfunktion" oder "geh auf www.gidf.de"
Bin deshalb sehr froh, dass es im WWW noch hilfsbereite Menschen gibt.
Danke hierfür.

Ich werde mich am Wochenende mal hinsetzen und eure Tipps "verarbeiten".
Ihr werdet spätestens am So Abend von mir hören, obs geklappt hat oder ob weitere Komplikationen
aufgetreten sind.

Bis dahin alles Gute.