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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Комп не вырубается, Процедуры из фака 
:(
    Опции темы
Slawanix
  Дата 25.9.2004, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

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



Уважаемые коллеги, помогите разобраться с ситуацией:
Выключаю компьютер под управлением XP Home Edition без SP функциями из всем известного хелпа DRKB на нашем форуме:

Код
function GetWinVersion: String;
var
  VersionInfo : TOSVersionInfo;
  OSName      : String;  
begin  
  // устанавливаем размер записи
  VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );  

  if Windows.GetVersionEx( VersionInfo ) then  
     begin  
        with VersionInfo do  
        begin  
           case dwPlatformId of  
              VER_PLATFORM_WIN32s   : OSName := 'Win32s';  
              VER_PLATFORM_WIN32_WINDOWS : OSName := 'Windows 95';  
              VER_PLATFORM_WIN32_NT      : OSName := 'Windows NT';  
           end; // case dwPlatformId  
           Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +  
                     #13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';  
        end; // with VersionInfo  
     end // if GetVersionEx  
  else  
     Result := '';  
end;  

procedure ShutDown;
const  
 SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';   // Borland forgot this declaration  
var  
 hToken       : THandle;  
 tkp          : TTokenPrivileges;  
 tkpo         : TTokenPrivileges;  
 zero         : DWORD;  
begin  
 if Pos( 'Windows NT', GetWinVersion) = 1  then // we've got to do a whole buch of things  
    begin  
       zero := 0;  
       if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then  
          begin  
            MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );  
            Exit;  
          end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)  
       if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then  
          begin  
            MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );  
            Exit;  
          end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)  


       // SE_SHUTDOWN_NAME  
       if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then  
          begin  
             MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK );  
             Exit;  
          end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )  
       tkp.PrivilegeCount := 1;  
       tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;  

       AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );  
       if Boolean( GetLastError() ) then  
          begin  
             MessageBox( 0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK );  
             Exit;  
          end // if Boolean( GetLastError() )  
       else
          ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
     end // if OSVersion = 'Windows NT'
  else  
     begin // just shut the machine down  
       ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
     end; // else  
end;


Чтобы выключить PC вызываю процедуру Shutdown и
Происходит следующее:
1) если вызываю в запущеном на выполнение приложение в среде Delhi7, то комп вырубается, но не до конца, т.е.
пишет
Цитата
Теперь питание компьтера можно выключить и лого XP

как в старые добрые времена при AT мамках; т.е. нужно все равно жать кнопочку POWER.
2) если вызываю Shutdown из приложения, запущенного в Винде, то пишет
Цитата
Ошибка shell32. Отсутствует SHExitWindowsEx

Как лечить? Ведь в факе написано что моно выключить любую винду.(у меня АТХ и сама Винда лекго вырубает комп).

С уважением, Slawanix.
cool.gif
--------------------
моск кипит    
PM MAIL WWW   Вверх
Guest
Дата 26.9.2004, 18:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











попробуй этот вариант

Код
if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,HToken) THEN
   begin
   LookupPrivilegeValue(nil,'SeShutdownPrivilege',Luid);
   Tkp.Privileges[0].Luid:=Luid;
   Tkp.PrivilegeCount:=1;
   Tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
   if AdjustTokenPrivileges(HToken,false,Tkp,0,nil,ReturnLength) then
      begin
      ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0);
      end;
   end;


Это сообщение отредактировал(а) p0s0l - 29.9.2005, 11:30
  Вверх
Albinos_x
Дата 26.9.2004, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



прошу прощения забыл зарегистрироваться.

поясняю:
компьютер должен выключиться, при этом он не будет запрашивать работающие приложения на сохранение данных.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Slawanix
Дата 26.9.2004, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

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



Albinos_x, я еще не особо секу в этом, не совсем понял, куда это нужно вставить. Что в Shutdown, это я понял. Но, по-моему, там есть похожие строки. Подскажи, пожалуйста. Или ты предлагаешь просто использовать твой код без GetWinVersion?
С уважением, Slawanix.

Это сообщение отредактировал(а) Slawanix - 26.9.2004, 20:35
--------------------
моск кипит    
PM MAIL WWW   Вверх
p0s0l
Дата 28.9.2004, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



1)
Попробуй вместо EWX_SHUTDOWN поставить EWX_POWEROFF, хотя лично у меня вырубилось с EWX_SHUTDOWN...

2)
Цитата(Slawanix @ 25.9.2004, 22:35)
2) если вызываю Shutdown из приложения, запущенного в Винде, то пишет

Цитата   Ошибка shell32. Отсутствует SHExitWindowsEx


1 и 2 случай - это одна и та же прога ?

К тому же, имхо, прога с этим кодом не запустится вообще на Win9x из-за статической загрузки DLL - на девятках нет функций для работы с привилегиями и токенами... Надо динамически подключать библиотеки в случае 2k/XP и получать привилегию...


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 28.9.2004, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Цитата
Ошибка shell32. Отсутствует SHExitWindowsEx

Это ты похоже пытался сделать выключение компа в XP способом, который работает в 98/Me:
RunDLL32 shell32,SHExitWindowsEx 8
(или же напрямую вызывал эту функцию).

Под XP можно также вырубить, если выполнить следующую командную строку:
shutdown -s -f -t 0



--------------------
С уважением, г-н Посол.
PM   Вверх
Slawanix
Дата 1.10.2004, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

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



Цитата
Попробуй вместо EWX_SHUTDOWN поставить EWX_POWEROFF

