CreateProcessWithLogonW

Résolu
cs_Rankin Messages postés 52 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 27 avril 2010 - 13 août 2009 à 12:10
cs_Rankin Messages postés 52 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 27 avril 2010 - 13 août 2009 à 14:32
Salut à tous,

J'ai créé un programme qui doit exécuter des commandes sous un compte admin. J'ai prévu le cas où un utilisateur simple exécute mon application : dans ce cas la commande sera exécutée avec d'autres privilèges.
J'utilise actuellement un appel au programme externe CPAU.exe, mais je n'en suis pas satisfait : ce n'est pas propre et j'ai un cas où la commande ne peu s'exécuter (appel à une fonction système dont les arguments comprennent des espaces).

Étant donné que CPAU.exe est fait en C++ et qu'il fait ce que je veux faire, il paraît logique que mon programme effectue lui-même la création de processus par un autre utilisateur.

Après recherche, j'ai constaté qu'il y avait plusieurs façons de faire : un LogonUser suivi de CreateProcessWithToken ou CreateProcessAsUser.
Comme apparemment de nombreuses personnes, j'ai rencontré l'erreur 1314, droits insuffisants.

Je me suis donc rabattu vers la fonction "CreateProcessWithLogonW" qui, semble-t-il, a été la solution miracle pour de nombreux programmeurs. Le problème, c'est qu'à la compilation, j'ai l'erreur suivante :

"`CreateProcessWithLogonW' undeclared (first use this function) "
Or, cette fonction est bien définie dans le header winbase.h que j'inclus dans mon programme, et Wxdev-c++ 6.10.2 que j'utilise me propose le choix de cette fonction en auto-complétion.

Dois-je ajouter un lien à la compilation, mon fichier winbase n'est-il pas correct, ... ?
J'avoue ne plus trop savoir quoi faire pour me dépêtrer de cette situation !

Merci pour vos conseils / aide / encouragements ;)

5 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
13 août 2009 à 14:15
Hi,

Why is it an english thread here ?

If you try this code :
#define TOTO 1
#define TOTO 2
#if TOTO == 1
  #error My compiler is stupid
#endif


You won't have the "My compiler is stupid" error but a warning :
warning C4005: 'TOTO' : macro redefinition

Consequently:
1) The last defined value is used.
2) There is a warning if you re-define something (But you can use #undef).

The common problem in your case is that your code looks like this:
#include <windows.h>
define _WIN32_WINNT 0x0500


Consequently, when you include winbase, _WIN32_WINNT is not yet defined.
_WIN32_WINNT must be defined before the first include of windows.h.
define _WIN32_WINNT 0x0500
#include <windows.h>
3
cs_magma Messages postés 198 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 18 mars 2011
13 août 2009 à 12:41
To compile an application that uses this function, define _WIN32_WINNT as 0x0500 or later.
0
cs_Rankin Messages postés 52 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 27 avril 2010
13 août 2009 à 13:01
Yes, that's what I did, but it doesn't work anyway :/
0
cs_Rankin Messages postés 52 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 27 avril 2010
13 août 2009 à 13:44
Well, I tried to comment the "#if (_WIN32_WINNT >= 0x0500)" in Winbase.h.
I encountered several other problems after, like invalid handles, but I finally managed to run my application.
How can I redefine the value of _WIN32_WINNT if it's already done with a value lower than 0x0500 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Rankin Messages postés 52 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 27 avril 2010
13 août 2009 à 14:32
"Why is it an english thread here ? "

Première réponse en anglais, j'ai suivi :)

Effectivement je faisais ma définition après l'inclusion avec un ifndef ; je risquais pas de modifier grand chose. Merci pour ces conseils !

PS : et je pense comprendre que la première réponse est un copier-coller de MSDN. Je me suis couvert de ridicule. Heureusement, ça ne tue pas :)
0
Rejoignez-nous