Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как перезагрузить компьютер? [D5, Win2k]


Puzzle ©   (2003-03-31 15:36:00) 

Мастера, подскажите как перезагрузить комп? Пробую использовать ExitWindowsEx(EWX_REBOOT, 0), но перезагрузки почему-то не происходит, максимум закрытие некоторых открытых программ. Мне нужна перезагрузка не зависимо от того, что сейчас работает.


gss   (2003-03-31 18:34:00) [1]

...
var
err : integer;
hp,ht : cardinal;
tp : TOKEN_PRIVILEGES;
c1,c2 : Cardinal;
begin
hp := GetCurrentProcess;//Взяли хендл текущего процесса
if not OpenProcessToken(hp,TOKEN_WRITE,ht)//открыли токен процесса
then
begin
err := GetLastError;
messagebox(0,Pchar(IntToStr(err)),"Error",mb_OK);
end;
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if not LookupPrivilegeValue(nil,"SeShutdownPrivilege",tp.Privileges[0].Luid) //Занесли в привилегии возможность для процесса управлять выключением и питанием
then
begin
err := GetLastError;
messagebox(0,Pchar(IntToStr(err)),"Error",mb_OK);
end;
c1 := SizeOf(tp);
if not AdjustTokenPrivileges(ht,False,tp,c1,nil,c2) //установили привилегию управления питанием для процесса
then
begin
err := GetLastError;
messagebox(0,Pchar(IntToStr(err)),"Error",mb_OK);
end;

ExitWindowsEx( EWX_FORCE+ EWX_REBOOT,0);// (1) Перегружаем. EWX_FORCE - выполнить при любых условиях.

end;

Этот фрагмент не проверялся на перезагрузку, но с другим параметром работал на выключение и с другой функцией (1) - на усыпление компа под Win2k.


Puzzle   (2003-03-31 16:27:00) [2]

Сам нашел, кому интересно:

Procedure RebootWindows;
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 ShowError("OpenProcessToken failed");
if Not LookupPrivilegeValue(nil, "SeShutdownPrivilege" , tkp.Privileges[0].Luid) then ShowError("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 ShowError("AdjustTokenPrivileges failed");
if Not ExitWindowsEx(EWX_REBOOT, 0) then ShowError("ExitWindowsEx failed");
End; {- RebootWindows -}


Puzzle   (2003-03-31 15:59:00) [3]

НЕ РАБОТАЕТ!
Какие еще будут предложения, друзья?


Intell   (2003-03-31 15:39:00) [4]

procedure TForm1.Button1Click(Sender: TObject);
var
handle, ph: THandle;
pid, n: DWORD;
luid: TLargeInteger;
priv: TOKEN_PRIVILEGES;
dummy: PTokenPrivileges;
ver: TOSVERSIONINFO;
begin
close;
ver.dwOSVersionInfoSize := Sizeof(ver);
GetVersionEx(ver);
if ver.dwPlatformId=VER_PLATFORM_WIN32_NT then begin
pid := GetCurrentProcessId;
if OpenProcessToken(ph, TOKEN_ADJUST_PRIVILEGES, handle) then
if LookupPrivilegeValue(nil, "SeShutdownPrivilege", luid) then begin
priv.PrivilegeCount := 1;
priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
priv.Privileges[0].Luid := luid;
dummy := nil;
AdjustTokenPrivileges(handle, false, priv, 0, dummy^, n);
end;
end;
ExitWindowsEx(EWX_REBOOT, 0);
end;

Не особо пробовал под WinNT и выше, но под 9X пашет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо