Zamykanie WinXP

0

Jak w Delphi programowo zamknac WinXP ??? ;-(

0

Podam Ci kod źródłowy, z poziomu którego, zamkniesz nie tylko XP, ale i starsze wersje systemów Microsoftu.

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

Poszykaj z serwisie programiku XPCloser :) (masz tam tez zrodlo :P

0

a mozna jakos za pomoca tego "cuda" przelaczyc w stan wstrzymania lub zahibernowac kompa?

0

Było tu już o hibernowaniu kiedyś. Oto kod jaki znalazłem:

procedure SuspendOrHibernate( ASuspend,AForce : Boolean );
var
 iVersionInfo: TOSVersionInfo;
 iToken   : cardinal;
 iPriveleg : TTokenPrivileges;
 iaresult : cardinal;
begin
 FillChar (iPriveleg, SizeOf (iPriveleg), #0);

 iVersionInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);

 GetVersionEx(iVersionInfo);

 if iVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
   Win32Check( OpenProcessToken (GetCurrentProcess,
             TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, iToken) );
   Win32Check( LookupPrivilegeValue (nil,'SeShutdownPrivilege',
            iPriveleg.Privileges[0].Luid) );

   iPriveleg.PrivilegeCount := 1;
   iPriveleg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

   Win32Check(AdjustTokenPrivileges(iToken,False,iPriveleg,
   Sizeof(iPriveleg), iPriveleg, iaresult));
 end;

 Win32Check( SetSystemPowerState( ASuspend, AForce ) );
end;

Użycie :

SuspendOrHibernate(false,false);  - hibernuje bez pytania

Udostępnił go AndRew. Nie wiem czy działa :)

0

Dziękuję [browar]

0

Może jeszcze tylko zadam jedno pytanie:

Jak programowo sprawdzić czy jest włączona możliwość hibernacji ?

Bo ta procedura powyżej hibernuje komputer, gdy jest włączona ta usługa, ale gdy jest wyłączona, to komputer przechodzi w stan wstrzymania.

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