Автор Тема: Как вернуть кнопку выключения компьютера?  (Прочитано 8331 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн virf

  • Пользователь
  • Сообщений: 241
    • Просмотр профиля
Пропала кнопка выключения компьютера. Скорее всего причиной является заценивание мной примеров программ с диска, прилагаемого к книге М. Фленова "Программирование на C++ глазами хакера". Диспетчер задач не запускается, при нажатии Ctrl+Alt+Delete появляется ошибка "Диспетчер задач отключен администратором". Также не запускается Win+R, пишет "Операция отменена вследствие действующих для компьютера ограничений. Обратитесь к администратору сети." Перезагрузка не помогает. Что делать?

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #1 : 06 Август 2006, 14:04:11 »
Пользоваться VMware Workstation =)

Попробуй под администратором войти в виндовс.

ЗЫ: кинь мне папку DEMO с этого диска, а то у меня книга в электронном виде.
« Последнее редактирование: 06 Август 2006, 14:06:23 от Йобан Матич »

Оффлайн virf

  • Пользователь
  • Сообщений: 241
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #2 : 06 Август 2006, 21:31:24 »
Держи ссылку в PM. Если у тебя установлен VMware Workstation объясни плиз че там сделать нужно, я в английском не силён.

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #3 : 06 Август 2006, 22:38:13 »
ZufuS,
А чт оона так много весит?
Про  VMware Workstation чуть позже напишу..

Оффлайн virf

  • Пользователь
  • Сообщений: 241
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #4 : 06 Август 2006, 22:41:27 »
Цитата: Йобан Матич
ZufuS,
А чт оона так много весит?
хз, я вроде ниче не добавлял, че не будешь качать?

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #5 : 06 Август 2006, 22:52:17 »
не...
я со своим 2р за метр не осилю... дороо... =(
Кста лучше сделй так:
создай текстовый документ со строкой
TREE /F DEMO > OUT.TXT
сохрани его с расширением bat в той же папке что и папка demo и кликни по нему.

полученный out.txt мне пришли, я выберу оттуда то что нужно.

ЗЫ : выложи ссылки на архив на всеобщее оборзение, может кому ещё пригодится.

Оффлайн NecRomantic

  • Пользователь
  • Сообщений: 886
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #6 : 07 Август 2006, 01:20:13 »
Это пластмассовую такую что ли? Внизу на корпусе? 8)

Оффлайн Mortal Hero

  • Пользователь
  • Сообщений: 1570
  • Пол: Мужской
  • Явился, не запылился... :)
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #7 : 07 Август 2006, 03:10:54 »
Цитата: ZufuS
Пропала кнопка выключения компьютера. Скорее всего причиной является заценивание мной примеров программ с диска, прилагаемого к книге М. Фленова "Программирование на C++ глазами хакера". Диспетчер задач не запускается, при нажатии Ctrl+Alt+Delete появляется ошибка "Диспетчер задач отключен администратором". Также не запускается Win+R, пишет "Операция отменена вследствие действующих для компьютера ограничений. Обратитесь к администратору сети." Перезагрузка не помогает. Что делать?

попробуй сделать восстановление системы. С другой стороны, чтобы расблокировать диспечер задач, надо кнопку вставить в корпус...тоесть тьфу в регистре кое что с 1 на 0 заменить вроде.

А вообще закажи на eBay кнопку круглую, и вставь в корпус. Помогает 100 процентов! Или там, например из розетки провод выдёргивай и будет тебе выключение.

Оффлайн virf

  • Пользователь
  • Сообщений: 241
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #8 : 07 Август 2006, 06:29:37 »
А как я по-твоему выключаю? Установка виндоуса поверх того, что ща стоит тоже не помогает. Может можно так установить чтобы обновилась вся системная информация, но никакие там ярлыки, программы из меню пуск и всё такое не трогалось?

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #9 : 07 Август 2006, 15:00:09 »
Цитата: ZufuS
Может можно так установить чтобы обновилась вся системная информация, но никакие там ярлыки, программы из меню пуск и всё такое не трогалось?


