Je dois automatiser une application de ligne de commande. Il demande à l'utilisateur d'entrer un mot de passe. Toutes mes approches pour envoyer le mot de passe via STDIN ont échoué. Maintenant, j'essaye de le faire avec un wrapper-programm en utilisant .NET..NET: Injecter des données dans l'entrée-tampon du processus
Je commence l'application la création d'un nouveau processus, le réglage des StartInfo
-properties puis démarrer le processus:
Dim app_path As String
Dim app_args As String
Dim myProcess As Process = New Process()
myProcess.StartInfo.FileName = app_path
myProcess.StartInfo.Arguments = app_args
myProcess.StartInfo.UseShellExecute = False
myProcess.Start()
J'ai essayé d'utiliser la propriété StartInfo.RedirectStandardInput
mais sans succès.
Maintenant, je suis tombé sur la fonction WriteConsoleInput
du kernel32.dll
que j'inclus comme ceci:
Declare Function WriteConsoleInput Lib "kernel32.dll" Alias "WriteConsoleInputA" (ByVal hConsoleInput As Integer, ByVal lpBuffer As String, ByVal nNumberOfCharsToWrite As Integer, ByRef lpNumberOfCharsWritten As Integer) As Boolean
je peux obtenir la poignée du processus via la propriété myProcess.Handle
. Mais l'envoi d'une entrée dans le tampon d'entrée de cette manière n'était pas possible non plus.
Je trouve ces questions, mais ils n'ont pas aidé:
Comment puis-je écrire « Vers le bas » dans le tampon d'entrée de la console? (1475353)
Java - passage d'entrée dans une application externe C/C++ (1421273)
Commande d'un tuyau App console Windows w/stdin (723424)
Utilisation StraceNtX.exe I a obtenu cette sortie pour l'instant l'application est en attente d'entrée:
[T4024] GetConsoleMode(f, 12d35c, 12d3af, 77bff894, ...) = 1
[T4024] SetConsoleMode(f, 0, 12d3af, 77bff894, ...) = 1
[T4024] ReadConsoleInputA(f, 12d348, 1, 12d360, ...) = 1
quelqu'un peut-il me dire, quoi d'autre pour essayer ou comment faire ce qui précède la bonne façon? Merci!
Basé sur answere Tim Robinsons J'ai ce code maintenant, mais il ne fonctionne pas:
myProcess = New Process()
myProcess.StartInfo.FileName = app_path
myProcess.StartInfo.Arguments = app_args
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal
myProcess.StartInfo.UseShellExecute = False
myProcess.Start()
' Wait for process requesting passwort input
System.Threading.Thread.Sleep(3000)
Dim len As Integer
len = 0
Dim handle As Integer
handle = GetStdHandle(STD_INPUT_HANDLE)
WriteConsoleInput(handle, "Test", 4, len)
Mon programm est une application qui devrait agir commandline comme une enveloppe.
L'entrée est envoyée, mais d'une manière qu'il ne soit pas tapé dans le champ de mot de passe mais en dessous du champ de mot de passe une nouvelle PROMT est affiché (sans même montrer l'entrée).
Tim, pouvez-vous me donner un exemple?
Quelle est l'application qui a besoin du mot de passe? Il peut y avoir un moyen plus facile que cela. –
Il s'agit de l'application Cisco Certificate Manager Console cisco_cert_mgr.exe Mais j'ai déjà cherché une solution différente, mais il semble n'y en avoir aucune. – sc911