Extinction machine

Signaler
Messages postés
4
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
26 février 2007
-
Messages postés
4
Date d'inscription
lundi 15 novembre 2004
Statut
Membre
Dernière intervention
18 juillet 2006
-
J'ai developpé une appli client serveur pour eteindre automatiquement les postes de mon reseau.
J'utilise sur le client installé sur tous les postes l'API  ExitWindowsEx .

Ca marche impec sauf que si aucune session n'est ouverte sur la machine, le poste plante mais ne s'arrete pas, alors que si une session est ouverte sur le reseau, le poste eteind normalement.

Cela ne se produit que sur xp, sur 98 tout se passe bien.

Quelqu'un aurait une idée ???

3 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
teste l'OS pour faire différemment sous XP. voir sources.

bonjour?
de rien.
Messages postés
4
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
26 février 2007

C'est deja fait tu pense bien

Sous 98 aucun probleme connecté ou non alors que sous xp apres le test d'os et utilise le code pour arreter la machine ca marche si on est conneste mais si on attend le nom d'utilisateur et le mot de passe à l'ouverture de session ca bloque.

En fait mon appli est lancée en service windows donc demarre des le lancement de windows.

je voudrais pouvoir arreter les machine sur lequelle aucune session n'est ouverte sinon celle la resteront allumé et c'est pad le but.
Messages postés
4
Date d'inscription
lundi 15 novembre 2004
Statut
Membre
Dernière intervention
18 juillet 2006

J'utilise le code suivant et ca marche bien. Mon application est en service et aucune session n'est ouverte. Il reste à ajuster les params de la fonction ExitWindowsEx dépendant si l'on veut un shutdown ou un reboot.

Public Type LUID
   UsedPart As Long
   IgnoredForNowHigh32BitPart As Long
End Type


Public Type TOKEN_PRIVILEGES
  PrivilegeCount As Long
  TheLuid As LUID
  Attributes As Long
End Type


Public Const EWX_SHUTDOWN As Long = 1
Public Const EWX_FORCE As Long = 4
Public Const EWX_REBOOT = 2


Public Declare Function ExitWindowsEx Lib "user32" (ByVal _
     dwOptions As Long, ByVal dwReserved As Long) As Long


Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function OpenProcessToken Lib "advapi32" (ByVal _
   ProcessHandle As Long, _
   ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Public Declare Function LookupPrivilegeValue Lib "advapi32" _
   Alias "LookupPrivilegeValueA" _
   (ByVal lpSystemName As String, ByVal lpName As String, lpLuid _
   As LUID) As Long
Public Declare Function AdjustTokenPrivileges Lib "advapi32" _
   (ByVal TokenHandle As Long, _
   ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES _
   , ByVal BufferLength As Long, _
PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long


Private Sub redemarrage()
   Call AdjustToken
   ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
End Sub

Private Sub AdjustToken()
    Const TOKEN_ADJUST_PRIVILEGES = &H20
    Const TOKEN_QUERY = &H8
    Const SE_PRIVILEGE_ENABLED = &H2
    Dim hdlProcessHandle As Long
    Dim hdlTokenHandle As Long
    Dim tmpLuid As LUID
    Dim tkp As TOKEN_PRIVILEGES
    Dim tkpNewButIgnored As TOKEN_PRIVILEGES
    Dim lBufferNeeded As Long


    hdlProcessHandle = GetCurrentProcess()
    OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
       TOKEN_QUERY), hdlTokenHandle


 ' Get the LUID for shutdown privilege.
    LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid


    tkp.PrivilegeCount = 1    ' One privilege to set
    tkp.TheLuid = tmpLuid
    tkp.Attributes = SE_PRIVILEGE_ENABLED


' Enable the shutdown privilege in the access token of this process.
    AdjustTokenPrivileges hdlTokenHandle, False, _
    tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded


End Sub