Windows NT/2000/XP'yi Kapatmak veya Restart Etmek

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Windows NT/2000/XP'yi Kapatmak veya Restart Etmek

Mesaj gönderen mussimsek »

2000 ve XP'de bilgisayarı kapatmak için gerekli yetkiye sahip olmanız lazım. Aşağıda kodla bilgisayarı kapatabilirsiniz.

Kod: Tümünü seç

var
   tkHandle : THandle;
   BufferLun,ret : DWORD;
   tk,tkPrevious : TTokenPrivileges;
   LID : TLargeInteger;
   LUID : TLuIDAndAttributes;
   versione : TOSVersionInfo;
begin
   BufferLun := 1024;
   ret := 0;
   versione.dwOSVersionInfoSize := sizeof(versione);
   GetVersionEx(versione);
   if versione.dwPlatformId = VER_PLATFORM_WIN32_NT then
         begin
         tkHandle := GetCurrentProcess;
         OpenProcessToken(tkHandle,TOKEN_ALL_ACCESS,tkHandle);
         LookupPrivilegeValue(PChar(''),PChar('SeShutDownPrivilege'),LID);
         LUID.Luid := LID;
         LUID.Attributes := SE_PRIVILEGE_ENABLED;
         tk.PrivilegeCount := 1;
         tk.Privileges[0] := LUID;
         AdjustTokenPrivileges(tkHandle,False,tk,BufferLun,tkPrevious,ret);
      end;
      ExitWindowsEx(EWX_SHUTDOWN or EWX_PowerOff,0); 
   end;
Restart etmek için ExitWindowsEx komutunu şu şekilde yazmalısınız :

Kod: Tümünü seç

ExitWindowsEx(EWX_REBOOT or EWX_FORCE,0);
Kolay gelsin.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Bu da fonksiyon hali :

Kod: Tümünü seç

function WindowsExit(RebootParam: Longword): Boolean;
var
   TTokenHd: THandle;
   TTokenPvg: TTokenPrivileges;
   cbtpPrevious: DWORD;
   rTTokenPvg: TTokenPrivileges;
   pcbtpPreviousRequired: DWORD;
   tpResult: Boolean;
const
   SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
   if Win32Platform = VER_PLATFORM_WIN32_NT then
   begin
     tpResult := OpenProcessToken(GetCurrentProcess(),
       TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
       TTokenHd) ;
     if tpResult then
     begin
       tpResult := LookupPrivilegeValue(nil,
                                        SE_SHUTDOWN_NAME,
                                        TTokenPvg.Privileges[0].Luid) ;
       TTokenPvg.PrivilegeCount := 1;
       TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
       cbtpPrevious := SizeOf(rTTokenPvg) ;
       pcbtpPreviousRequired := 0;
       if tpResult then
         Windows.AdjustTokenPrivileges(TTokenHd,
                                       False,
                                       TTokenPvg,
                                       cbtpPrevious,
                                       rTTokenPvg,
                                       pcbtpPreviousRequired) ;
     end;
   end;
   Result := ExitWindowsEx(RebootParam, 0) ;
end;
Kullanılışı :

Kapatmak için :

Kod: Tümünü seç

WindowsExit(EWX_POWEROFF or EWX_FORCE) ;
Restart etmek için :

Kod: Tümünü seç

WindowsExit(EWX_REBOOT or EWX_FORCE) ; 
Kaynak : http://delphi.about.com/cs/adptips2003/ ... 0503_5.htm

Kolay gelsin.
Cevapla