Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Riavviare il PC

Ciao a tutti,
1) Sapere l'API per Arrestare/Riavviare/Sloggare un win95/98?
2) E per WinNT?
GRAZIE 1000 per ogni aiuto!

Se non ricordo male c'è un esempio sul sito comune.


magari, ci ho già guardato, c'e' solo un'OCX, ed io preferisco di gran lunga
i sorgenti, anche perchè se ricordo bene è una semplice API (ed usare un
intero OCX per un'api....)
GRAZIE!
Stefano

...

Visto che anche tu preferisci il codice agli ocx di altri...
'ShutDown
Public Const EWX_LOGOFF = 0&    'Relog
Public Const EWX_SHUTDOWN = 1&  'Incondizionato
Public Const EWX_REBOOT = 2&    'Reboot Machine
Public Const EWX_FORCE = 4&     'Reset Shell
Public Const EWX_POWEROFF = 8&  'S.D. and Power off the machine if p.o.
feature is supported
    Declare Function ExitWindowsEx Lib "User" Alias "ExitWindows" (ByVal
dwReturnCode As Long, ByVal wReserved As Integer) As Long
Per W95 e W98 può bastare un
    Call ExitWindowsEx(EWX_SHUTDOWN, 0&)
    puoi concatenare i vari valori con un OR
Per WNT è molto più complesso perche il SO non ti dà le permissions per
spegnere la macchina: mi sembra che il massimo che puoi fare sia un logoff.
MSDN dice di fare così per fare uno SD di WinNT ma non l'ho mai provato
(fammi sapere se funziona)
--------------
Option Explicit
      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
      ' Beginning of Code
      Private Const EWX_SHUTDOWN As Long = 1
      Private Const EWX_FORCE As Long = 4
      Private Const EWX_REBOOT = 2
      Private Declare Function ExitWindowsEx Lib "user32" ( _
         ByVal dwOptions As Long, ByVal dwReserved As Long) 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 TOKEN_PRIVILEGES, ReturnLength As Long) As Long
      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
      Private Sub cmdForceShutdown_Click()
         AdjustToken
         ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
      End Sub
-----------------
La guida ufficiale per i valori dei parametri dice:
uFlags (dwReturnCode)
Specifies the type of shutdown. This parameter must include one of the
following values: Value Meaning
EWX_LOGOFF Shuts down all processes running in the security context of the
process that called the ExitWindowsEx function. Then it logs the user off.
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.
For more information, see the following Remarks section.
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 SE_SHUTDOWN_NAME privilege.
For more information, see the following Remarks section.
This parameter can optionally include the following values: Value Meaning
EWX_FORCE Forces processes to terminate. When this flag is set, the system
does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can
cause the applications to lose data. Therefore, you should only use this
flag in an emergency.
EWX_FORCEIFHUNG Windows NT 5.0 and later: Forces processes to terminate if
they do not respond to the WM_QUERYENDSESSION or WM_ENDSESSION message. This
flag is ignored if EWX_FORCE is used.
dwReserved
Reserved; this parameter is ignored.
Return Values
If the function succeeds, the return value is nonzero.


Per riavviare il PC
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long,
ByVal dwReserved As Long) As Long
Poi ad esempio in Form_Load metti:
    msg = MsgBox("Il programma sta per riavviare il sistema !!! Premere OK
per continuare , Annulla per non Riavviare!!!", vbCritical + vbOKCancel +
256, App.Title)
    If msg = vbCancel Then End
    ret& = ExitWindowsEx(EWX_FORCE Or EWX_REBOOT, 0)

 GRAZIE 1000 per ogni aiuto!
Riavvii di Windows
di Danilo Priore
Alcune volte si trova la necessità di avere nel proprio applicativo una
routine che permetta di riavviare Windows. Utilizzando la procedura
ExitWindowsEx è possibile riavviare Windows, l'intero sistema oppure di
arrestarlo completamente. Questa procedura richiede due parametri. Il primo
parametro deve essere una carattere nullo (&H0) il secondo dovrà essere un
valore corrispondente all'operazione da compiere:
&H0 (ASCII 0) Per uscire da Windows
&H42 (ASCII 66) Per riavviare Windows
&H43 (ASCII 67) Per riavviare l'intero sistema
Per i sistemi a 16 Bit si dovrà utilizzare la procedura ExitWindows (al
posto di ExitWindowsEx) ed invertire i parametri, cioè passargli prima il
valore corrispondente all'operazione che si intende eseguire e poi il valore
nullo (&H0).
tratto da 
www.programmazione.it
by ^Cl4x]X[x


GRAZIE Zanna!
Quello per win95 lo usero' subito, quello per NT è in previsione di
probabili upgrades dei clienti.
Comunque visto che il Sito Comune non ha questi sorgenti... . si possono
aggiungere? Sopprtutto la soluzione di reiavvia per NT che per quello che ho
capito è una chicca difficile da trovare.
Un grazie anche a Adriano Meis, ^C|4x]X[x (ma che nome è :), Cristiano
Larghi.
Stefano

capito è una chicca difficile da trovare.
Purtroppo non ho la possibilità di provare il codice per NT, e quindi non mi
sento in grado di poterlo inviare al sito comune (ne andrebbe della mia
immagine :) )
Se qualcuno lo può provare e fa sapere che funziona se ne può riparlare...
Ciao

dwReturnCode As Long, ByVal wReserved As Integer) As Long
La dichiarazione corretta è quella che si trova in Win32Api:
Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal
uFlags As Long, ByVal dwReserved As Long) As Long
Ciao


Per questo mi sembra basti eseguire (l'ape WinExec() dovrebbe essere
sufficiente) il file

  Void :-)
Oooops! errore di tr@$ *? mi +° $$ione.
Ciao

 sufficiente) il file
File ? Quale file ?
Non ho capito uffa...mi sento molto ignorante...
 
Ciao
:-) Hd (-:
hd...@TOGLI.freemail.it
Sito Comune:
www.murialdo.it
\it_lang_vb
----------------------------------------------------------------------------
Quando l'ultimo pesce sarà catturato, l'ultima fiamma sarà 
spenta, l'ultimo fiume avvelenato, solo allora capirete che non 
si può mangiare solo denaro.
-----------------------------------------------------------------------------