Postoji cela istorija 'načina' kako se može 'zagasiti' Windows, a postoji i istorija problem
koji su pratili te načine, u zavisnosti od toga koja su prava i privilegije postavljeni.
Pored pomenutog
system( "shutdown -r -f -t 03" ), koji je univerzalni wrapper
koji bi trebalo da radi, Windows se gasi sa API-jem:
Code:
ExitWindowsEx();
... pri čemu prethodno treba imati određene privilegije. Ukoliko me pamćenje dobro služi
(na osnovu prijava korisnika po raznoraznim forumima), nekad nije dovoljno biti korisnik sa
Admin pravima da bi se Windows ugasio, restartovao ili promenio User.
Prethodno je potrebno pozvati:
Code:
AdjustTokenPrivileges()
... jer
ExitWindowsEx() zahteva da 'calling process' ima SE_SHUTDOWN_NAME
privilegije. Mislim da je to u suštini ovo (uvo uzeti sa rezervom):
START: Control Panel > Administrative Tools > Local Security Settings
STABLO: Security Settings > Local Policies > User Rights Assignment
STAVKA: Shut down the system [Add user]
Evo jedan primer (baziran na API-ju) koji sve to ima upakovano u jednu funkciju:
Code:
void SystemShutDown( int mode )
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// AnsiString error;
string error;
// 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";
switch( mode )
{
// 0 = Forcefully close apps, shutdown and leave system at shutoff point
case 0: if ( !ExitWindowsEx( EWX_SHUTDOWN | EWX_FORCE, 0 ) )
error = "ExitWindowsEx";
break;
// 1 = Forcefully close apps, shutdown and reboot
case 1: if ( !ExitWindowsEx( EWX_REBOOT | EWX_FORCE, 0 ) )
error = "ExitWindowsEx";
break;
// 2 = Forcefully close apps, and logoff
case 2: if ( !ExitWindowsEx( EWX_LOGOFF | EWX_FORCE, 0 ) )
error = "ExitWindowsEx";
break;
// 3 = Forcefully close apps, shutdown and poweroff
case 3: if ( !ExitWindowsEx( EWX_POWEROFF | EWX_FORCE, 0 ) )
error = "ExitWindowsEx";
break;
}
}