Alternativer Konsolenhost für Windows 7/Windows Server 2008

Alternativer Konsolenhost für Windows 7/Windows Server 2008

Ich bin oft frustriert über die Konsolenhostanwendung von Windows, insbesondere darüber, wie schwerfällig die Zwischenablage funktioniert, Probleme mit der automatischen Breite usw. Ich würde gerne wissen, ob es eine Möglichkeit gibt, den Standardkonsolenhost conhost.exedurch einen benutzerdefinierten zu ersetzen, und wo ich weitere Informationen zu den Schnittstellen finden kann, die ich implementieren müsste, wenn ich meine eigene schreiben würde.

Ich suche nicht nur nach einer alternativen Konsole, ich benutze sie bereits xtermvon CygWin. Ich suche nach Informationen, wie manersetzenDer Standard-Konsolenfenster-Host von Windows.

Antwort1

Nachfolgend finden Sie einige nette Produkte zum Konsolenersatz, die benutzerfreundlicher sind als cmd.

Wie unten kommentiert, sind seit Windows 7 alle diese Shells nur eine Schnittstelle zu conhost.exe, sogar Powershell. Weitere Einzelheiten finden Sie unterWas ist conhost.exe und warum wird es ausgeführt?.

Daher ersetzen die folgenden Konsolen nur die standardmäßige visuelle Schnittstelle zu Conhost, die von cmd angezeigt wird, und sind nur nützlich, wenn sie direkt als Programme aufgerufen werden. Sie können nicht indirekt aufgerufen werden, wie wenn eine Konsolen-ausführbare Datei wie diskpart ausgeführt wird, da dies Conhost aufruft und Conhost über eine eigene E/A-Schnittstelle und API verfügt.

Hier ist, was Microsoft sagt inWindows 7 / Windows Server 2008 R2: Konsolenhost:

ConHost stellt eine permanente Änderung in der Art und Weise dar, wie die E/A von Konsolenanwendungen gehandhabt wird. Es gibt keinen Registrierungsschlüssel oder keine Gruppenrichtlinieneinstellung, die Windows zwingen kann, zum Konsolenverhalten im „Legacy-Modus“ zurückzukehren.

Die Schlussfolgerung lautet: Wenn Sie die Konsole tiefergehend ersetzen möchten als die cmd-Schnittstelle, ist dies nicht möglich. Microsoft hat sich aus Sicherheitsgründen für dieses Design entschieden und wird nicht davon abweichen.

Die einzige Möglichkeit, die mir einfällt, das Verhalten von Conhost zu ändern, besteht darin, einen globalen System-Hook für die Conhost-API einzurichten. Ich weiß überhaupt nicht, ob das möglich ist, und bisher hat es noch niemand gemacht (oder wenn doch, sagen sie es nicht). Ich glaube auch nicht, dass Microsoft Ihnen erlauben wird, eine so wichtige Systemdatei wie conhost.exe durch eine gehackte Version zu ersetzen.

Wenn cmd ersetzt werden muss, das sich in system32\cmd.exe befindet, muss man Eigentümer der Datei werden und sie dann umbenennen (cmd1.exe?), die Konsolen-Ersatz-EXE in cmd.exe umbenennen und zusammen mit allen Dateien, die für die Funktion erforderlich sind, nach system32 kopieren. Dies kann zu Problemen führen, wenn die Ersatzkonsole nicht alle Parameter unterstützt, die cmd unterstützt.

Ein anderer Ansatz, der für .bat-Dateien funktioniert, besteht darin, ihnen die neue Konsole zuzuordnen. Dazu muss man den Registrierungsschlüssel bearbeiten HKEY_CLASSES_ROOT\batfile\shell\open\command. Siehe diesArtikelfür einige Details.

Hier ist die Liste der Konsolen:

Farbkonsole
FeuerCMD
PowerCmd
GS.EXE
PyCmd

Antwort2

Es gibt Programme wieKonsoledie cmd.exe umschließen und Ihnen wahrscheinlich das bieten, wonach Sie suchen, aber ich habe noch nichts gesehen, das das Konsolensystem vollständig ersetzt. Soweit ich weiß, leiten die meisten dieser Projekte einfach stdin/stdout/stderr um und hüllen dann cmd.exe in eine allgemeinere GUI, wobei das eigentliche Konsolenfenster im Hintergrund ausgeblendet wird.

Antwort3

