![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перезагрузка 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 (и вроде даже без кавычек )