Exit Windows

Résolu
sevenace Messages postés 41 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 23 février 2009 - 21 juil. 2005 à 10:00
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 - 22 juil. 2005 à 08:47
Hello ,



Ca fait un petit moment que je cherche un procédé pour quitter windows, mais je n'y arrive pas !!!

Donc, voila en fait j'ai un programme qui vérifie si un processus est
toujours dans le task manager, grâce à un timer, et une fois qu'il
n'est plus présent, je dois arrêter le PC.



Donc à bon entendeur, je vous remercie d'avance !



$?v?n'@c?

10 réponses

t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
21 juil. 2005 à 12:55
d'abord faut inclure certaines dll de windows

[DllImport("kernel32.dll", ExactSpelling=true)]
private static extern IntPtr GetCurrentProcess();


[DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true)]
private static extern bool OpenProcessToken(IntPtr ProcessHandler, int acc, ref IntPtr ProcessToken);


[DllImport("advapi32.dll", SetLastError=true)]
private static extern bool LookupPrivilegeValue(string Host, string Name, ref long Luid);


[DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true)]
private static extern bool AdjustTokenPrivileges(IntPtr ProcessToken, bool disall,
ref TokenLUID Token, int Len, IntPtr prev, IntPtr ReLen);


[DllImport("user32.dll", ExactSpelling=true, SetLastError=true)]
private static extern bool ExitWindowsEx(int Flag, int Reason);

Ensuite voici ma fonction :
public static void reboot()
{
//Déclaration des variables
bool IsSuccess = true;
TokenLUID Privilege;

//Obtention d'un jeton de process pour le process courant
IntPtr ProcessHandler = GetCurrentProcess();//obtention du process courant
IntPtr ProcessToken = IntPtr.Zero;//initialisation par défaut du jeton de process
IsSuccess = OpenProcessToken(ProcessHandler, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref ProcessToken);

//Configuration du jeton de privilèges
Privilege.Count = 1;//nb de privilèges accordés
Privilege.Luid = 0;//initialisation par défaut du LUID
IsSuccess &= LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref Privilege.Luid);
Privilege.Attr = SE_PRIVILEGE_ENABLED;//autorisation des privilèges


//Configuration du privilege pour le process courant
IsSuccess &= AdjustTokenPrivileges(ProcessToken, false, ref Privilege, 0, IntPtr.Zero, IntPtr.Zero);

//Vérification du succes des paramétrages précédents
if (IsSuccess == true)
{
//Fermeture et redémarrage de windows avec forçage
//pour une raison de maintenance liée à l'application
ExitWindowsEx(EWX_REBOOT + EWX_FORCE, REASON_MAJOR_APPLICATION | REASON_MINOR_MAINTENANCE);
}
}
3
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
21 juil. 2005 à 12:58
Heu dsl j'ai oublié la déclaration de la structure pour le token

//STRUCTURES
[StructLayout(LayoutKind.Sequential, Pack=1)]
private struct TokenLUID {public int Count; public long Luid; public int Attr;}
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 juil. 2005 à 10:15
Salut, il faut que tu regardes dans le platform SDK ou sur MSDN la fonction ExitWindowsEx ( peut être y'a mieux ! ).
0
sevenace Messages postés 41 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 23 février 2009
21 juil. 2005 à 11:55
Impossible d'utiliser ExitwindowsEx, toutes les variables HANDLE etc.. ne sont pas reconnues en C#, même avec d'autres using.

Alors est ce que quelqu'un a déjà créer un bout de code pour arrêter le PC, parce que là j'ai l'impression de ne pas avancer !!!



Merci d'avance,



$?v?n'@c?
0

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

Posez votre question
sevenace Messages postés 41 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 23 février 2009
21 juil. 2005 à 13:49
Merci pour l'info t_barbillon, mais comment tu fais pour inclure des dll, en fait où faut-il mettre le code ?



Thanks...
0
sevenace Messages postés 41 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 23 février 2009
21 juil. 2005 à 14:02
C bon pour insérer les dll, j'ai trouvé, merci encore t_barbillon!!!



$?v?n'@c?
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 juil. 2005 à 14:09
Woow ! toutes ses permissions sont nécessaires !? On ne peut pas s'en passer !? Euh, y'a un truc qui me parait bizarre, pourquoi ce Pack = 1 dans la dernière structure !?


Sevenace, avec PInvoke on peut appeler des librairies non managées, sinon je ne t'aurais pas indiqué la méthode ExitWindowsEx.
0
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
21 juil. 2005 à 16:51
C vrai ya 1 erreur ce n'est pas 1 mais plutot 0 (l'os se charge de l'ordonancement des packets) ou 8 (vu que c du unmanaged)
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 juil. 2005 à 17:20
Vi , et pour les privilèges apparemment il n'y que sur Win98 qu'il ne sont pas obligatoires. J'ai croisé aussi sur un forum une méthode avec WMI.
0
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
22 juil. 2005 à 08:47
Encore dsl gt pas réveillé et j'ai oublié la liste des constantes : elle est pas complète, c juste celle que j'utilise dans la fonction.
Pour changer les paramètres fo voir http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/exitwindowsex.asp
/*-------------------------------- CONSTANTES --------------------------------*/

private const int SE_PRIVILEGE_ENABLED = 0x00000002;
private const int TOKEN_QUERY = 0x00000008;
private const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
private const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
private const int EWX_REBOOT = 0x00000002;
private const int EWX_FORCE = 0x00000004;
private const int REASON_MAJOR_APPLICATION = 0x00040000;
private const int REASON_MINOR_MAINTENANCE = 0x00000001;

/*----------------------------------------------------------------------------*/

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/exitwindowsex.asp
0
Rejoignez-nous