Сообщение перед выключением компьютера:
- Вашу жену зовут Наташа, детей-Юля и Павлик. Вы все еще хотите выйти из Windows?!
function GetWinVersion: string;
var
VersionInfo: TOSVersionInfo;
OSName: string;
begin// устанавливаем размер записи
VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
if Windows.GetVersionEx( VersionInfo ) thenbeginwith VersionInfo dobegincase 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 VersionInfoend// if GetVersionExelse
Result := '';
end;
procedure ShutDown;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declarationvar
hToken: THandle;
tkp: TTokenPrivileges;
tkpo: TTokenPrivileges;
zero: DWORD;
beginif Pos('Windows NT', GetWinVersion) = 1 then// we've got to do a whole buch of thingsbegin
zero := 0;
ifnot OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) thenbegin
MessageBox(0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK);
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)ifnot OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) thenbegin
MessageBox(0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK);
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)// SE_SHUTDOWN_NAMEifnot LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid ) thenbegin
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()) thenbegin
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'elsebegin// just shut the machine down
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end; // elseend;
Программа на Delphi, которая предназначена для отключения компьютера, работающего под управлением Windows. Программа проверяет версию Windows и, если это NT-based система (Windows NT, Windows 2000, Windows XP и т.д.), пытается получить привилегию отключения перед отключением машины.
Вот разбивка кода:
Функция GetWinVersion: эта функция получает информацию о текущей версии операционной системы и возвращает строку в формате "OS Name Version x.x (Build y.z): zzz". Имя OS может быть одним из "Windows 95", "Windows NT" или "Win32s".
Процедура ShutDown: это где происходит отключение машины.
Если текущая операционная система является Windows NT-based, программа пытается получить привилегию отключения.
Она открывает токен процесса с помощью OpenProcessToken и проверяет, была ли операция успешной, проверяя на ошибки.
Затем она снова открывает тот же токен процесса (для каких-то причин), что может не успех. Если это так, программа отображает сообщение об ошибке и заканчивает работу.
Далее она ищет значение привилегии отключения с помощью LookupPrivilegeValue и проверяет, была ли операция успешной.
Затем она adjusts токен привилегий, установив привилегию отключения в включенном состоянии (AdjustTokenPrivileges).
Наконец, программа пытается отключить машину с помощью ExitWindowsEx, указывая оба флага FORCE (немедленно прерывать все процессы) и SHUTDOWN (производить чистое отключение последовательности). Если операция неудачна, программа отображает сообщение об ошибке.
Если текущая операционная система не является Windows NT-based, программа просто вызывает ExitWindowsEx с теми же флагами, что и выше, для отключения машины.
Обратите внимание: код имеет некоторые потенциальные проблемы:
Также код является quite old и может не работать в современных версиях Windows. Например, привилегия "SeShutdownPrivilege" доступна только в Windows NT-based системах начиная с Windows XP.
Как выключить компьютер с любой версией Windows: есть несколько способов, включая использование функции ShutDown в программном коде.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.