[ salec @ 11.09.2003. 15:10 ] @
Kako da izvedem shutdown racunara (bez pitanja!) iz .bat skripta ili pozivom neke API funkcije?

Hteo bih da mogu da ogranicim koriscenje racunara neukim korisnicima na samo odredjene sate u toku dana, pa mi je prvi grub plan bio nesto kao:

int main(void)
{
if ( banned_hours( get_system_time() ) )
shutdown();
}

koji bi se aktivirao pri startupu. U vecini prirucnika za razne programske jezike upotrebljive pod windowsima moze se naci funkcija za citanje RTC-a, ali za shutdown...neki racunari ni nemaju ATX (ovaj o kom se radi ima).
Windows je devedesetosmica.
[ reiser @ 11.09.2003. 15:24 ] @
Ne znam C++, ali evo sta sam nasao preko Google-a :
Code:

BOOL MySystemShutdown()
{
  HANDLE hToken;
  TOKEN_PRIVILEGES tkp;

  // Get a token for this process.

  if (!OpenProcessToken(GetCurrentProcess(),
       TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
     return( FALSE );

  // 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);

  if (GetLastError() != ERROR_SUCCESS)
     return FALSE;

  // Shut down the system and force all applications to close.

  if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
     return FALSE;

  return TRUE;
}


treba da ukljucis i 'windows.h', ma sta da je to... (mislim da je nesto kao unit u pascalu)
[ Shadowed @ 11.09.2003. 22:11 ] @
Nemam 98-icu na kojoj bih probao ali bi ovo trebalo da radi:
C:\WINDOWS\RUNDLL32.EXE user.exe,exitwindows

Takodje pogledaj API f-ju ExitWindowsEx ako i InitiateSystemShutdown ako hoces da prikazes neku poruku i sl. mada se ova druga mislim moze obici sa shutdown -a (ako ovo postoji na 98-ici).
[ salec @ 12.09.2003. 08:44 ] @
Ovo ne radi (ispise "Error in user.exe Missing entry:exitwindows"):

Code:
C:\WINDOWS\RUNDLL32.EXE user.exe,exitwindows


Posto me je zaintrigiralo, nasao sam fajl user.exe i uradio QuickView iz kontekst menija, ne bi li nasao neke labele i sl., ali na moje iznenadjenje QuickView je prikazao opis interfejsa, izmedju ostalog i spisak entry-ja. Negde pri kraju dugacke liste entrija nalazi se i "EXITWINDOWSEXEC" sto mi zvuci nalik na to sto trazim, ali kad sam u komand prompt upisao:
Code:
C:\WINDOWS\RUNDLL32.EXE user.exe,EXITWINDOWSEXEC
nisam dobio ikakvu poruku o gresci, ali takodje se nista nije ni dogodilo. Pretpostavljam da je funkcija izvrsena, ali nije imala dejstvo zbog neceg drugog. Inace na vrhu opisa koji da QV stoji:
Code:
DYNAMIC LINK LIBRARY 
16 bit for Windows 3.x
mozda to ima neke veze sa ignorisanjem EXITWINDOWSEXEC-a od strane 98-ice?
[ salec @ 19.09.2003. 08:55 ] @
Ljudi, ne znam sta je u pitanju, onaj dan mi nikako nije uspelo da izvrsim "exitwindows" ali danas sam probao na tri razlicita racunara (ukljucujuci i onaj na kom sam probao ranije) i na svakom je radilo!

Izvinjavam se zbog prethodne dezinformacije.
[ Shadowed @ 19.09.2003. 13:08 ] @
Exitwindowsexec koliko bi se secam trebalo da restartuje racunar (ili samo Windows tako sto ode u DOS mode a onda ponovo pokrene Win). Inace misim da bolje mozes da vidis funkcije pomocu Dependency Walker-a ali nisam siguran da li to moze i sa .exe fajlovima ili samo sa .dll-ovima.
[ Billy_boy @ 28.09.2003. 15:28 ] @
Nisam 100% siguran za shut down, ali ovoti je za restart:

"rundll32.exe shell32.dll,SHExitWindowsEx 2"

Postoje i:

"rundll32.exe shell32.dll,SHExitWindowsEx 1"
"rundll32.exe shell32.dll,SHExitWindowsEx"

Jedno od toga je log off, a drugo shut down.

Rade u:
-start/run
-bat scripti
-Bilo komu programu, ali moras ispred ubaciti naredbu za porketanje windows programa (ne znam treba li ubaciti stazu rundll32, ali mislim da windowsi sami prepoznaju jer je spremljna u run naredbe). (Provjereno u QBasicu)


Ovo sigurno radi na Win98!

P.S. Pazi na velika slova
[ Sasa Vitorovic @ 07.07.2004. 13:57 ] @
Citat:
Billy_boy: ...ali moras ispred ubaciti naredbu za porketanje windows programa ...

Moze neki primer,ne razumem kakav win program!
Imam winxp, a koristim Visual Basic 6.0.