====== Spegnere o riavviare windows ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//29/03/2013//** \\ \\ Di seguito il codice per spegnere o riavviare windows. Il codice in questione fa essenzialmente due cose: **ottenere i privilegi** e **usa ExitWindowsEx()** per eseguire l'operazione. **Ovviamente cross-compileremo tutto sulla nostra Linuxbox tramite mingw** .A questo indirizzo ([[http://msdn.microsoft.com/en-us/library/windows/desktop/aa376868%28v=vs.85%29.aspx|ExitWindowsEx function]]) troviamo la documentazione ufficiale microsoft. Basti a noi sapere che la funzione ha il seguente prototipo: #include ... BOOL WINAPI ExitWindowsEx( _In_ UINT uFlags, _In_ DWORD dwReason ); dove **uFlags** รจ l'azione che vogliamo svolgere (riavvio, spegnimento, logout etc...) e **dwReason**(opzionale) la ragione ,che vogliamo comunicare al sistema operativo, per la quale abbiamo invocato ''ExitWindowsEx()'' . ===== Il codice ===== **spegni-windows.c** #include #pragma comment(lib, "user32.lib") #pragma comment(lib, "advapi32.lib") //Documentazione su http://msdn.microsoft.com/en-us/library/windows/desktop/aa376868%28v=vs.85%29.aspx // Con questa funzione richiediamo i privilegi (per questo processo) // di spegnere il computer int RichiediPrivilegi() { HANDLE hToken; TOKEN_PRIVILEGES tkp; // Prende un token per i concedere i privilegi a questo processo if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { wprintf(L"Qualcosa e' andato storto ...\n"); return( FALSE ); } // Prende il LogonID (LUID) LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); //Quanti e che tipo di privilegi servono tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); //Verifica se alla fine della richiesta dei privilegi ci siano stati problemi if (GetLastError() != ERROR_SUCCESS) { wprintf(L"Qualcosa e' andato storto ...\n"); return FALSE; } } int Spegni() { //Richiedo i privilegi necessari RichiediPrivilegi(); // ExitWindowsEx() fa il lavoro sporco. Puo' spegnere o riavviare il sistema // in base ai vari flag che gli siano dati come parametro. if (!ExitWindowsEx(EWX_POWEROFF, 0) ) { wprintf(L"Non e' stato possibile spegnere il computer\n"); return FALSE ; }else{ wprintf(L"spegnimento in corso...\n"); } } int Riavvia() { //Richiedo i privilegi necessari RichiediPrivilegi(); // ExitWindowsEx() fa il lavoro sporco. Puo' spegnere o riavviare il sistema // in base ai vari flag che gli siano dati come parametro. if (!ExitWindowsEx(EWX_REBOOT, 0) ) { wprintf(L"Non e' stato possibile spegnere il computer\n"); return FALSE ; }else{ wprintf(L"spegnimento in corso...\n"); } } int main(int argc, char** argv) { // Spegni() spegne il sistema e Riavvia() lo riavvia :) //Spegni(); Riavvia(); // Attendo lo stdinput giusto per non far sparire // la finestrella del terminale subito nel caso in // cui ci siano errori da vedere int a; wscanf(" %f", &a); return 0; } ===== Il makefile ===== **makefile** CPP = /usr/bin/i486-mingw32-gcc all: $(CPP) spegni-windows.c -o spegni-windows.exe clean: rm spegni-windows.exe