程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 在 NT內核的操作系統上實現系統關閉 (1)

在 NT內核的操作系統上實現系統關閉 (1)

編輯:Delphi
很多時候,我們可能需要執行關閉計算機或重新啟動計算機的操作,但在 WinNT 內核的操作系統中,我們不能只調用簡單的 API 函數來完成這樣的操作。這並不是一個復雜的問題,卻有時候會讓人“為難”,如果是這樣,現在解決這個問題的辦法來了。

  ***************************************************************************
  具體使用示例:
  注銷當前用戶 => ExitWin32Sys(EWX_FORCE or EWX_LOGOFF);
  重新啟動計算機 => ExitWin32Sys(EWX_FORCE or EWX_REBOOT);
  關閉計算機 => ExitWin32Sys(EWX_FORCE or EWX_POWEROFF);
  ***************************************************************************
  具體代碼:




  uses
  Windows;

  function GetSysTypes: Boolean; // & 獲取操作系統類型 &
  function SetPrivilege(sPrivilegeName: AnsiString; bEnable: Boolean): Boolean; // & 設置權限 &
  procedure ExitWin32Sys(iFlags: Integer); // & 執行注銷、退出或重啟系統的操作 &

  implementation

  function GetSysTypes: Boolean;
  var
  Ver: TOSVersionInfo;
  begin
  Result := False;
  Ver.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  if GetVersionEx(Ver) then
  if Ver.dwPlatformId = VER_PLATFORM_WIN32_Windows then
  Result := True
  else
  Result := False;
  end;


  function SetPrivilege(sPrivilegeName: AnsiString; bEnable: 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,PAnsiChar(sPrivilegeName),TP.Privileges[0].LUID) then
  begin
  if bEnable 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;

  procedure ExitWin32Sys(iFlags: Integer);
  begin
  if GetSysTypes then
  ExitWindowsEx(iFlags,0)
  else
  if SetPrivilege('SeShutdownPrivilege',True) then
  if not ExitWindowsEx(iFlags,0) then
  SetPrivilege('SeShutdownPrivilege',False);
  end;


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved