Newsgroup: it.comp.lang.visual-basic
Titolo: API + Spegnimento PC

Ciao a tutti,
Stò usando la funzione  ExitWindowsEx per spegnere il computer con Windows
Xp.
Riesco solamente a disconnettere l'utente ma non ad arrestare il sistema.
E' corretta questa funzione con XP??
Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long,
ByVal dwReserved As Long) As Long
Grazie mille.

 ha scritto nel messaggio
news:bf0bs7$iel$1...@newsreader.mailgate.org...

suppongo che "spegnere" XP sia come spegnere 2K, essento tutti e due
progettati sotto NT, quidi per quel che ne so e per quel che ho provato non
è sufficente richiamare ExitWindowsEx, perché bisognerebbe
ricavare i privilegi dei vari processi aperti,  reimpostarli in modo
corretto, e poi richiamare l'ExitWindowsEx.
--
Ciao
Alfredo

Cioè??
perchè riesco a disconnettere e non  a spegnere?
Quale funzione dovrei usare??


 Quale funzione dovrei usare??
Va bene ExitWindowsEx, come ti hanno detto, con i parametri opportuni, ma
solo se hai i diritti necessari.
Per provare, accedi come Administrator ed esegui il programma: se il
computer si spegne, è quello. Sennò, guarda la guida delle funzione, su
http://www.mentalis.org/apilist/ExitWindowsEx.shtml
L'ho vista di sfuggita, ma pare sia spiegato anche come impostare le giuste
autorizzazioni.

 Quale funzione dovrei usare??
Private Type LUID
    LowPart As Long
    HighPart As Long
End Type
Private Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    LuidUDT As LUID
    Attributes As Long
End Type
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Private Declare Function GetVersion Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal
ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As
Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias
"LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As
String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal
TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As
TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As Any,
ReturnLength As Any) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal dwOptions As
Long, ByVal dwReserved As Long) As Long
Sub ShutDownWindows(ByVal Reboot As Boolean, Optional ByVal ForceMode As
Boolean)
    'Token handle della funzione
    Dim hToken As Long
    'struttura dei privilegi
    Dim tp As TOKEN_PRIVILEGES
    'opzioni di reboot
    Dim flags As Long
    'controllo sotto che versione di windows mi trovo
    'se maggiore di zero, allora sono sotto sistema NT
    If GetVersion() >= 0 Then
        'apro il processo per aggiustare i privilegi
        OpenProcessToken GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES Or
TOKEN_QUERY), hToken
        LookupPrivilegeValue "", "SeShutdownPrivilege", tp.LuidUDT
        'compleo i privilegi
        tp.PrivilegeCount = 1
        tp.Attributes = SE_PRIVILEGE_ENABLED
        'abilito o disabilito i privilegi
        AdjustTokenPrivileges hToken, False, tp, 0, ByVal 0&, ByVal 0&
    End If
    'preparo le opzioni di reboot
    If Reboot Then
        flags = EWX_SHUTDOWN Or EWX_REBOOT
    Else
        flasg = EWX_SHUTDOWN
    End If
    If Force Then flags = flags Or EWX_FORCE
    'richiamo l'API per la chiusura di windows
    ExitWindowsEx flags, &HFFFF
End Sub