копируешь в надёжное место папку documents and settings, форматишь винт, ставишь виндовс и кидаешь папку documents and settings на прежнее место.

Оффлайн virf

  • Пользователь
  • Сообщений: 241
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #10 : 07 Август 2006, 17:09:04 »
Так и сделаю. Тебе в личку пришло письмо?

Оффлайн Zephyr

  • Пользователь
  • Сообщений: 544
  • Пол: Мужской
  • coder
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #11 : 08 Август 2006, 01:05:31 »
ZufuS,
Я не  пойму чего там думать - если уверен что это из-за примеров,
то в книге наверняка достаточно информации чтобы все восстановить.

PS: Alt+F4 - завершает приложение виндовс.
Если хочешь - можно программно выключение написать.
Можешь пока юзать.

Пример на Дельфи. Перегони на Си. Либо скомпилируй в Delphi 5.
*********************************************************
Как выключить компьютер с любой версией Windows?
 Previous  Top  Next  

     
 


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;  

Взято из http://forum.sources.ru




--------------------------------------------------------------------------------


ExitWindowsEx(EWX_FORCE,0);

или

Запуск из коммандной строки

rundll32 krnl386.exe,exitkernel

только под XP все это работает плохо. Надо думать...
Автор: Vit
http://www.delphist.com
http://www.drkb.ru
chicago.lastplanet.com


Взято с Vingrad.ru http://forum.vingrad.ru



--------------------------------------------------------------------------------

exitkernel очень радикальный способ потому что не сохраняются настройки рабочего стола, ini файлы и другие установки, зато быстро

Есть способ намного лучше: ф-ия SHExitWindowsEx из shell32.dll
С неё всё good. Это запуск из-под WinExec()
Программно же только с получением привелегии.
Замечу также что флаг EWX_FORCE необходим только для принудительного завершения при выдаче каких либо сообщений или модальных окон, что воспрепятствует завершению, например, "К компьютеру подключены пользователи. Данные могут быть утярены. Вы хотите завершить работу?" или сообщение, которое автор указал в вопросе.
Если нет таких сообщений EWX_FORCE не обязателен. Также есть отдельные флаги для выключение компьютера (по умолчанию - перезагрузка) или завершения сетевого сеанса.

Автор: Song

Взято с Vingrad.ru http://forum.vingrad.ru

Оффлайн Zephyr

  • Пользователь
  • Сообщений: 544
  • Пол: Мужской
  • coder
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #12 : 08 Август 2006, 01:10:57 »
*********************************************************
Еще
*********************************************************
Как программно вазвать окно Завершение работы Windows?
 Previous  Top  Next  

SendMessage (FindWindow ('Progman', 'Program Manager'), WM_CLOSE, 0, 0);

*********************************************************
еще
*********************************************************
Как выключить, перезагрузить или завершить Windows?
 Previous  Top  Next  

{1.}

function MyExitWindows(RebootParam: Longword): Boolean;  
var  
  TTokenHd: THandle;  
  TTokenPvg: TTokenPrivileges;  
  cbtpPrevious: DWORD;  
  rTTokenPvg: TTokenPrivileges;  
  pcbtpPreviousRequired: DWORD;  
  tpResult: Boolean;  
const  
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';  
begin  
  if Win32Platform = VER_PLATFORM_WIN32_NT then  
  begin  
    tpResult := OpenProcessToken(GetCurrentProcess(),  
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,  
      TTokenHd);  
    if tpResult then  
    begin  
      tpResult := LookupPrivilegeValue(nil,  
                                       SE_SHUTDOWN_NAME,  
                                       TTokenPvg.Privileges[0].Luid);  
      TTokenPvg.PrivilegeCount := 1;  
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  
      cbtpPrevious := SizeOf(rTTokenPvg);  
      pcbtpPreviousRequired := 0;  
      if tpResult then  
        Windows.AdjustTokenPrivileges(TTokenHd,  
                                      False,  
                                      TTokenPvg,  
                                      cbtpPrevious,
                                      rTTokenPvg,
                                      pcbtpPreviousRequired);
    end;
  end;
  Result := ExitWindowsEx(RebootParam, 0);
