Herausfinden von Dateiversionen

Ausgangssituation war ein sehr freundliches Gespräch mit einem Hersteller einer Software, der mich bat, einmal zu prüfen, ob auf jedem Computer der selbe Programmstand installiert sei.

An und für sich solange legitim, bis man bemerkt, dass das Programm auf ca 40 Rechnern installiert ist und der Kunde über eine Stunde Fahrt entfernt ist.

Das geht doch bestimmt easy alles automatisiert.

Vorbereitung

Natürlich muss man, wenn man von einer ausführbaren Datei auf einem Windows(-Server)-Rechner haben möchte, erst mal Zugriff auf den Rechner haben. Hier war das ganze mit einer Rundmail an alle_mitarbeiter@ erledigt – „bitte lassen Sie in der Nacht vom x.ten zum x+1.ten Ihren Computer eingeschaltet“.

Proof of Concept: Herausfinden auf einem Rechner

Wir greifen über Powershell und die „versteckte“ C$-Freigabe auf die Exe-Datei, die das Programm startet, zu und lesen deren Programmversion aus. Dafür müssen wir sicherstellen, dass wir mit einem Domänen-Administrator auf einem vertrauenwürdigen Rechner (z.B. dem DC) unterwegs sind. Dann feuern wir unsere Powershell an und machen oben genanntes. Sieht zum Beispiel so aus:

(Get-Command "\\WAWI\C$\Program Files (x86)\Mustermann Software GmbH\Start.exe").FileVersionInfo.FileVersion

Es sollte eine Ausgabe nach dem Schema „1.2.3“ kommen.

Next level: für alle Rechner

Auch wenn das um ein vielfaches angenehmer ist, als x Leuten zu erklären, wie man einen Teamviewer startet, geht das easy noch einfacher.

Folgendes Powershell-Script liest aus dem AD sämtliche Rechner aus, führt den Befehl oben zu diesen aus, und gibt die Ausgabe aus:

$Computers = Get-ADComputer -Filter 'enabled -eq "true"' ` -Properties Name,Operatingsystem,OperatingSystemVersion,IPv4Address
foreach($C in $Computers) {
	$Hostname = $C.DNSHostName
	Write-Host "Prüfe $($Hostname)"
	$UNCPath = "\\$($Hostname)\C$\Program Files (x86)\Mustermann Software GmbH\Start.exe"
	try {
		$Version = (Get-Command $UNCPath).FileVersionInfo.FileVersion
		Write-Host " +- $($Version)"
	} catch {
		Write-Host " +- Error"
	}
}

Eine beispielhafte Ausgabe wäre:

Prüfe WAWI
 +- 1.2.3
Prüfe PC01
 +- 1.2.3
Prüfe PC02
 +- 1.2.0
[...]

Das reicht doch schon, um Ausreißer zu erkennen.

Das Script ist übrigens sehr lahm. Macht das lieber über Nacht, oder wenn ihr nach Stunden bezahlt werdet. „Mal kurz in der Mittagspause“ geht für vielleicht 20-30 Rechner, wenn alle on-site sind.

Comfort Feature: automatisches Filtern nach Ausreißern

Nein, scherz. Das könnt ihr selber machen, ich hatte damals keine Lust, mir darüber Gedanken zu machen.

Kategorien: Active Directory, Javascript

tino-ruge.de wird tino-kuptz.de

Im Laufe des Jahres 2024 wird dieser Blog umziehen. Alle Inhalte werden 1:1 weitergeleitet, nix geht verloren. Neue Domain, alter Autor, alter Inhalt.