UTILITAIRE POUR LANCER UN PROGRAMME DEPUIS UN AUTRE COMPTE (RUN AS)

cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 - 23 juil. 2008 à 19:08
cs_couf Messages postés 213 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 6 janvier 2011 - 6 janv. 2011 à 12:41
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47397-utilitaire-pour-lancer-un-programme-depuis-un-autre-compte-run-as

cs_couf Messages postés 213 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 6 janvier 2011 1
6 janv. 2011 à 12:41
Bon binnnnnnnnn ça marche pas chez moi non plus pourtant cela m'aurait été for utile, j'ai quand même 2 warning à la compilation sur des variables non trouvés
Dommage dites moi si vous avez du mieux....
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
28 juil. 2008 à 13:24
Je viens de chercher sur Google des infos concernant CreateProcessWithLogon et win2k et en résumé j'ai pu lire plusieurs fois:
"it works on a w2k workstation, but doesnt work on a win2k server"

On peut apparemment arriver à faire fonctionne LogonUser (chez toi ça ne passe même pas ce stade) en changeant les stratégies locales de sécurité dans le panneau de configuration, mais CreateProcessWithLogonW ne fonctionne pas pour autant. J'ai aussi lu que quelqu'un aurait peut-être réussi en créant un service à la place.

A++, Forman
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
28 juil. 2008 à 13:18
Là je crois que tu as à peu près tout essayé... effectivement la conclusion ça doit être que ça ne marche pas sous win2k :-(

A++, Forman
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
28 juil. 2008 à 13:10
Le win2K est sur mon PC au boulot. Nous sommes sur le domaine EU (Europe)
- Si je ne mets pas le nom de domaine : meme message.
- Si je ne mets pas de domaine mais qu'en utilisateur de mets domaine/utilisateur, domaine\utilisateur ou utilisateur@domaine : meme message.
- Si je prends un profil administrateur local (sur mon PC) que ce soit avec en domaine le nom de mon PC ou sans domaine : meme message.

Je ne sais plus quoi tester. Si tu as une idée...

a+ Pascal
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
28 juil. 2008 à 12:48
Bonjour Pascal99,

Pour le 1) il semblerait donc que depuis le début ce soit un bug du compilateur! Dans ce cas-là, un truc tout bête: essaie de désactiver les optimisations dans les options su projet. Parfois j'ai eu de grosses surprises comme ça. Pour info j'utilise Delphi 7.

Pour le 2) j'ai vu que tu spécifiais explicitement le nom de domaine. Que se passe-t-il si tu ne le mets pas? Il faut prendre garde aussi que les mots de passe doivent être case-sensitive.

A bientôt
Forman
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
28 juil. 2008 à 09:49
Bonjour Forman,
1) j'ai essayé avec ton .exe sous Win2K et il n'y a plus le plantage.
Tu as compilé ton prog avec quelle version ? (moi c'etait avec Delphi Pro 5).

2) Maintenant, quelque soit le profil que j'utilise, le message d'erreur est :
Error: Could not log user in
Le client ne dispose pas d'un privilÞge nÚcessaire.

Win2K n'a pas l'air d'aimer to prog.

a+
Pascal99
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 19:39
Bon week-end toi aussi, et merci pour ton aide.

Forman
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
24 juil. 2008 à 18:55
la je suis sur une machine en Vista SP1 et ca fonctionne nickel avec le prog actuellement dans le zip.
Pour le Win2K, je ne pourrais retester que lundi.

En attendant, bon week-end.
Pascal99
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 16:41
C'est vraiment incompréhensible. Peut-être un bug du compilateur pour le code qui s'occupe du passage des paramètres à la fonction?

Essaie peut-être de passer les paramètres à la fonction RunProcessAs en tant que 'var' ou 'const' (surtout le array of string). Ou même de changer la convention d'appel (stdcall).

Et avec l'exe compilé que j'ai mis dans le zip, ça plante aussi?
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
24 juil. 2008 à 16:21
Exactement la meme erreur que ce soit avec la 1ere piste, la 2eme ou les 2 en meme temps.

Je doit t'avouer que je n'y comprends rien car dans Main, juste avant l'appel a RunProcessAs j'ai forcé toutes les variables comme dans Main2 et j'ai tj la meme erreur :-(
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 15:44
J'ai fait un "fix" de ParamStr et ParamCount au cas où le problème viendrait de là. Si tu mets ça en début de programme ça remplacera les fonctions existantes de Delphi.

var
GCommandLine:array of string;
GCommandLineParsed:Boolean=False;

procedure ParseCommandLine;
(*
Parse program command-line and extract arguments, strip quotes.
*)
var
s:string;
p:PChar;
c:Char;
t,u:Boolean;

