CreateProcessWithLogonW [Résolu]

cs_Rankin 52 Messages postés lundi 29 mars 2004Date d'inscription 27 avril 2010 Dernière intervention - 13 août 2009 à 12:10 - Dernière réponse : cs_Rankin 52 Messages postés lundi 29 mars 2004Date d'inscription 27 avril 2010 Dernière intervention
- 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 ;)
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 13 août 2009 à 14:15
3
Merci
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>

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_rt15
cs_magma 198 Messages postés vendredi 4 avril 2003Date d'inscription 18 mars 2011 Dernière intervention - 13 août 2009 à 12:41
0
Merci
To compile an application that uses this function, define _WIN32_WINNT as 0x0500 or later.
Commenter la réponse de cs_magma
cs_Rankin 52 Messages postés lundi 29 mars 2004Date d'inscription 27 avril 2010 Dernière intervention - 13 août 2009 à 13:01
0
Merci
Yes, that's what I did, but it doesn't work anyway :/
Commenter la réponse de cs_Rankin
cs_Rankin 52 Messages postés lundi 29 mars 2004Date d'inscription 27 avril 2010 Dernière intervention - 13 août 2009 à 13:44
0
Merci
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 ?
Commenter la réponse de cs_Rankin
cs_Rankin 52 Messages postés lundi 29 mars 2004Date d'inscription 27 avril 2010 Dernière intervention - 13 août 2009 à 14:32
0
Merci
"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 :)
Commenter la réponse de cs_Rankin

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.