Freeware-Dienstprogramme für die Kommandozeile: Sammlung und Schalter
Neun kleine Programme, jedes für eine Sache, die die Shell der Zeit nicht konnte. Als Satz gelesen ist diese Sammlung von Freeware-Dienstprogrammen für die Kommandozeile eine ziemlich genaue Bestandsaufnahme dessen, was Windows NT fehlte, und weil die meisten Lücken inzwischen geschlossen sind, taugt sie auch als Karte von einem alten Schalter zu dem Befehl, der ihn ersetzt hat.
Die Sammlung und warum es sie gab
LS-Tools erschien zwischen etwa 1997 und 2002 als Freeware für Windows NT und wuchs um ein Programm nach dem anderen. Es gab kein Installationsprogramm und kein Rahmenwerk: jedes Mitglied war eine einzelne Konsolenanwendung, die ihren eigenen Hilfetext ausgab, wenn man sie mit dem Hilfeschalter aufrief. Diesem Format verdankt die Dokumentation ihre gute Überlieferung. Die gesamte Schnittstelle jedes Werkzeugs passt auf einen Bildschirm.
Die Auswahl hat eine erkennbare Logik, sobald man sie danach gruppiert, worauf sie zugreift. Zwei Programme betreffen Energie und Sitzungen, zwei Identität und Zugriff, drei sind Pipeline-Installationsmaterial, eines greift in das Dateisystem auf eine Weise ein, die die Shell nicht zugänglich machte, und eines ist ein Build-Helfer. Nichts in dem Satz überschneidet sich mit etwas anderem darin.
Mitglieder und ihre Nachfolger
| Programm | Aufgabe | Ersetzt durch |
|---|---|---|
ln.exe | Hardlink auf NTFS anlegen | mklink /H, fsutil hardlink |
down.exe | herunterfahren, neu starten, abmelden, Energiesparmodus, Ruhezustand: lokal oder remote | shutdown, powercfg |
apm.exe | Akkuzustand; Energiesparmodus oder Ruhezustand | powercfg, Get-CimInstance Win32_Battery |
errortext.exe | Win32-Fehlernummer in Text übersetzen | net helpmsg, certutil -error |
clipdump.exe | Zwischenablage auf die Standardausgabe schreiben | Get-Clipboard (kein eingebautes Konsolen-Äquivalent) |
copytosystem.exe | Dateien ins Systemverzeichnis kopieren, unter 9x und NT gleich | nichts. Das Zwei-Familien-Problem ist weg |
scacl.exe | Zugriffslisten von Diensten und Treibern anzeigen und ändern | sc sdshow, sc sdset |
who.exe | aktuelles Konto, Gruppen und Privilegien ausgeben | whoami /all |
setenv.exe | Umgebungsvariable in einem anderen Prozess setzen | nichts Unterstütztes: for /f in der Gegenrichtung |
Hardlinks, bevor die Shell sie zugab
NTFS unterstützt Hardlinks seit seiner ersten Fassung, und jahrelang machte kein
mitgelieferter Befehl sie zugänglich. ln.exe tat es, in einer Zeile, mit dem
bewusst aus der Unix-Welt geliehenen Namen, der sagte, was es war.
USAGE: ln FILE LINK
FILE Name einer bestehenden Datei (das Linkziel)
LINK Name des anzulegenden Links. Eine bestehende Datei dieses Namens wird überschrieben.
Hinweis: NTFS unterstützt Hardlinks nur auf Dateien.
Das Überschreiben in diesem Hinweis ist im Gedächtnis zu behalten, falls einmal ein Skript
auftaucht, das das Programm benutzt. Es gibt keine Rückfrage und keinen Probelauf. Die
heutigen Entsprechungen sind vorsichtiger: mklink /H überschreibt nicht, und
fsutil hardlink list nennt die Zahl der Namen, die eine Datei schon hat. Die
Frage, die vor dem Löschen eines Namens zählt.
Identität, Fehlercodes und Zwischenablage: die Pipeline-Schalter
Drei der Programme existieren, weil ein Skript einen Wert brauchte, den die Shell nicht
liefern konnte. who.exe beantwortete „wer bin ich, worin bin ich, und was darf
ich", mit getrennten Schaltern für Konto, Gruppenliste, Gruppenliste mit Kennungen,
Privilegien und Privilegien mit Erläuterung.
USAGE: Who.exe [/u /g /G /p /P /a /A /n]
/u Kontoinformationen /p Privilegien
/g Gruppenmitgliedschaften /P Privilegien mit Erläuterung
/G Gruppen mit SIDs /a alles (= /u /g /p)
/n Versionsbanner unterdrücken /A alles, ausführlich (= /u /G /P)
Das ist heute whoami /all, und die Ersetzung ist exakt. Übernehmen lohnt sich
die eine Gewohnheit mit dem Banner-Schalter: ein Programm, das seinen Namen und seine
Version über die Ausgabe schreibt, bricht jedes Skript, das die erste Zeile auswertet, und
die Werkzeuge dieser Zeit boten fast alle einen Weg, das abzuschalten.
errortext.exe machte aus 0x5 ein „Zugriff verweigert", was
belanglos klingt, bis man ein Protokoll voller nackter Zahlen gelesen hat.
clipdump.exe schrieb die Zwischenablage auf die Standardausgabe und ist das
still Nützlichste der neun, denn der eingebaute clip schreibt nur. Eine
Batchdatei, die die Zwischenablage lesen will, muss weiterhin PowerShell aufrufen.
Der Umgebungsvariablen-Trick und warum ihn nichts ersetzt hat
setenv.exe setzte eine Umgebungsvariable im Elternprozess oder in einem über
die Kennung benannten Prozess und konnte den Wert aus der Standardeingabe nehmen. Damit
konnte eine Batchdatei die Ausgabe eines beliebigen Befehls in eine Variable fangen: etwas, das die Shell jener Zeit einfach nicht konnte.
USAGE: setenv [/stdin /stderr] [/P[=] <pid>] <varname[=]> <wert>
/P <pid> Zielprozess, dezimal oder mit 0x. Weggelassen oder null heißt Elternprozess.
/stdin Eingabe von der Befehlszeile, solange vorhanden, danach von der Standardeingabe
Beispiele:
time /T | setenv /stdin TIME1 ← aktuelle Zeit in TIME1 leiten
setenv /P 4711 INCLUDE C:\Inc ← INCLUDE für Prozess 4711 setzen
Kein unterstützter Befehl tut das, und keiner sollte: ein Prozess besitzt seinen
Umgebungsblock, und in einen fremden zu schreiben heißt, in fremden Speicher zu schreiben.
Die Lücke schloss sich von der anderen Seite. for /f fängt Befehlsausgabe in
eine Shell-Variable, und in PowerShell tut es eine Zuweisung. Die Lehre verallgemeinert
sich: hat ein altes Programm keine heutige Entsprechung, liegt das meist daran, dass das
Problem an anderer Stelle gelöst wurde, und nicht daran, dass die Fähigkeit verloren ging.
Energie, Sitzungen und die zwei mit eigener Seite
apm.exe meldete den Akkuzustand und konnte den Rechner über die
Vor-ACPI-Schnittstelle in den Energiesparmodus oder Ruhezustand schicken; die späte Fassung
gab auch die Restlaufzeit aus, wenn die Hardware sie lieferte. Alles davon steckt heute in
powercfg, samt der Diagnose, die beantwortet, warum ein Rechner nicht schlafen
bleibt.
Die zwei Schwergewichte der Sammlung haben genug Fläche für eigene Seiten.
down.exe erreichte Energiezustände auf Remote-Rechnern, die die dokumentierte
Schnittstelle nicht anbietet, indem es sich auf das Ziel kopierte und dort lief: Mechanismus
und Folgen stehen auf der Seite zu Remote-Shutdown.
scacl.exe bearbeitete die Zugriffsliste von Diensten und Treibern, mit der
Buchstabennotation, die bis heute der klarste Weg ist, einen Dienstdeskriptor zu lesen; das
steht auf der Seite zu Dienstrechten.
Zusammen gelesen zeigen diese Freeware-Dienstprogramme für die Kommandozeile auch, wo der
Ersatz aufhört. Sieben der neun lassen sich auf einen eingebauten Befehl abbilden, zwei
nicht: copytosystem.exe löste ein Problem, das es nicht mehr gibt, nämlich
eine Binärdatei für die 9x- und die NT-Familie zugleich, und setenv.exe hat
überhaupt keine unterstützte Entsprechung. In die Umgebung eines fremden Prozesses zu
schreiben bietet das heutige Windows nicht, ein Skript, das darauf baute, muss also
umgedreht werden und einen Wert aus dem Kindprozess lesen statt einen hineinzuschreiben.
Fragen zu diesen Dienstprogrammen
Funktionieren Hardlinks unter Windows wirklich?
Ja, auf NTFS, und das seit Windows NT. Ein Hardlink ist ein zweiter Verzeichniseintrag auf denselben Dateidatensatz, beide Namen sind also gleichwertig, und die Daten bestehen, bis der letzte gelöscht ist. Die Einschränkung: beide Namen müssen auf demselben Datenträger liegen und das Ziel muss eine Datei sein. NTFS kennt keine Hardlinks auf Verzeichnisse, dafür gibt es Verzweigungen.
Was ist heute die Entsprechung eines Hardlink-Werkzeugs?
mklink /H Link Ziel für einen Hardlink und mklink /J für eine Verzeichnisverzweigung, beide seit Windows Vista eingebaut. fsutil hardlink create tut dasselbe und listet zusätzlich bestehende Links auf eine Datei, was mklink nicht kann.
Kann ein Programm eine Umgebungsvariable in seiner übergeordneten Shell setzen?
Über die dokumentierte Schnittstelle nicht. Ein Prozess besitzt seinen eigenen Umgebungsblock; ein Kindprozess kann den des Elternprozesses nicht ändern. Werkzeuge, die es scheinbar konnten, schrieben direkt in den Speicher des anderen Prozesses. Das funktionierte und ist nicht tragfähig. Der übliche Weg ist der umgekehrte: das Kind gibt den Wert aus, die Shell fängt ihn auf, wofür for /f existiert.
Warum funktioniert clip nur in eine Richtung?
Der eingebaute Befehl clip schreibt die Zwischenablage aus der Standardeingabe und hat überhaupt keine Leserichtung. Sie aus einer Batchdatei zu lesen braucht PowerShell, also Get-Clipboard, oder ein Hilfsprogramm. Diese Asymmetrie ist der Grund, warum ein kleines Zwischenablage-nach-stdout-Programm jahrelang mitgeschleppt wurde.
Wie übersetze ich eine Fehlernummer wie 0x5 in Text?
net helpmsg 5 für einen dezimalen Systemfehler und certutil -error 0x80070005 für einen hexadezimalen inklusive COM-Ergebnissen. Beide lesen dieselben Meldungstabellen wie ein spezialisiertes Werkzeug, das frühere Programm hat also einen eingebauten Ersatz.
Ist APM-Energieverwaltung noch relevant?
Nein. Die Schnittstelle, die diese Werkzeuge nutzten, ist älter als ACPI, und alles ab Windows 2000 verwendet das neuere Modell. powercfg deckt dasselbe Feld und viel mehr ab, darunter die Frage, welche Geräte den Rechner wecken dürfen. Die eigentlich entscheidende, wenn ein Energiesparmodus nicht hält.
Was konnte who.exe, das whoami nicht kann?
Heute nichts. whoami /all gibt Konto, Gruppenmitgliedschaften mit ihren Kennungen und Privilegien mit Erläuterungen aus: die vollständige Ausgabe, die das ältere Werkzeug aus drei getrennten Schaltern zusammensetzte. Bevor whoami zum Lieferumfang gehörte, brauchte diese Information ein Hilfsprogramm.
Laufen 32-Bit-Werkzeuge dieser Zeit noch?
Eine 32-Bit-Konsolenbinärdatei startet auf 64-Bit-Windows in der Regel über die Kompatibilitätsschicht. Ob sie etwas Sinnvolles tut, ist die andere Frage: einige riefen Schnittstellen auf, die entfernt oder ersetzt wurden, und eines lief für seine Arbeit als Dienst, was heutige Sicherheitsvorgaben erschweren. Als Dokumentation behandeln, nicht als Software.
Welche davon brauchten Administratorrechte?
Das Remote-Shutdown-Hilfsprogramm auf dem Ziel, weil es dort einen Dienst installierte. Das Ändern einer Dienst-Zugriffsliste auf dem geänderten Objekt. Der Rest lief, abgesehen von Hardlinks, die Schreibrecht im Verzeichnis brauchen, als gewöhnliches Konto, was Teil des Sinns der Sammlung war.
Woher kam die MFC-Abhängigkeit?
Zwei Laufzeitarchive lagen der Sammlung bei, weil einige der grafischen Bestandteile dynamisch gegen die Microsoft Foundation Classes gebunden waren statt statisch. Die Konsolenprogramme brauchten sie nicht. Eine fehlende Laufzeitbibliothek, die einen sofortigen Startfehler erzeugt, war ein Alltagsärgernis der Epoche und der Grund für diese Archive.