|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
Выключение, перегрузка и другие..
Как программно вырубить комп(Тока штоб он потом смог включиться) )?
кстати в Windows XP!!! и кстати чтоб работал код надо, а не так .. формаальноо. Кто знает - СВИСТИТЕ Сюды или KaKa Последний раз редактировалось Kaka, 02.12.2008 в 03:43. |
#2
|
||||
|
||||
Цитата:
Код:
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; |
#3
|
||||
|
||||
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; Вызывать процедуру ShutDown... Нет повести печальнее на свете, чем повесть о заклиневшем Resete. Последний раз редактировалось Ferra, 05.06.2006 в 13:54. |
#4
|
|||
|
|||
А лутше сделать так :
function MyExitWindows(RebootParam: Longword): Boolean; var TTokenHd: THandle; TTokenPvg: TTokenPrivileges; cbtpPrevious: DWORD; rTTokenPvg: TTokenPrivileges; pcbtpPreviousRequired: DWORD; tpResult: Boolean; const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; begin if Win32Platform = VER_PLATFORM_WIN32_NT then begin tpResult := OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TTokenHd); if tpResult then begin tpResult := LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, TTokenPvg.Privileges[0].Luid); TTokenPvg.PrivilegeCount := 1; TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; cbtpPrevious := SizeOf(rTTokenPvg); pcbtpPreviousRequired := 0; if tpResult then Windows.AdjustTokenPrivileges(TTokenHd, False, TTokenPvg, cbtpPrevious, rTTokenPvg, pcbtpPreviousRequired); end; end; Result := ExitWindowsEx(RebootParam, 0); end; //Пример использования procedure TForm1.Button1Click(Sender: TObject); begin MyExitWindows(EWX_POWEROFF or EWX_FORCE); end; //Пример использования procedure TForm1.Button1Click(Sender: TObject); begin MyExitWindows(EWX_REBOOT or EWX_FORCE); end; |
#5
|
|||
|
|||
Ещё вариант перезагрузки:
mov al,0F0h out 64h,al |
#6
|
||||
|
||||
Ewx_force - не советую. Это повлечет некорректное завершение многих программ и сервисов.
SysMan. C++Builder Internet/Intranet Programming. |
#7
|
||||
|
||||
Ну кому как... Мой способ универсальнее.
Майняк прав. Нет повести печальнее на свете, чем повесть о заклиневшем Resete. |
#8
|
|||
|
|||
А вот и ещё один способ
winExec('%windir%\system32\shutdown.exe -s',sw_hide); ВАТ файл : @echo off cd %windir%\system32\shutdown.exe -s |