2017-05-22 3 views
0

Je souhaite créer une application de journalisation générique (Windows), qui doit être capable d'exécuter un exécutable arbitraire en tant que processus enfant et de consigner les flux standards complets d'un fichier spécifique à un fichier (stdin, stdout, stderr). En outre, cette application de journalisation doit agir comme une sorte d'application "Man-in-the-Middle" complètement transparente, de sorte que pour l'utilisateur qui appelle l'exécutable original ou l'application de journalisation de l'emballage, il n'y a pas différence. Cette fonctionnalité est en quelque sorte similaire à l'outil de ligne de commande UNIX "tee", mais pour autant que je sache, cet outil ne peut malheureusement pas enregistrer aussi le stdin (seuls stdout et stderr sont supportés). En outre, je souhaite enregistrer d'autres informations, par ex. qui était le processus parent appelant, timestamps ...Journalisation transparente des flux standard de processus enfant (Windows)

Je veux utiliser cela en particulier pour l'invite de commande: "cmd.exe" et renommez l'original et le remplacer par mon propre "cmd.exe" pour obtenir automatiquement un fichier historique de toutes les commandes entrées (stdin), avec ses sorties (stdout, stderr).

Est-ce que quelqu'un a une bonne idée de comment réaliser cela facilement, peut-être avec du C# et des tuyaux?

Cordialement, Andreas

+0

Il n'y a pas de solution facile. Les processus peuvent faire la différence entre une poignée de tuyau et une poignée de console et, dans la plupart des cas, se comportent différemment. –

+0

@HarryJohnston ne devrait-il pas être dans de rares cas? La plupart des applications de console utilisent probablement cout/printf et ne se soucient pas de l'autre extrémité. Les applications interactives sont une histoire différente bien sûr, mais elles sont en minorité? – Anders

+0

@Anders, malheureusement, 'cout' et' printf' sont des exemples de fonctions qui se comportent différemment pour un pipe (sortie tamponnée par défaut) que pour un handle de console (sortie unbuffered par défaut). –

Répondre

1

Une version simple serait en effet utiliser des tuyaux. Dans une application native win32, vous devez créer des canaux héritables et les définir, ainsi que le drapeau STARTF_USESTDHANDLES dans la structure STARTUPINFO transmise à CreateProcess. Il y a un exemple de code pour ce on MSDN. Vous ne pouvez cependant pas l'utiliser pour remplacer cmd.exe car cmd.exe utilise également l'API de console Windows spéciale en mode interactif pour implémenter des fonctionnalités telles que la boîte de dialogue d'historique F7 F7 . Vous pouvez jeter un oeil à certains des remplacements de terminaux gratuits comme Console2 pour voir comment ils le font.