Windows编程之提权2

实现打开程序自动关机:

需要用到的函数

Windows编程之提权2
BOOL ExitWindowsEx(

UINT uFlags, // 关闭参数

DWORD dwReserved // 系统保留,一般取0

);
Windows编程之提权2
 uFlags 说明
EWX_FORCE 强制终止进程。
EWX_LOGOFF 关闭所有进程,然后注销用户。
EWX_POWEROFF 关闭系统并关闭电源。该系统必须支持断电。
EWX_REBOOT 关闭系统,然后重新启动系统。
EWX_SHUTDOWN 关闭系统,安全地关闭电源。所有文件缓冲区已经刷新到磁盘上,所有正在运行的进程已经停止。

 

 

 

 

(Windows要求:Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。Windows 9X中:可以直接调用。)

 

 

delphi代码实现:

Windows编程之提权2
procedure TForm1.FormCreate(Sender: TObject);
begin
    Shutdown;
end;

function TForm1.GetShutdownRoot:Boolean;
var
  myhandle:THandle;    //返回句柄
  myprivilege:TOKEN_PRIVILEGES;    //Luid and privilege数组
  myluid:Int64;         //luid
  buff:Cardinal;
begin
    Result:=False;
    //打开进程关联的访问令牌
    if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,myhandle) then Result:=False;
    //设置一个关机权限,获取luid
    if not LookupPrivilegeValue(nil,SeShutdownPrivileges,myluid) then Result:=False;
    myprivilege.PrivilegeCount:=1; //指定特权数组个数为1
    myprivilege.Privileges[0].Luid:=myluid;
    myprivilege.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; //特权启用
    //通知操作系统特权为打开状态
    AdjustTokenPrivileges(myhandle,False,myprivilege,SizeOf(myprivilege),nil,buff);
    if not CloseHandle(myhandle) then Result:=False;           //关闭句柄对象
    Result:=True;
end;

procedure TForm1.Shutdown;
begin
   if not GetShutdownRoot then ShowMessage(获得关机权限失败);
   if not ExitWindowsEx(EWX_SHUTDOWN,0) then ShowMessage(关机失败!);          //关机
end;
Windows编程之提权2

 

Windows编程之提权2,布布扣,bubuko.com

Windows编程之提权2

上一篇:[转]Windows7:Visual Studio 2008试用版的评估期已经结束解决方法


下一篇:WinRAR