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

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

перезагрузка Windows [NT4, Win2k, WinXP]


stikriz ©   (2002-06-16 03:44:00) 

Что я делаю не так?

if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
LookupPrivilegeValue(nil, "SE_SYSTEMTIME_NAME",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_FORCE or EW_REBOOTSYSTEM , 0);
end;

А в ответ ничего не происходит.


Kuljok   (2002-06-17 19:52:00) [1]

Эээээээ... Винават... "winnt.h".
"winnt.pas" нету...., SE_SHUTDOWN_NAME ваще ниде не объявлен. Ну или точнее я его не нашел....


ZZ   (2002-06-17 16:18:00) [2]

и где ты взял winnt.pas ?


ZZ   (2002-06-17 16:15:00) [3]

Kuljok
Маладэц


Kuljok   (2002-06-17 14:33:00) [4]

В общем исходя из примера и глядя в winnt.pas
const
SE_SHUTDOWN_NAME = "SeShutdownPrivilege";

перезагрузка такая вот будет

if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken) then Application.MessageBox("Ошибка открытия процесса", "ОШИБКА", MB_OK);
LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME,tkp.Privileges[0].Luid);
tkp.PrivilegeCount:=1;
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), @old_tkp, ReturnLength);

if GetLastError <> ERROR_SUCCESS then Application.MessageBox("Ошибка получения привилегии",
"ОШИБКА",MB_OK) else
ExitWindowsEx(EWX_FORCEIFHUNG or EWX_REBOOT , 0);


ZZ   (2002-06-17 10:50:00) [5]

stikriz
А ты в фак вообще заглядывал ? :)
http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988621105&n=15

Чуть повыше по исходникам windows.pas поднимись.
Мало ли что в Windows.pas описано. Какое это отношение имеет к ExitWindowsEx ? Или у меня MSDN старый или такой константы там не предусмотрено.


stikriz   (2002-06-17 01:21:00) [6]

Привет.

> А откуда такая интересная константа - EW_REBOOTSYSTEM

Чуть повыше по исходникам windows.pas поднимись.

Я тут поискал на сайте и кое-что нашел. После небольшой правки (человек, наверное, по памяти писал, поэтому были опечатки) работает как часы. Советую модератору поместить этот код в фак.

procedure TForm1.Button1Click(Sender: TObject);
begin
self.WinExit(EWX_REBOOT or EWX_FORCE); // Перезагрузка
end;


function TForm1.SetPrivilege(aPrivilegeName : string;
aEnabled : 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( aPrivilegeName ),
TP.Privileges[ 0 ].LUID ) ) then
begin
if( aEnabled )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;


function TForm1.WinExit( iFlags : integer ) : boolean;
// возможные флаги:
// EWX_LOGOFF
// EWX_REBOOT
// EWX_SHUTDOWN
begin
Result := True;
if( SetPrivilege( "SeShutdownPrivilege", true ) ) then
begin
if( not ExitWindowsEx( iFlags, 0 ) )then
begin
Result := False;
end;
SetPrivilege( "SeShutdownPrivilege", False )
end
else
begin
Result := False;
end;
end;


ZZ   (2002-06-17 01:08:00) [7]

А откуда такая интересная константа - EW_REBOOTSYSTEM ??
Там вроде были только EWX_POWEROFF EWX_REBOOT EWX_SHUTDOWN


stikriz   (2002-06-16 18:03:00) [8]

Чего это модератор все удаляет?


GOOFFY   (2002-06-16 11:17:00) [9]

Удалено модератором


stikriz   (2002-06-16 11:14:00) [10]

Удалено модератором


dexter   (2002-06-16 11:13:00) [11]

Удалено модератором


zozo lh   (2002-06-16 11:12:00) [12]

Удалено модератором


_______BAKLAN________   (2002-06-16 11:10:00) [13]

Удалено модератором


GOOFFY   (2002-06-16 11:08:00) [14]

Удалено модератором


stikriz   (2002-06-16 04:07:00) [15]

Я ставил уже SE_SHUTDOWN_NAME. И если его поставить, то тоже не будет перегружаться. Можно просто выключить, если добавить or EWX_REBOOT. А почему без кавычек? Вот как объявлено в windows.pas
functionLookupPrivilegeValue(lpSystemName, lpName: PChar;
varlpLuid: TLargeInteger): BOOL; stdcall;

Николай.


ZZ   (2002-06-16 04:00:00) [16]

А почему именно "SE_SYSTEMTIME_NAME"? Там надо SE_SHUTDOWN_NAME (и вроде даже без кавычек )


Наверх

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