Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ExitWindows, ExitWindowsEx, как это работает 
V
    Опции темы
Toboom
Дата 20.2.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



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

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





PM MAIL   Вверх
Sunvas
Дата 20.2.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



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


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Toboom
Дата 20.2.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Спасибо, 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 

Это сообщение отредактировал(а) Alexeis - 20.2.2007, 21:37
PM MAIL   Вверх
Albinos_x
Дата 20.2.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 3
Всего: 108



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

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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.