在 NT内核的操作系统上实现系统关闭

2016-01-29 14:04 7 1 收藏

在 NT内核的操作系统上实现系统关闭,在 NT内核的操作系统上实现系统关闭

【 tulaoshi.com - 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); // & 执行注销、退出或重启系统的操作 &

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/delphi/)

  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;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/delphi/)[next]


  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;


 

来源:https://www.tulaoshi.com/n/20160129/1492446.html

延伸阅读
Linux的一个重要的特点就是其源代码的公开性,全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。 为什么要升级内核 正如它的名字的字面意义,Linux的内核承担着Linux操作系统的最为核心的任...
标签: autocad教程
    如果用户希望在Auto CAD 中执行 操作系统 命令,则可调用“shell”命令来访问操作系统,该命令的调用方式为:     命令行:shell(或sh)     调用该命令后,系统将提示用户输入操作系统命令:     OS Command:     用户可...
标签: windows 操作系统
  Windows下一代操作系统 Longhorn至少还要一年的时间才能面世,所以Windows XP可能会成为我们使用时间最长的一个操作系统。以前各个 Windows 版本发布的间隔大约是一到三年,而 Windows XP 已经面市两年半了,虽然在许多方面有重要的改进(还记得上次看到蓝屏是什么时候吗?),但Windows 仍有发展的余地。除了在网站上那些不断扩张...
标签: 电脑入门
对于不懂在 DOS 下安装操作系统,又没有刻录机的朋友来说,是很头痛的事;下面就以一种简单的方式来介绍利用 win PE 来安装系统; 一、下载一个PE系统,(strongchen)版(以下操作尤其是关于外置程序及Raid部分可能与其它版本PE有所区别); 二、2.安装PE 三、显示所有系统文件和隐藏文件,把C盘下的"外置程序"和"XPEMEN...
开机自动登录Linux,并自动运行XWindow应用程序,有其特殊的应用背景,如基于Linux平台的监控系统,Linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合Linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X Window自动运行应用程序。 一、Linux启动的最后阶段的工作 Linux在启动过程...

经验教程

150

收藏

13
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部