![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как программно перегрузить компьютер? [D7]
Ната © (2005-01-21 07:52:00)ПОдскажите, пожалуйста, как программно перегрузить компьютер?
i-s-v (2005-01-23 01:35:00) [1]Полазь на http://delphiworld.narod.ru
---
The Death Will Come
grom (2005-01-22 20:42:00) [2]XP
...
procedure ...
var
hToken: THandle;
tkp: _TOKEN_PRIVILEGES;
returnLength: Cardinal;
begin
// Windows.Beep(855,55);
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken)then
begin
LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
tkp.PrivilegeCount:=1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken,false,tkp,0,nil,returnLength)then ExitWindowsEx(EWX_SHUTDOWN or EWX_REBOOT,0);
end;
end;
Dextor (2005-01-22 20:30:00) [3]Проще полистать FAQ на этом сайте, там как раз все написанно !
Вариант (2005-01-22 18:29:00) [4]Такой способ не убивает процессы:
procedure reboot;
var
hToken: THandle;
tkp: _TOKEN_PRIVILEGES;
DUMMY: PTokenPrivileges;
DummyRL: Cardinal;
begin
DUMMY := nil;
if not OpenProcessToken(
GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken
) then
raise TShutdownEx.Create('OpenProcessToken failed');
if (not LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
tkp.Privileges[0].Luid)) then
raise TShutdownEx.Create('LookupPrivilegeValue failed');
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := $0002; //SE_PRIVILEGE_ENABLED = $00002
AdjustTokenPrivileges(hToken, FALSE, tkp, 0, Dummy, DummyRL);
if (GetLastError() <> ERROR_SUCCESS) then
raise TShutdownEx.Create('AdjustTokenPrivileges failed');
if (not ExitWindowsEx(EWX_REBOOT, 0)) then
raise TShutdownEx.Create('ExitWindowsEx failed');
end;
VMcL (2005-01-21 16:50:00) [5]> Form1.Close;
> MessageBox(Form1.Handle...);
За такой код расстреливать надо.
onyx (2005-01-21 11:52:00) [6]Вот готовое решение. А то здесь трудно найти, то что нужно.
function WinExit : boolean;
var ver : OSVERSIONINFO;
function SetPrivilege(privilegeName: string; enable: boolean): boolean;
var tpPrev,
tp : TTokenPrivileges;
token : THandle;
dwRetLen : DWord;
begin
result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);
tp.PrivilegeCount := 1;
if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then
begin
if enable then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
dwRetLen := 0;
result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
end;
CloseHandle(token);
end;
BEGIN
ver.dwOSVersionInfoSize:=SizeOf(ver);
GetVersionEx(ver);
if ver.dwPlatformId=VER_PLATFORM_WIN32_NT then
begin
if SetPrivilege('SeShutdownPrivilege', true) then
begin
Form1.Close;
ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);
end
else
begin
Form1.Close;
MessageBox(Form1.Handle, 'К сожалению перезагрузка не получилась!','info',MB_OK or MB_ICONWARNING or MB_SYSTEMMODAL);
end;
end
else
begin
Form1.Close;
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0);
end;
END;
Квэнди (2005-01-21 09:04:00) [7]а поискать в этом же форуме саавсем лень?