end;

// Example to shutdown Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;

// Example to reboot Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyExitWindows(EWX_REBOOT or EWX_FORCE);
end;


// Parameters for MyExitWindows()

{************************************************************************}

{2. Console Shutdown Demo}

program Shutdown;
{$APPTYPE CONSOLE}

uses  
  SysUtils,  
  Windows;  

// Shutdown Program  
// (c) 2000 NeuralAbyss Software  
// http://www.neuralabyss.com  

var  
  logoff: Boolean = False;  
  reboot: Boolean = False;  
  warn: Boolean = False;  
  downQuick: Boolean = False;  
  cancelShutdown: Boolean = False;  
  powerOff: Boolean = False;  
  timeDelay: Integer = 0;  

function HasParam(Opt: Char): Boolean;  
var  
  x: Integer;  
begin  
  Result := False;  
  for x := 1 to ParamCount do  
    if (ParamStr(x) = '-' + opt) or (ParamStr(x) = '/' + opt) then Result := True;  
end;  

function GetErrorstring: string;  
var  
  lz: Cardinal;  
  err: array[0..512] of Char;  
begin  
  lz := GetLastError;  
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil);  
  Result := string(err);  
end;  

procedure DoShutdown;  
var  
  rl, flgs: Cardinal;  
  hToken: Cardinal;  
  tkp: TOKEN_PRIVILEGES;  
