Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Общие вопросы > как программно выключить комп?


Автор: tIce 08.11.05, 19:56
выключает с любой версией windows.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function GetWinVersion: string;
    var
      VersionInfo: TOSVersionInfo;
      OSName: string;
    begin
      // устанавливаем размер записи
      VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
      if Windows.GetVersionEx( VersionInfo ) then
      begin
        with VersionInfo do
        begin
          case dwPlatformId of
            VER_PLATFORM_WIN32s: OSName := 'Win32s';
            VER_PLATFORM_WIN32_WINDOWS: OSName := 'Windows 95';
            VER_PLATFORM_WIN32_NT: OSName := 'Windows NT';
          end; // case dwPlatformId
          Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +
          #13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';
        end; // with VersionInfo
      end // if GetVersionEx
      else
      Result := '';
    end;
     
    procedure ShutDown;
    const
      SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration
    var
      hToken: THandle;
      tkp: TTokenPrivileges;
      tkpo: TTokenPrivileges;
      zero: DWORD;
    begin
      if Pos('Windows NT', GetWinVersion) = 1 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, 'Exit 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, 'Exit 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, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK);
          Exit;
        end // if Boolean( GetLastError() )
        else
          ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
     
      end // if OSVersion = 'Windows NT'
      else
      begin // just shut the machine down
        ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
      end; // else
    end;

Автор: S6T6N6 09.01.06, 21:48
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Procedure ShutdownComputer;
    var
    ph:THandle;
    tp,prevst:TTokenPrivileges;
    rl:DWORD;
    begin
    OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY,ph);
    LookupPrivilegeValue(Nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
    tp.PrivilegeCount:=1;
    tp.Privileges[0].Attributes:=2;
    AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,rl);
    ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF,0);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ShutdownComputer;
    end;

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)