Exit Windows

Résolu
Signaler
Messages postés
41
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
23 février 2009
-
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
-
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

Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
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);
}
}
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
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;}
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Salut, il faut que tu regardes dans le platform SDK ou sur MSDN la fonction ExitWindowsEx ( peut être y'a mieux ! ).
Messages postés
41
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
23 février 2009

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?
Messages postés
41
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
23 février 2009

Merci pour l'info t_barbillon, mais comment tu fais pour inclure des dll, en fait où faut-il mettre le code ?



Thanks...
Messages postés
41
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
23 février 2009

C bon pour insérer les dll, j'ai trouvé, merci encore t_barbillon!!!



$?v?n'@c?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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.
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
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)
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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.
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
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