Newsgroup: it.comp.lang.visual-basic
Titolo: Win2000 e ShutDown Forzato nn si può!

Ci rinuncio.
č un po di tempo che cerco il modo per spegnere il PC da codice. tutte le
Tips trovate (API ExitWindowsEx, Rundll32, .....) vanno benone sotto Win9x
MA NON sotto 2000, dove al massimo ottengo un "inutile" logoff.
Nessuno ci č riuscito? una Apettina nascosta nn documentata?!?  io needo
help!

 MA NON sotto 2000, dove al massimo ottengo un "inutile" logoff.
Allora... questo è un programmino che ho fatto io con un po' di taglia e
incolla...
Option Explicit
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long,
ByVal dwReserved As Long) As Long
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const EWX_POWEROFF = 8
Private StopTime As Date
Const Seconds = 1 / 24 / 60 / 60
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Type LUID
    UsedPart As Long
    IgnoredForNowHigh32BitPart As Long
End Type
Private Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    TheLuid As LUID
    Attributes As Long
End Type
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias
"LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As
String, lpLuid As LUID) 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 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 Const VER_PLATFORM_WIN32s = 0
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32_NT = 2
Private Type OSVERSIONINFO
   dwOSVersionInfoSize As Long
   dwMajorVersion As Long
   dwMinorVersion As Long
   dwBuildNumber As Long
   dwPlatformId As Long
   szCSDVersion As String * 128
End Type
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA"
(lpVersionInformation As OSVERSIONINFO) As Long
Private Function IsNT() As Boolean
Dim OSVI As OSVERSIONINFO
OSVI.dwOSVersionInfoSize = Len(OSVI)
GetVersionEx OSVI
If OSVI.dwPlatformId = 2 Then IsNT = True
End Function
Private Sub AdjustToken()
    Dim hdlProcessHandle As Long, hdlTokenHandle As Long, lBufferNeeded As
Long
    Dim tmpLuid As LUID
    Dim tkp As TOKEN_PRIVILEGES, tkpNewButIgnored As TOKEN_PRIVILEGES
    hdlProcessHandle = GetCurrentProcess()
    OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or
TOKEN_QUERY), hdlTokenHandle
    LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
    tkp.PrivilegeCount = 1
    tkp.TheLuid = tmpLuid
    tkp.Attributes = SE_PRIVILEGE_ENABLED
    AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored),
tkpNewButIgnored, lBufferNeeded
End Sub
Public Sub Spegni()
  If IsNT Then
    AdjustToken
    ExitWindowsEx EWX_POWEROFF + EWX_FORCE, 0
  Else
    ExitWindowsEx EWX_SHUTDOWN + EWX_FORCE, 0
  End If
End Sub
Spero di essere stato chiaro...
Ignazio

davvero notevole!
Ma hai verificato sotto Win2000? xkè pure io ho usato quella API
(ExitWindowsEx) ma con scarsa fortuna...
cmq grazie. nn mancherò di provarlo!

 (ExitWindowsEx) ma con scarsa fortuna...
L'API "ExitWindowsEx" funziona sotto NT, solo bisogna prima
settare i permessi per lo ShutDown, il codice di Neclepsio
funziona senz'altro (un altro esempio analogo lo trovi su
API-Guide)
Solo ti consiglio di sostituire FORCE con FORCEIFHUNG, in questo
modo i processi vengono terminati solo se non rispondono dopo un
certo periodo, e non immediatamente.
la costante è "EWX_FORCEIFHUNG = &H10"
Considera inoltre che su computer più vecchi sia POWEROFF che
FORCEIFHUNG possono non funzionare, sul mio vecchio PC + Win98 è
sufficiente dare il parametro "SHUTDOWN" per ottenere uno
spegnimento completo.

 (ExitWindowsEx) ma con scarsa fortuna...
Sì, ma tu hai usato anche tutte le altre? >:)
Ciao

Ok, mi pare di capire che questa č la vota buona che spengo tutto anke sotto
w2000.
Grazie per l'aiuto e buone vacanze!! (per chi le fa... sob)
^_*

 needo help!
oh signore. Aiuto per cosa? per imparare a leggere?
"ExitWindowsEx
[...]
Parameters
    uFlags
Specifies the type of shutdown. This parameter must be some combination 
of the following values: 
Value           Meaning
EWX_POWEROFF    Shuts down the system and turns off the power. The
                system must support the power-off feature.
                Windows NT: The calling process must have the
                SE_SHUTDOWN_NAME privilege. For more information, see
                the following Remarks section.
[...]
EWX_REBOOT      Shuts down the system and then restarts the system.
                Windows NT: The calling process must have the
                SE_SHUTDOWN_NAME privilege. [...]
EWX_SHUTDOWN    Shuts down the system to a point at which it is safe to
                turn off the power. All file buffers have been flushed
                to disk, and all running processes have stopped.
                Windows NT: The calling process must have the [...]
Remarks
[...]
Windows NT: To shut down or restart the system, the calling process 
must use the AdjustTokenPrivileges function to enable the 
SE_SHUTDOWN_NAME privilege. For more information about security 
privileges, see Privileges. 
[...]"
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.19. C, C++ and ASM developers
                              and beta testers are welcome!

 (ExitWindowsEx) ma con scarsa fortuna...
L' ho provato io e funziona!
Fabrizio

> oh signore. Aiuto per cosa? per imparare a leggere?
.... in che senso??!?

 .... in che senso??!?
Nel senso che nell'help di quella funzione c'è scritto perché
non ti funziona. E te l'ha anche scritto ed evidenziato nel post.
Anche Dimio ha sottolineato dov'è il tuo problema.
Bye, G.