begin  
  flgs := 0;  
  if downQuick then flgs := flgs or EWX_FORCE;  
  if not reboot then flgs := flgs or EWX_SHUTDOWN;  
  if reboot then flgs := flgs or EWX_REBOOT;  
  if poweroff and (not reboot) then flgs := flgs or EWX_POWEROFF;  
  if logoff then flgs := (flgs and (not (EWX_REBOOT or EWX_SHUTDOWN or EWX_POWEROFF))) or  
      EWX_LOGOFF;  
  if Win32Platform = VER_PLATFORM_WIN32_NT then  
  begin  
    if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,  
      hToken) then  
      Writeln('Cannot open process token. [' + GetErrorstring + ']')  
    else  
    begin  
      if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then  
      begin  
        tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  
        tkp.PrivilegeCount           := 1;  
        AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);  
        if GetLastError <> ERROR_SUCCESS then  
          Writeln('Error adjusting process privileges.');  
      end  
      else  
        Writeln('Cannot find privilege value. [' + GetErrorstring + ']');  
    end;  
    {   if CancelShutdown then  
          if AbortSystemShutdown(nil) = False then  
            Writeln(\'Cannot abort. [\' + GetErrorstring + \']\')  
          else  
           Writeln(\'Cancelled.\')  
       else  
       begin  
         if InitiateSystemShutdown(nil, nil, timeDelay, downQuick, Reboot) = False then  
            Writeln(\'Cannot go down. [\' + GetErrorstring + \']\')  
         else  
            Writeln(\'Shutting down!\');  
       end;  
    }  
  end;  
  //     else begin  
  ExitWindowsEx(flgs, 0);  
  //     end;  
end;  

begin  
  Writeln('Shutdown v0.3 for Win32 (similar to the Linux version)');  
  Writeln('(c) 2000 NeuralAbyss Software. All Rights Reserved.');  
  if HasParam('?') or (ParamCount = 0) then  
  begin  
    Writeln('Usage:    shutdown [-akrhfnc] [-t secs]');  
    Writeln('                  -k:      do not really shutdown, only warn.');  
    Writeln('                  -r:      reboot after shutdown.');  
    Writeln('                  -h:      halt after shutdown.');  
    Writeln('                  -p:      power off after shutdown');  
    Writeln('                  -l:      log off only');  
    Writeln('                  -n:      kill apps that do not want to die.');  
    Writeln('                  -c:      cancel a running shutdown.');  
  end  
  else  
  begin  
    if HasParam('k') then warn := True;  
    if HasParam('r') then reboot := True;  
    if HasParam('h') and reboot then  
    begin  
      Writeln('Error: Cannot specify -r and -h parameters together!');  
      Exit;  
    end;  
    if HasParam('h') then reboot := False;  
    if HasParam('n') then downQuick := True;  
    if HasParam('c') then cancelShutdown := True;  
    if HasParam('p') then powerOff := True;  
    if HasParam('l') then logoff := True;  
    DoShutdown;  
  end;  
end.

   
Взято сhttp://delphiworld.narod.ru


--------------------------------------------------------------------------------

Для выполнения перезагрузки/выключения предназначены функции ExitWindows/ExitWindowsEx

ExitWindows:

Описание:
Function ExitWindows(Reserved: DWord; ReturnCode: Word): Bool;
Иницииpует стандаpтную пpоцедуpу завеpшения pаботы с Windows. Все пpикладные задачи должны подтвеpдить завеpшение pаботы Windows. Вызывает функцию 4CH пpеpывания 21H DOS.

Паpаметpы:
Reserved: Установлен в нуль.
ReturnCode: Значение, пеpедаваемое в DOS (в pегистpе AL).

Возвpащаемое значение:
Нуль, если одна или несколько задач отказываются завеpшить pаботу.

Примеры использования:
ExitWindows(EWX_LOGOFF,0); - завершение сеанса
ExitWindows(EWX_SHUTDOWN,0); - выключение компьютера
ExitWindows(EWX_REBOOT,0); - перезагрузка
Флаги EWX_FORCE, EWX_POWEROFF и EWX_FORCEIFHUNG могут комбинироваться к нужному действию.

ExitWindowsEx:
Функция ExitWindowsEx() представляет собой расширенный вариант ExitWindows().

Описание:
BOOL ExitWindowsEx( UINT uFlags, DWORD dwReserved, );
Функция ExitWindowsEx перезагружает(restart) или выключает систему (shutdown), а также может завершить сессию для текущего пользователя(log off).

Параметры:
uFlags -- флаг завершения работы, может принимать следущие значения:
EWX_LOGOFF завершает сессию текущего пользователя.
EWX_POWEROFF выключает питание компьютера(компьютер должен поддерживать данную функцию).
EWX_REBOOT перезагружает систему.
EWX_SHUTDOWN завершает работу комьпьютера до того места, где он может быть безопасно выключен: сброшенны все файловые буферы на диск, завершает работу всех процессов.
dwReserved --Зарезирвированно для последующих нужд, параметр игнорируется.

Возвращаемое значение:
Не ноль если всё прошло успешно

Пример использования:
ExitWindowsEx(EWX_SHUTDOWN,0);
Остальные примеры смотри в описании первой функции.

Вышеописанные примеры действительны только для w9x/Me.
Дело в том, что, чтобы выполнить функциию в NT ОС, нужно получить права на выполнение этой функции. Сделать это можно через AdjustTokenPriviligies.
С помощью нижеприведённой функции можно получить любую привелегию, в т.ч. и привеленгию SeShutdownPrivilege, которая нужна для разрешения функции ExitWindows(Ex)



Function 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;  


Пример использования для среды NT:

 SetPrivilege('SeShutdownPrivilege',True);
 ExitWindowsEx(EWX_SHUTDOWN,0);

Автор: Song

Взято из http://forum.sources.ru

Оффлайн virf

  • Пользователь
  • Сообщений: 241
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #13 : 08 Август 2006, 07:44:27 »
Zephyr, спасибо, думаю пригодится, однако я не говорил что я уверен в том, что дело в примерах, и поскольку в книге я рассмотрел только один пример, мне не так просто определить какой именно пример стал причиной, Естественно я пытался восстановить с помощью примеров. На Alt+F4 Windows никак не реагирует, если все окна закрыты, извини что в первом посту забыл написать.

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Как вернуть кнопку выключения компьютера?
« Ответ #14 : 08 Август 2006, 14:14:04 »
Можно всё проще сделать
Создать текстовый документ со строкой

shutdown -s

сохранить с расширением bat и всё.