Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как выключить компьютер с любой версией Windows

Delphi , ОС и Железо , Компьютер

Как выключить компьютер с любой версией Windows


Сообщение перед выключением компьютера:
- Вашу жену зовут Наташа, детей-Юля и Павлик. Вы все еще хотите выйти из Windows?!


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)

    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;

Программа на Delphi, которая предназначена для отключения компьютера, работающего под управлением Windows. Программа проверяет версию Windows и, если это NT-based система (Windows NT, Windows 2000, Windows XP и т.д.), пытается получить привилегию отключения перед отключением машины.

Вот разбивка кода:

  1. Функция GetWinVersion: эта функция получает информацию о текущей версии операционной системы и возвращает строку в формате "OS Name Version x.x (Build y.z): zzz". Имя OS может быть одним из "Windows 95", "Windows NT" или "Win32s".

  2. Процедура ShutDown: это где происходит отключение машины.

    • Если текущая операционная система является Windows NT-based, программа пытается получить привилегию отключения.

      • Она открывает токен процесса с помощью OpenProcessToken и проверяет, была ли операция успешной, проверяя на ошибки.

      • Затем она снова открывает тот же токен процесса (для каких-то причин), что может не успех. Если это так, программа отображает сообщение об ошибке и заканчивает работу.

      • Далее она ищет значение привилегии отключения с помощью LookupPrivilegeValue и проверяет, была ли операция успешной.

      • Затем она adjusts токен привилегий, установив привилегию отключения в включенном состоянии (AdjustTokenPrivileges).

      • Наконец, программа пытается отключить машину с помощью ExitWindowsEx, указывая оба флага FORCE (немедленно прерывать все процессы) и SHUTDOWN (производить чистое отключение последовательности). Если операция неудачна, программа отображает сообщение об ошибке.

    • Если текущая операционная система не является Windows NT-based, программа просто вызывает ExitWindowsEx с теми же флагами, что и выше, для отключения машины.

Обратите внимание: код имеет некоторые потенциальные проблемы:

* Он пытается открыть токен процесса дважды без видимой причины.
* Он не проверяет, была ли операция поиска привилегии успешной перед попыткой adjust токена привилегий.
* Есть возможный ресурсный сбой из-за не закрытия handle `hToken` после использования.

Также код является quite old и может не работать в современных версиях Windows. Например, привилегия "SeShutdownPrivilege" доступна только в Windows NT-based системах начиная с Windows XP.

Как выключить компьютер с любой версией Windows: есть несколько способов, включая использование функции ShutDown в программном коде.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компьютер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-11-30 11:42:55
2024-12-11 00:58:43/0.002263069152832/0