本人是Delphi的Beginner,请教Windows NT下如何实现关机。多谢,多谢!

解决方案 »

  1.   

    2000下通过
    function SetPrivilege(sPrivilegeName:string;bEnabled:boolean):boolean;
    var
      TP,TPPre:TTokenPrivileges;
      Token:THandle;
      dwLength:DWORD;
    begin
      result := false;
      OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Token);
      try
      TP.PrivilegeCount := 1;
      if LookupPrivilegeValue(nil,PChar(sPrivilegeName),TP.Privileges[0].LUID) then
      begin
        if bEnabled then
          TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        else
          TP.Privileges[0].Attributes := 0;
        dwLength := 0;
        Result := AdjustTokenPrivileges(Token,false,TP,sizeof(TPPre),TPPre,dwLength);
      end;
      finally
        CloseHandle(Token);
      end;
    end;调用:
      SetPrivilege('SeShutdownPrivilege',true);
      ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF,0);
      

  2.   

    D6/7下使用98/me/2k/xp都Ok的!
    procedure TAPIMisc.PowerOff(Force:boolean=false);
    var
      hToken       : THandle;
      tkp          : TTokenPrivileges;
      tkpo         : TTokenPrivileges;
      zero         : DWORD;
    begin
      if Win32Platform=VER_PLATFORM_WIN32_NT then // we've got to do a whole buch of things
         begin  
            zero := 0;
            if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
               begin
                 MessageBox( 0, 'PowerOff Error', 'OpenProcessToken() Failed', MB_OK );
                 Exit;
               end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
            if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
               begin
                 MessageBox( 0, 'PowerOff Error', 'OpenProcessToken() Failed', MB_OK );
                 Exit;
               end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
            // SE_SHUTDOWN_NAME
            if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then
               begin
                  MessageBox( 0, 'PowerOff Error', 'LookupPrivilegeValue() Failed', MB_OK );
                  Exit;
               end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )
            tkp.PrivilegeCount := 1;
            tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;        AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );
            if Boolean( GetLastError() ) then
               begin
                  MessageBox( 0, 'PowerOff Error', 'AdjustTokenPrivileges() Failed', MB_OK );
                  Exit;
               end // if Boolean( GetLastError() )
            else if Force then ExitWindowsEx( EWX_Force or EWX_POWEROFF, 0 )
                          else ExitWindowsEx( EWX_POWEROFF, 0 );
          end // if OSVersion = 'Windows NT'
       else // just shut the machine down
            if Force then ExitWindowsEx( EWX_Force or EWX_POWEROFF, 0 )
                          else ExitWindowsEx( EWX_POWEROFF, 0 );
    end;