Newsgroup: it.comp.programmare.win32
Titolo: Shutdown del sistema (NT40/VC6)

Vorrei comandare lo shutdown del sistema da un'applicazione, ho provato con
l'esempio riportato nella sezione "Shutting Down" dell'MSDN, ma la funzione
GetCurrentProcess() dell'SDK ritorna 0xFFFF causando il fallimento delle
altre funzioni. Qualcuno ha qualche idea?
Grazie e ciao!
Merlino
Il codice che ho usato e' il seguente:
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    error("OpenProcessToken");
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
        &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;  // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
        (PTOKEN_PRIVILEGES)NULL, 0);
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
    error("AdjustTokenPrivileges");
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
    error("ExitWindowsEx");

 GetCurrentProcess() dell'SDK ritorna 0xFFFF causando il fallimento delle
E` normale, e` uno pseudo-handle che significa appunto "questo processo";
sinche` la usi solo entro il processo non dovrebbe dare problemi.  Se vuoi
una handle che puoi passare ad altri processi, fanne una DuplicateHandle.
Ma non credo che sia questo il problema.  Ti conviene stampare i risultati
della GetLastError quando trovi qualunque errore, se no e` difficile capire
cosa puo` essere andato storto.
Alex

> altre funzioni. Qualcuno ha qualche idea?
Ciao!!
io mi sono scritto questa funzione, non ho idea se e' necessaria fatta cosi
per tutti i casi, ma di sicuro a me sta funzionando benissimo ..
----------8<--------------8<-----------------------8<-----------------
  // Reboot NT 1.1 by Nicola Ferruzzi - 
wo...@prograph.it
  HANDLE tokenHandle;
  HANDLE myProcessHandle;
  DWORD myProcessId;
  TOKEN_PRIVILEGES *myTokenPrivileges;
  DWORD privLength;
  LUID myLuid;
  // allochiamo la memoria che mi serve
  myTokenPrivileges=(TOKEN_PRIVILEGES *)GlobalAlloc(GPTR, 10000);
  myProcessId=_getpid();
  // il mio handle
  myProcessHandle=OpenProcess(PROCESS_ALL_ACCESS, TRUE,  myProcessId);
  // apriamo il Token del nostro processo in lettura
  OpenProcessToken(myProcessHandle, TOKEN_READ, &tokenHandle);
  // cerchiamo il privilegio che vogliamo
  GetTokenInformation(tokenHandle, TokenPrivileges, myTokenPrivileges,
10000, &privLength);
  // cerchiamo il LUID del privilegio che vogliamo modificare sulla macchina
corrente
  LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &myLuid);
  // modifichiamo il nuovo privilegio che vogliamo
  for(UINT a=0; a< myTokenPrivileges->PrivilegeCount; a++)
  {
   if(myTokenPrivileges->Privileges[a].Luid.LowPart == myLuid.LowPart &&
     myTokenPrivileges->Privileges[a].Luid.HighPart == myLuid.HighPart )
   {
    myTokenPrivileges->Privileges[a].Attributes = SE_PRIVILEGE_ENABLED;
   }
  }
  // apriamo il Token del nostro processo in scrittura
  OpenProcessToken(myProcessHandle, TOKEN_ADJUST_PRIVILEGES, &tokenHandle);
  // cambiamo il privilegio
  AdjustTokenPrivileges(tokenHandle, FALSE, myTokenPrivileges, privLength,
NULL, NULL);
  // e infine lo shutdown o il reboot
  InitiateSystemShutdown(NULL, NULL, 0, TRUE, p_rebootToo);
----------8<--------------8<-----------------------8<-----------------
bye
Nicola che si esalta a resettare tanti NT da remoto via socket e service ;)
wo...@prograph.it