p0s0l , спасибо тебе: с Повероффом все отключается, причем из под ограниченного пользователя тоже без проблем. wink.gif
Цитата
К тому же, имхо, прога с этим кодом не запустится вообще на Win9x из-за статической линковки - на девятках нет функций для работы с привилегиями и токенами... Надо динамически подключать библиотеки в случае 2k/XP и получать привилегию...

Ну, вообще, я писал таймер отключения для себя под XP, но, кто знает, что будет дальше. Совет дельный, благодарю!
С уважением, Slawanix.

Это сообщение отредактировал(а) Slawanix - 2.10.2004, 00:00
--------------------
моск кипит    
PM MAIL WWW   Вверх
Albinos_x
Дата 2.10.2004, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Slawanix
У меня этот код работает без GetWinVersion и под ХР, и под МЕ, под 9х не пробовал, но думаю, тоже будет работать.
если под 9х не сработает, то вместо :

if AdjustTokenPrivileges(HToken,false,Tkp,0,nil,ReturnLength) then
begin
ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0);
end;

попробуй подставить :

AdjustTokenPrivileges(HToken,false,Tkp,0,nil,ReturnLength) ;
ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0)



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Slawanix
Дата 2.10.2004, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

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



Цитата
У меня этот код работает без GetWinVersion и под ХР, и под МЕ, под 9х не пробовал

Albinos_x , привет!
Слушай, по-моему, Win Me тоже относится к девяти-иксовым.

Цитата
попробуй подставить :

AdjustTokenPrivileges(HToken,false,Tkp,0,nil,ReturnLength) ;

А насчет привелегий, p0s0l писал, что под девятыми (95, 98, Ме) нет функций для работы с привелегиями и токенами. Вот, лирическое отступление.

Спасибо, что не оставляешь попытки помочь мне adv/hello.gif буду опробовать твой код, впечатлениями обязательно поделюсь wink.gif .
С уважением, Slawanix.

Добавлено @ 21:26
Цитата
1 и 2 случай - это одна и та же прога ?

p0s0l , прошу прощения, сразу не заметил. Да, прога одна и таже была. smile.gif
С уважением, Slawanix.

--------------------
моск кипит    
PM MAIL WWW   Вверх
Albinos_x
Дата 2.10.2004, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Цитата
под девятыми (95, 98, Ме) нет функций для работы с привелегиями и токенами


так и есть, если в код вставить ELSE с сообщениями о том, что привелегии не получены, то они как раз будут у тебя вылетать, но ошибки выскакивать не будет, поэтому я и предложил использовать код под девятые без условий. Тогда, даже если привелегии получены не будут (если это конечно не ошибка в ХР), то компьютер всё равно выключится.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Slawanix
Дата 2.10.2004, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

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



Цитата
буду опробовать твой код

Вот, только что поробовал, в таком виде она у меня сработала, тоже все Ok.
Только под 9x пока нет возможности проверить.
Код

procedure ShutDown;
const
 SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';   // Borland forgot this declaration
var
 hToken       : THandle;
 tkp          : TTokenPrivileges;
 tkpo         : TTokenPrivileges;
 zero         : DWORD;
begin
//***********
if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,HToken) THEN
begin
LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[ 0 ].Luid );
Tkp.PrivilegeCount:=1;
Tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(HToken,false,Tkp,0,nil,zero) then
begin
ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0);
end;
end;
//***********
end;

С уважением, Slawanix. adv/72.gif

Добавлено @ 22:24
Цитата
Тогда, даже если привелегии получены не будут (если это конечно не ошибка в ХР), то компьютер всё равно выключится.

Насколько я понял, за это флажок EWX_FORCE отвечает?
--------------------
моск кипит    
PM MAIL WWW   Вверх
Albinos_x
Дата 2.10.2004, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



EWX_FORCE
отвечает за то, что винда будет выключаться в форсированном режиме, т.е. запрос работающим приложениям на закрытие посылаться ей не будет.

Не понятно зачем тебе константа, она у тебя ни где не используется?!..


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Albinos_x
Дата 2.10.2004, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Привожу флаги:

EWX_LOGOF : Смена пользователя.
EWX_POWEROFF : Выключение компьютера иего системы питания, если он конечно это поддерживает. В NT клонах винды срабатывает если процесс имеет привелегию SE_SHUTDOWN_NAME.
EWX_REBOOT : перезагрузка. В NT клонах винды срабатывает если процесс имеет привелегию SE_SHUTDOWN_NAME.
EWX_SHUTDOWN : выключение компьютера без выключения питания. Если в работающих приложениях предусмотренно запросы на сохранение данных, то они выполняется. В NT клонах винды срабатывает если процесс имеет привелегию SE_SHUTDOWN_NAME.
EWX_FORCE : как я уже говорил, форсированное выключение компьютера. Винда не посылает работающим приложениям сообщение WM_QUERYENDSESSION и WM_ENDSESSION. А следовательно эти приложения не делают запросов на сохранение данных пользователю. В NT клонах винды срабатывает если процесс имеет привелегию SE_SHUTDOWN_NAME.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Slawanix
Дата 3.10.2004, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

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



Цитата
Не понятно зачем тебе константа, она у тебя ни где не используется?!..

Да со старого кода осталось, не проследил. hehe.gif
В этом коде еще одна переменная не используется, сейчас только заметил, это tkpo.
С остальным понятно, спасибо.
С Уважением, Slawanix.
--------------------
моск кипит    
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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