Wylaczenie komputera

0

czy da sie programowo wylaczyc komputer ? znalazlem kod pod 9x ale pod Xp nie ma :(
chodzi mi o to zeby moc ZRESETOWAC, WYLACZYC, i WYLOGOWAC kiedy sie chce system XP
dziekuje
pozdrawiam

0

wylogowanie xp: Win32Check(ExitWindows(0, 0));
a codo reszty dzial kody zrodlowe tam masz chyba 2 programy ktore demonstruja zamykanie xp

0

W jakimś FAQ to widziałem...
Spróbuje Ci przesłać ten FAQ :)

0

Wyłączenie komputera:

function ExitWindows2: boolean;
var
  vi: TOSVersionInfo;
  hToken: THandle;
  tp: TTokenPrivileges;
  ReturnLength: Cardinal;
begin
  Result := False;

  FillChar(tp, SizeOf(tp), 0);
  vi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(vi);

  if vi.dwPlatformId <> VER_PLATFORM_WIN32_NT then
    Result := ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0)
  else
    if OpenProcessToken(GetCurrentProcess,
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      hToken) then
      if LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
        tp.Privileges[0].Luid) then
      begin
        tp.PrivilegeCount := 1;
        tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        if AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp),
          tp, ReturnLength) then
          Result := ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);
      end;
end;

Restart komputera:

function RestartWindows: boolean;
var
  vi: TOSVersionInfo;
  hToken: THandle;
  tp: TTokenPrivileges;
  ReturnLength: Cardinal;
begin
  Result := False;

  FillChar(tp, SizeOf(tp), 0);
  vi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(vi);

  if vi.dwPlatformId <> VER_PLATFORM_WIN32_NT then
    Result := ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0)
  else
    if OpenProcessToken(GetCurrentProcess,
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      hToken) then
      if LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
        tp.Privileges[0].Luid) then
      begin
        tp.PrivilegeCount := 1;
        tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        if AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp),
          tp, ReturnLength) then
          Result := ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0);
      end;
end;
0

Kompletnie nie rozumiem... Zapuszczam tą twoją funkcję, i jedyne co się dzieje, to samoczynne i niezapowiedziane nagłe wyłączenie wszystkich programów... Próbowałem ściągnąć program o nazwie 'XP Closer' i rzeczywiście, działa. Jednak gdy próbuję przenosić z niego procedury, to otrzymuję ten sam efekt, co w przypadku pokazanej przez ciebie metody.

Dodam tylko, że posiadam WinZgrozę opatrzoną numerkiem 98 i dodatkiem SE na końcu nazwy :D.

PS. Bardzo proszę o info o nawiązaniu dyskusji na GG (5118732), bo z niewiadomych przyczyn nie mogę się zalogować w serwisie i tym samym ustawić funkcji powiadamiania e-mail o nowych wiadomościach.

0

jest pewna różnica pomiędzy wyłączniem XP a 98 i pewnie dlatego ta funkcja nie działa poprawnie, btw był z tego co pamietam taki topic i były tam odpowiedzi jak to zrobić pod każdą winde chyba

0

Dzięki, ale zawodny okazał się nie kod, ale moja głupota ;). Jeżeli włączam program 'pod kontrolą' Delphi (tzn. klikając przycisk Run) nic nie działa, ale jeżeli zwyczajnie włączę exec, wystarczy nawet samo polecenie

ExitWindowsEx(EWX_REBOOT or EWX_FORCE,0);
</delphi>
0
function SetPrivilege(PrivilegeName: string; Enable: Boolean): Boolean;
var tpPrev, TP: TTokenPrivileges;
      Token: THandle;
      dwRetLen: DWord;
begin
   Result := False;
   OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
   TP.PrivilegeCount := 1;
   if LookupPrivilegeValue(nil, PChar(PrivilegeName), TP.Privileges[0].LUID) then
    begin
      if Enable then
       TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
      else
       TP.Privileges[0].Attributes := 0;
         dwRetLen := 0;
         Result := AdjustTokenPrivileges(Token, False, TP, SizeOf(tpPrev), tpPrev, dwRetLen);
    end;
   CloseHandle(token);
end; 

Teraz, żeby zamknąć system, piszesz:

SetPrivilege('SeShutdownPrivilege', True);
 ExitWindowsEx(EWX_POWEROFF or EWX_FORCE,0);
 SetPrivilege('SeShutdownPrivilege', False); 

W celu ponownego rozruchu:

SetPrivilege('SeShutdownPrivilege', True);
 ExitWindowsEx(EWX_REBOOT or EWX_FORCE,0);
 SetPrivilege('SeShutdownPrivilege', False); 

Wylogowanie sesji użytkownika:

SetPrivilege('SeShutdownPrivilege', True);
 ExitWindowsEx(EWX_LOGOFF or EWX_FORCE,0);
 SetPrivilege('SeShutdownPrivilege', False); 

Wyłączanie komputera z tzw. "fastem, speedem":

SetPrivilege('SeShutdownPrivilege', True);
 ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE,0);
 SetPrivilege('SeShutdownPrivilege', False); 

1 użytkowników online, w tym zalogowanych: 0, gości: 1