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

2016-01-29 14:04 12 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;

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

  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;

[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;

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


 

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

延伸阅读
日期函数Now()、Date()、Time()大家都用得多了,这些函数是读取系统日期时间的。可是遇到需要改变操作系统的时间时,他们就一点办法也没有,而Delphi4又没有提供相关的函数,所以只好求助于API函数SetSystemTime(SystemTime);无奈他要求的变量SystemTime太古怪了,属于TSystemTime,需要经过转换才可以得到,所以举例如下: 1、定义变...
开机自动登录Linux,并自动运行XWindow应用程序,有其特殊的应用背景,如基于Linux平台的监控系统,Linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合Linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X Window自动运行应用程序。 一、Linux启动的最后阶段的工作 Linux在启动过程...
标签: windows 操作系统
  Windows下一代操作系统 Longhorn至少还要一年的时间才能面世,所以Windows XP可能会成为我们使用时间最长的一个操作系统。以前各个 Windows 版本发布的间隔大约是一到三年,而 Windows XP 已经面市两年半了,虽然在许多方面有重要的改进(还记得上次看到蓝屏是什么时候吗?),但Windows 仍有发展的余地。除了在网站上那些不断扩张...
标签: autocad教程
    如果用户希望在Auto CAD 中执行 操作系统 命令,则可调用“shell”命令来访问操作系统,该命令的调用方式为:     命令行:shell(或sh)     调用该命令后,系统将提示用户输入操作系统命令:     OS Command:     用户可...
标签: 电脑入门
对于不懂在 DOS 下安装操作系统,又没有刻录机的朋友来说,是很头痛的事;下面就以一种简单的方式来介绍利用 win PE 来安装系统; 一、下载一个PE系统,(strongchen)版(以下操作尤其是关于外置程序及Raid部分可能与其它版本PE有所区别); 二、2.安装PE 三、显示所有系统文件和隐藏文件,把C盘下的"外置程序"和"XPEMEN...

经验教程

269

收藏

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