Bonjour,
J'ai un comportement assez bizarre avec la commande ftp.exe et j'aimerais comprendre pourquoi.
J'ai le script suivant que je vais appelé test_ftp.bat:
(dans le fichier ftp_cmd.lst il y a juste une ouverture de session)
Lorsque je lance le .bat depuis une fenêtre DOS le comporte est normal: avec l'option '-v' le mode verbose est désactivé.@echo off
ftp.exe -v -n -i -s:C:\scripts\ftp_cmd.lst
exit 0
Lorsque je modifie le .bat et que j'enlève l'option '-v', la encore le comportement et normal: le mode verbose est activé.C:\scripts\>test_ftp.bat
ftp> open serveur1.com
ftp> user toto xxx
ftp> quit
Mon problème c'est que lorsque je lance ce même .bat via un CreateProcessAsUser, le comportement est inverséC:\scripts\>test_ftp.bat
ftp> open serveur1.com
Connecté à serveur1.com.
220 (vsFTPd 1.2.1)
ftp> user toto xxx
331 Please specify the password.
230 Login successful.
ftp> quit
221 Goodbye.
Avec l'option '-v' le mode verbose est activé et vice versa.
Mon programme est lancé via un service.
Voici un extrait du code:
J'ai fait pas mal de tests mais je n'arrive pas à corriger le problème. Je suis arrivé à le faire fonctionner en faisant les redirections directement dans la ligne de commande, mais bon c'est le code ci-dessus que je voudrais faire fonctionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 bInheritHandles = TRUE; memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); saLogStd = malloc(sizeof(SECURITY_ATTRIBUTES)); saLogStd->nLength = sizeof(SECURITY_ATTRIBUTES); saLogStd->lpSecurityDescriptor = NULL; saLogStd->bInheritHandle = TRUE; hdlLogStd = CreateFile( "C:\\scripts\\test_std.log", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, saLogStd, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); hdlLogErr = CreateFile( "C:\\scripts\\test_err.log", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, saLogStd, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); si.hStdOutput = hdlLogStd; si.hStdError = hdlLogErr; si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); si.dwFlags = STARTF_USESTDHANDLES CreateProcessAsUser( *htok, "C:\\scripts\\test_ftp.bat", "C:\\scripts\\test_ftp.bat", 0, 0, bInheritHandles, CREATE_UNICODE_ENVIRONMENT | NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, pEnvBlock, 0, &si, &pi );
Voici le code qui fonctionne:
Si quelqu'un a une idée pour faire fonctionner le code qui utilise les handles je suis preneur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); CreateProcessAsUser( *htok, "C:\\scripts\\test_ftp.bat", "C:\\scripts\\test_ftp.bat >C:\\scripts\\test_std.log 2>C:\\scripts\\test_err.log", 0, 0, 0, CREATE_UNICODE_ENVIRONMENT | NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, pEnvBlock, 0, &si, &pi );
Merci
Partager