本人急需要退出windows的api 函数

解决方案 »

  1.   

    procedure TKStatus.ShutDown;
    const
      SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    var
      hToken:THandle;
      tkp:TTokenPrivileges;
      tkpo:TTokenPrivileges;
      zero:DWORD;
    begin
      if Pos('Windows NT',GetWinVersion) = 1 then
         begin
           zero := 0;
           if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
              begin
                Exit;
              end;
           if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then
              begin
                Exit;
              end;
           tkp.PrivilegeCount := 1;
           tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
           AdjustTokenPrivileges(hToken,False,tkp,SizeOf(TTokenPrivileges),tkpo,zero);
           if Boolean(GetLastError()) then
              begin
                Exit;
              end
           else
             ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0);        //ExitWindowsEx(EWX_SHUTDOWN,0); //
         end
      else
         begin
           ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN,0);      //ExitWindowsEx(EWX_SHUTDOWN,0); //
         end;
    end;procedure TKStatus.ReBoot;
    const
      SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    var
      hToken:THandle;
      tkp:TTokenPrivileges;
      tkpo:TTokenPrivileges;
      zero:DWORD;
    begin
      if Pos('Windows NT',GetWinVersion) = 1 then
         begin
           zero := 0;
           if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
              begin
                Exit;
              end;
           if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then
              begin
                Exit;
              end;
           tkp.PrivilegeCount := 1;
           tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
           AdjustTokenPrivileges(hToken,False,tkp,SizeOf(TTokenPrivileges),tkpo,zero);
           if Boolean(GetLastError()) then
              begin
                Exit;
              end
           else
              ExitWindowsEx(EWX_FORCE or EWX_REBOOT,0);
         end
      else
         begin
           ExitWindowsEx(EWX_FORCE or EWX_REBOOT,0);
         end;
    end;
      

  2.   

    function GetWinVer: boolean;
    var
      Getver: OSVERSIONINFO;
      RET: LONGBOOL;
    begin
      Result := true;
      Getver.dwOSVersionInfoSize := 148;
      RET := GETVERSIONEX(Getver);
      if Getver.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then
        Result := False;
      // if Getver.dwPlatformId=VER_PLATFORM_WIN32_NT then
    end;procedure AdjustToken();
    var
      hdlProcessHandle: Cardinal;
      hdlTokenHandle: Cardinal;
      tmpLuid: Int64;
      tkpPrivilegeCount: Int64;
      tkp: TOKEN_PRIVILEGES;
      tkpNewButIgnored: TOKEN_PRIVILEGES;
      lBufferNeeded: Cardinal;
      Privilege: array[0..0] of _LUID_AND_ATTRIBUTES;
    begin
      hdlProcessHandle := GetCurrentProcess;
      OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY),
        hdlTokenHandle);
      // Get the LUID for shutdown privilege.
      LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
      Privilege[0].Luid := tmpLuid;
      Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
      tkp.PrivilegeCount := 1; // One privilege to set
      tkp.Privileges[0] := Privilege[0];
      // Enable the shutdown privilege in the access token of this
      // process.
      AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Sizeof(tkpNewButIgnored),
        tkpNewButIgnored, lBufferNeeded);
    end;function ShutDownWin: boolean;
    {
    const
      EWX_FORCE = 4; //关闭所有程序并以其他用户身份登录
      EWX_LOGOFF = 0; //重新启动计算机并切换到MS-DOS方式
      EWX_REBOOT = 2; //重新启动计算机
      EWX_SHUTDOWN = 1; //关闭计算机
      }
    begin
      if GetWinVer then
        AdjustToken;
      Result := ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0);
    end;