Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > ExitWindows, ExitWindowsEx


Автор: Toboom 20.2.2007, 19:08
Hi!
Казалось бы ничего нет проще.
Нужно перезапустить комп. Т.е. как "Пуск\ Выключение \ Перезагрузка".
Пробуем так:
  If not Win32Check(ExitWindows(EW_REBOOTSYSTEM, 0)) Then
  ShowMessage('Низя перезагрузиться');
Получаем не полную перезагрузку, а завершение сеанса и предложение
ввести пароль пользователя.
Тогда пробуем так:
If not Win32Check(ExitWindowsEX(EWX_REBOOT, 0)) Then  ShowMessage('Низя перезагрузиться');
получаем сообщение
"System Error code 1394
Клиент не обладает требуемыми правами."
Это при том, что всё происходит от имени администратора.

Где я тут заблудился в трех деревьях?





Автор: Sunvas 20.2.2007, 19:19
Тебе нужны специальные привелегии для выключения компа. А получать их нужно ручками.

Автор: Toboom 20.2.2007, 19:54
Спасибо, Sunvas.
Следующий код позволяет получить такме привилегии.

Код

Function TForm1.AdjustToken: Boolean;
const
 TOKEN_ADJUST_PRIVILEGES = $20;
 TOKEN_QUERY             = $08;
 SE_PRIVILEGE_ENABLED    = $02;
var
 TokenHandle      : THandle;
 lpLuid           : Int64;
 tkp              : _TOKEN_PRIVILEGES;
 tkpNewButIgnored : _TOKEN_PRIVILEGES;
 lBufferNeeded    : Cardinal;
 StId             : string;

function GetErrosString: string; stdcall;
var Len    : Integer;
    Buffer : array[0..255] of Char;
begin
  Len:= FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ARGUMENT_ARRAY, nil,
                     GetLastError, 0, Buffer, SizeOf(Buffer), nil);
  while (Len > 0) and (Buffer[Len - 1] in [#0..#32]) do Dec(Len);
  SetString(Result, Buffer, Len);
end;

begin
 Result:=False; SetLastError(0);
 try
   OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle);
   LookupPrivilegeValue('', 'SeShutdownPrivilege', lpLuid);
   tkp.PrivilegeCount           := 1;    // One privilege to set
   tkp.Privileges[0].Luid       := lpLuid;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(TokenHandle, False, tkp, SizeOf(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded);
   Result:=True;
 except
   Str(GetLastError, StId);
   MessageBox(0, PChar('GetCurrentProcess error = '+StId+' - '+GetErrosString), 'Error', MB_OK+MB_ICONERROR);
 end;
end;


После чего можно
  If AdjustToken Then ExitWindowsEX(EWX_REBOOT, 0))

Всем успехов!

Модератор: используйте подсветку кода http://forum.vingrad.ru/index.php?showtopic=126445 

Автор: Albinos_x 20.2.2007, 20:14
1. Используйте тег Code
2.
Цитата(Toboom @  20.2.2007,  19:54 Найти цитируемый пост)
После чего можно
  If AdjustToken Then ExitWindowsEX(EWX_REBOOT, 0))

такой вариант будет перегружать комп только в NT системах... по 95,98,Me работать не будет...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)