谁能给我一个能在服务程序下强制关机2000/XP的代码?

解决方案 »

  1.   


    注销:MyExitWindows(EWX_LogOff);
       重启:MyExitWindows(EWX_REBOOT);
        关机:MyExitWindows(EWX_SHUTDOWN);
    }
    function SetShutdownPrivilege(Enable: Boolean): Boolean;
    var
      PrevPrivileges: TTokenPrivileges;
      Privileges: TTokenPrivileges;
      Token: THandle;
      dwRetLen: DWord;
    begin
      Result := False;
      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
      Privileges.PrivilegeCount := 1;
      if LookupPrivilegeValue(nil,'SeShutdownPrivilege', Privileges.Privileges[0].LUID) then
      begin
        if Enable then
          Privileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        else
          Privileges.Privileges[0].Attributes := 0;
        dwRetLen := 0;
        Result := AdjustTokenPrivileges(Token, False, Privileges, SizeOf(PrevPrivileges), PrevPrivileges, dwRetLen);
      end;
      CloseHandle(Token);
    end;procedure MyExitWindows(const P:Word);
    begin
      Application.Terminate;
      if IsWin9x then
        ExitWindowsEx(EWX_FORCE or P, 0)
      else
      begin
        SetShutdownPrivilege(True);
        ExitWindowsEx(EWX_FORCE or P, 0);
        SetShutdownPrivilege(False);
      end;
    end;
      

  2.   

    function ShutdownPC(Action : Integer) : boolean;
      const
        ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
        SHTDWN_PRIV = 'SeShutdownPrivilege';
        PRIV_SIZE = sizeOf(TTokenPrivileges);
      var
        uFlags: Cardinal;
        Len: DWORD;
        TokenPriv, Dummy: TTokenPrivileges;
        Token: THandle;
        Error: integer;
      begin
        error := 0;
        if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
          Error := Error or 4;
        if not LookupPrivilegeValue(nil, SHTDWN_PRIV, TokenPriv.Privileges[0].Luid) then
          Error := Error or 8;
        TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        TokenPriv.PrivilegeCount := 1; // One privilege to set
        if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE, Dummy, Len) then
          Error := Error or 16;
        case Action of
          0: uFlags := EWX_POWEROFF + EWX_SHUTDOWN; //提示关机
          1: uFlags := EWX_POWEROFF + EWX_FORCE; //强制关机
          2: uFlags := EWX_ReBoot; //提示重启系统
          3: uFlags := EWX_ReBoot + EWX_FORCE; //强制重启系统
        end;    
        if Application.MessageBox(PChar('您是否要执行 ''' + inttostr(cbAction.ItemIndex) +':'+ cbAction.Text +''' 操作?'),PChar('提示'),MB_YESNO + MB_ICONQUESTION) = IDYES then
          ExitWindowsEx(uFlags, 0);
        Result := (Error = 0);
      end;
      

  3.   

    9x 和 2000/XP 不同的地方在于(我是指PROCESS的管理)2000/XP下终止一个服务或系统进程是需要调试级的特权的,如果没有取得特权,你的程序将无法调试当前进程,也就是说无法终止你所想要终止的服务或系统进程,也许它是木马、病毒、但你无法解决,通常的做法便是调整你的进程的优先级为调试级别,然后你想干什么就干什么吧,终止LSASS或SMSS,60秒倒计时,这样算不算强制  关机 或 重启