procedure AddCurrentString;
begin
SetLength(GCommandLine,High(GCommandLine)+2);
GCommandLine[High(GCommandLine)]:=s;
s:='';
end;

begin
if GCommandLineParsed then
Exit;
p:=GetCommandLine;
s:='';
t:=False;
u:=False;
SetLength(GCommandLine,0);
repeat
c:=p^;
case c of
#0..' ':begin
if u and not t then
AddCurrentString;
u:=False;
end;
'''','"':begin
if t then
AddCurrentString;
t:=not t;
u:=False;
end;
else
s:=s+c;
u:=True;
end;
Inc(p);
until c=#0;
GCommandLineParsed:=True;
end;

function ParamCount:Integer;
(*
Fix for Win2000
*)
begin
ParseCommandLine;
Result:=High(GCommandLine);
end;

function ParamStr(const Index:Integer):string;
(*
Fix for Win2000
*)
begin
ParseCommandLine;
Assert((Index>=0) and (Index<=High(GCommandLine)),'Invalid parameter index ('+IntToStr(Index)+')');
Result:=GCommandLine[Index];
end;

Autre piste: peut-être que c'est le ExitCode:= qui pose problème. As-tu essayé de faire seulement
RunProcessAs(ParamStr(b),t,Username,Password,Domain,WorkingDir);
?
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
24 juil. 2008 à 15:28
Dans Main j'ai mis des writeln des variables juste avant l'appel a RunProcessAs

writeln('ParamStr(b): ',ParamStr(b));
writeln('Username: ',Username);
writeln('Password: ',Password);
writeln('Domain: ',Domain);
writeln('WorkingDir: ',WorkingDir);
ExitCode:=RunProcessAs(ParamStr(b),t,Username,Password,Domain,WorkingDir);

ParamStr(b): dir.exe
Username: mon_profil
Password: mon_mdp
Domain: EU
WorkingDir:
Error: Violation d'accÞs Ó l'adresse 00403998 dans le module 'RunAs.exe'. Lecture de l'adresse FFFFFFF7
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
24 juil. 2008 à 14:39
Si ca peux t'aider :
ParamCount=7
ParamStr(0): C:\Delphi\RUN-AS\RunAs.exe
ParamStr(1): ---U
ParamStr(2): mon_profil
ParamStr(3): ---D
ParamStr(4): EU
ParamStr(5): ---P
ParamStr(6): mon_mdp
ParamStr(7): dir.exe
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 14:27
L'erreur dont tu parles est normale je pense.

Donc vraisemblablement l'erreur se situe dans le parsing des arguments. Je vais relire attentivement et peut-être en faire une autre version. Ceci dit, j'ai peur que le problème vienne d'une spécifité de Win2k au niveau de la génération des ParamCount/ParamStr depuis la ligne de commande.
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
24 juil. 2008 à 14:21
Main2 et Main3 : plus de plantage mais j'ai une autre erreur :
Error: Could not log user in
Le client ne dispose pas d'un privilÞge nÚcessaire.
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 13:57
ah oui, et aussi avec celle ci:

procedure Main3;
var
Username,Password,Domain,WorkingDir:string;
begin
Username:='...';
Password:='...';
Domain:='';
WorkingDir:='';
RunProcessAs('dir.exe',['/?'],Username,Password,Domain,WorkingDir);
end;
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 13:55
Dans ce cas la seule explication que je vois c'est que l'erreur vient du code avant d'appeler RunProcessAs. Si tu as le temps, pourrais-tu remplacer l'appel à la fonction main (tout à la fin du programme, dans le begin...end principal) par l'appel à cette fonction-là, après avoir renseigné le bon user/pass, et me dire ce qui se passe:

procedure Main2;
var
t:array of string;
Username,Password,Domain,WorkingDir:string;
begin
Username:='...';
Password:='...';
Domain:='';
WorkingDir:='';
SetLength(t,0);
RunProcessAs('dir.exe',t,Username,Password,Domain,WorkingDir);
end;

J'ai essayé avec ta ligne de commande (---U mon_profil ---D EU ---P mon_mdp dir.exe) et pourtant chez moi ça fonctionne nickel
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
24 juil. 2008 à 13:39
Ca ne change rien (exactement la meme erreur)
en mode debug, l'erreur se produit sur le Begin de RunProcessAs.

function RunProcessAs(Command:string;Parameters:array of string;Username,Password:string;Domain:string='';WorkingDirectory:string='';Wait:Boolean=False):Cardinal;

var
a:Integer;
n:Cardinal;
h:THandle;
p:Pointer;
PI:TProcessInformation;
SI:TStartupInfo;
//t:array[0..MAX_PATH] of WideChar;
t:array[0..MAX_PATH] of Char;
wUser,wDomain,wPassword,wCommandLine,wCurrentDirectory:WideString;
begin <-- ici
Writeln('Debug');
Sleep(10000);
ZeroMemory(@PI,SizeOf(PI));
ZeroMemory(@SI,SizeOf(SI));
...
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 13:27
Oui, mais ça ne devrait pas poser problème pour autant, le cas est prévu.

RunProcessAs devrait être lancée avec les paramètres suivants dans ton cas:
Command='dir.exe'
Parameters=[]
UserName='mon_profil'
Password='mon_mdp'
Domain=''
WorkingDirectory=''
Wait=false

Ensuite avec la séquence:
wCommandLine:=Command;
for a:=Low(Parameters) to High(Parameters) do
wCommandLine:=wCommandLine+' '+FormatParam(Parameters[a]);
On a:
wCommandLine='cmd.exe'
(en effet Low(Parameters)=0 et High(Parameters)=-1 puisque le tableau est vide)

C'est peut-être là-dedans que se situe le problème:
if Domain='' then begin
n:=SizeOf(t);
if not GetComputerNameW(t,n) then
OSError('Could not get computer name');
wDomain:=t;
end
Si la fonction GetComputerNameW n'a pas fonctionné correctement (exemple: pas de zéro terminal à la fin de la chaine) l'affectation wDomain=t peut poser problème.

Est-ce que tu peux essayer, si tu as le temps, de changer:
t:array[0..MAX_PATH] of WideChar;
en:
t:array[0..MAX_PATH] of Char;
et de remplacer:
GetComputerNameW(t,n)
par:
GetComputerName(t,n)
(sans le W donc, comme la version unicode)

Je ne vois pas trop à part ça ce qui pourrait causer une violation d'accès en lecture.
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
24 juil. 2008 à 13:13
non, c'est le t de la procedure Main.

voici mes parametres : ---U mon_profil ---D EU ---P mon_mdp dir.exe

b etant equal a ParamCount (=7), t est vide.
en effet :
- SetLength(t,ParamCount-b)=0
- on ne passe jamais dans for a:=b+1 to ParamCount do t[a-b-1]:=ParamStr(a);
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 12:13
Alors dans ce cas-là il faut peut-être remplacer PWideChar(wDomain) par nil dans l'appel de CreateProcessWithLogon
(si le "t" dont tu parles c'est bien la variable locale de la fonction RunProcessAs).
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
24 juil. 2008 à 11:52
C'est a l'appel de RunProcessAs qu'il y a un pb.
A priori t est vide
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
24 juil. 2008 à 11:31
Salut Forman,

je suis tout à fait d' accord avec toi, c' est juste une mauvaise habitude ^^

A+
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 11:27
Mauricio: Merci. Moi j'ai arrêté définitivement le mode admin depuis que j'ai vu que ça rendait 99.99% des virus et assimilés inopérants. J'ai déjà fait le test de lancer des exe infectés depuis un compte restreint, parfois le PC plante mais jamais le truc n'a eu la possibilité de s'installer durablement. Et une fois que tu as bien configuré les différentes permissions d'accès en fonction de l'usage que tu souhaites sur ton compte restreint, ça reste quand même raisonnablement pratique.

Pascal: Bonjour,
je n'ai pas la possibilité de tester sous Win2K chez moi. Est-ce que tu as des détails sur l'endroit où se produit la violation?

Par exemple en rajoutant
Writeln('Debug');
Sleep(10000);
au tout début de la fonction RunProcessAs, est-ce que tu le vois s'afficher dans la console ou est-ce que ça plante avant?

Merci pour les '.dll' déjà en tout cas :-)
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
24 juil. 2008 à 11:08
Bonjour,
j'ai testé ton prog en Win2K et il me dit que "userenv" est introuvable.
En effet il manque les ".dll" dans les external.

Une fois recompilé, a l'execution d'une commande dir j'ai le message :
Error: Violation d'accÞs Ó l'adresse 00403908 dans le module 'RunAs.exe'. Lecture de l'adresse FFFFFFF7
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
24 juil. 2008 à 10:39
Salut Forman,

je trouve la source interessante (c' est très bien écrit) même si je log toujours en admin.
Ça va servir en tout cas pour les mordus de la sécu.

A+
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
23 juil. 2008 à 19:08
J'ai oublié de le préciser: il faut au moins Win NT ou XP pour que ça fonctionne (je ne sais pas si ça marche toujours sous vista). En outre, il n'est pas possible de lancer en même temps plusieurs commandes d'un autre compte avec ce système (il faut attendre que la première soit terminée avant d'en lancer une autre).
Rejoignez-nous