Microsoft hat den Quellcode von conhost.exe veröffentlicht (https://github.com/microsoft/terminal).

Der Konsolenhostcode in diesem Repository ist die eigentliche Quelle, aus der conhost.exe in Windows selbst erstellt wird.

Jetzt haben Sie also die Möglichkeit, die Standard-conhost.exe durch Ihren eigenen Konsolenhost in Windows 10 zu ersetzen. Tatsächlich habe ich bereits einen solchen Versuch unternommen und Erfolg gehabt (https://github.com/microsoft/terminal/issues/1817).

Dann sagte Microsoft, dass der Quellcode von OpenConsole von conhost.exe stammt. Können wir dann conhost.exe direkt durch OpenConsole.exe ersetzen? Auf diese Weise erhalten wir einen besseren Standardkonsolenhost.

Ich habe es ausprobiert und es funktioniert gut. Obwohl OpenConsole als UWP-Anwendung verpackt ist, ist OpenConsole.exe eigentlich ein normales Win32-Fensterprogramm, das durch Doppelklicken auf die EXE-Datei ausgeführt werden kann. Sie finden es unter terminal\bin\x64\Release\OpenConsole.exe, wenn Sie einen x64-Release-Build erstellt haben.

Gehen Sie dann zu C:\Windows\System32, klicken Sie mit der rechten Maustaste auf conhost.exe, wählen Sie „Eigenschaften“ und bearbeiten Sie die Berechtigungsliste, um dem aktuellen Benutzer die Berechtigung „Vollzugriff“ zu erteilen.

Benennen Sie dann conhost.exe in conhost-old.exe um, kopieren Sie OpenConsole.exe hierher und benennen Sie es in conhost.exe um.

Öffnen Sie eine beliebige Konsolenanwendung (Powershell, WSL, …) und genießen Sie Ihre neue Konsole.

Es ist auch möglich, den OpenConsole-Quellcode auf Windows 7 zu portieren. Da Sie über den Quellcode verfügen, können Sie zudem alle gewünschten Funktionen hinzufügen.

Darüber hinaus hat Microsoft in Windows 10 auch die Windows Pseudo Console API eingeführt, mit der Entwickler Terminalanwendungen von Drittanbietern eleganter entwickeln können (Ja, sie wird über conhost.exe implementiert und sollte im von Microsoft veröffentlichten Code enthalten sein).

https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/

Hier sind die Dinge, für die conhost.exe tatsächlich verantwortlich ist:

(Aushttps://devblogs.microsoft.com/commandline/windows-command-line-inside-the-windows-console/)

Die Kernkomponenten der Konsole bestehen aus Folgendem (von unten nach oben):

  • ConDrv.sys – Kernel-Mode-Treiber

    • Bietet einen leistungsstarken Kommunikationskanal zwischen der Konsole und allen verbundenen Befehlszeilen-Apps
    • Übermittelt IO Control (IOCTL)-Nachrichten zwischen Befehlszeilen-Apps und der Konsole, an die sie „angeschlossen“ sind.
    • Konsolen-IOCTL-Nachrichten enthalten
      • Daten, die Anforderungen zum Ausführen von API-Aufrufen an die Konsoleninstanz darstellen
      • Von der Konsole an die Befehlszeilen-App gesendeter Text
  • ConHost.exe – Win32-GUI-App:

    • ConHost Core – das Innenleben und die Infrastruktur der Konsole

      • API-Server: Wandelt von Befehlszeilen-Apps empfangene IOCTL-Nachrichten in API-Aufrufe um und sendet Textdatensätze von der Konsole an die Befehlszeilen-App
      • API: Implementiert die Win32-Konsolen-API und die Logik hinter allen Vorgängen, die die Konsole ausführen kann.
      • Eingabepuffer: Speichert Tastatur- und Mausereignisdatensätze, die durch Benutzereingaben generiert werden
      • VT-Parser: Wenn aktiviert, analysiert er VT-Sequenzen aus Text, extrahiert alle gefundenen aus dem Text und generiert stattdessen entsprechende API-Aufrufe
      • Ausgabepuffer: Speichert den auf dem Display der Konsole angezeigten Text. Im Wesentlichen ein 2D-Array von CHAR_INFO-Strukturen, die die Zeichendaten und Attribute jeder Zelle enthalten (weitere Informationen zum Puffer finden Sie weiter unten).
      • Sonstiges: Nicht im obigen Diagramm enthalten sind die Einstellungsinfrastruktur zum Speichern/Abrufen von Werten aus der Registrierung und/oder Verknüpfungsdateien usw.
    • Console UX App Services – die Console UX & UI-Ebene

      • Verwaltet das Layout, die Größe, die Position usw. des Konsolenfensters auf dem Bildschirm
      • Zeigt und verwaltet die Benutzeroberfläche für Einstellungen usw. an.
      • Pumpt die Windows-Nachrichtenwarteschlange, verarbeitet Windows-Nachrichten und übersetzt Benutzereingaben in Tasten- und Mausereignisaufzeichnungen und speichert sie im Eingabepuffer

Antwort4

Ich würde empfehlen, entwederPower Shell, die Microsoft-Version eines Unix-Terminals für Scripting, Piping usw. oder dieMicrosoft Services für Unix(früher als SFU bekannt), das eigentlich ein komplettes Posix-Subsystem für Windows ist, das direkt auf dem Kernel läuft (also neben WIN32 und der Windows-API, nicht darauf. Auch hier gilt: Es wird nicht emuliert, sondern ist im Grunde Unix) und ermöglicht Ihnen die Nutzung aller (also der meisten) *nix-Technologien und -Shells. Es ist wirklich schade, dass Services for Unix nicht mehr Anklang gefunden hat.

verwandte Informationen