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 ;)
A voir également:

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
14
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
1
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