Что нового

Агрессивный вариант выключения компьютера

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Здравствуйте, просьба помочь в реализации агрессивного отключения компьютера. Приведу пример подобной работы у диспетчера задач PROWiSe Manager Пункт меню - завершение работы

После нажатия на кнопку "Выключение" компьютер на несколько секунд "виснет" и отключается(На подобие выключения загрузочной ОС с диска, только там выключение происходит без задержки).
Данная программа не использует собственных dll и я решил что она это делает через системные функции. Если это так можно ли то же самое инициировать на AutoIt?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
MnM
Код:
Shutdown

с параметрами "4" и "16"
не оно?
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Вот пример команды принудительного выключения.
Код:
C:\WINDOWS\system32\shutdown.exe -r -t 00 -f
C:\WINDOWS\system32\shutdown.exe -s -t 00 -f
Программам не даётся время на завершение. Я давно использую эти ярлыки на рабочем столе. Ctrl+D - сворачиваю приложения и жму ярлык. Намного быстрее чем искать в меню кнопки и ждать по 20 сек на каждую программу, если она не сохранила данные.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
WSWR
Увы это не то
AZJIO
Увы это тоже не то
OffTopic:
Я с shutdown игрался когда еще даже не знал vbs скрипты=)


Ну вот смотрите(или читайте :smile:): есть такие ОС которые работают с диска LiveCD и т.д. в них операция отключения происходит быстро из-за того что ни не сохраняют память из ОЗУ, просто отключают питание. Так в PROWiSe Manger почти то же самое только до отключения питания часть важных данных скорее всего записывается на диск из ОЗУ из-за чего наверное и задержка. Попробуйте сами в этой программе так выключить компьютер, увидите разницу между обычным выключением(Кнопки в пуске, команды shutdown и т.п.)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
MnM
MnM сказал(а):
В LiveCD система загружается с нуля, она ничего не помнит о сесиях и тому подобное, а стационарная система на некоторых машинах предлагает потом проверить HDD с помощью chkdsk.exe или предлагает загрузить предыдущий успешный запуск. Я уже пробовал пробовал какой то скрипт с офсайта, он выключил компьютер как если бы я нажал кнопку "Рестарт" на компьютере, но я был не доволен этим.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
AZJIO сказал(а):
он выключил компьютер как если бы я нажал кнопку "Рестарт"
Оно самое.
А чем вы были не довольны?


Добавлено:
Сообщение автоматически объединено:

Пока что нашел решение(наверное) на Delphi
тут
Но пока что не известно откуда брать константы для передачи функции.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
OffTopic:
выключение ПК подобным образом чревато повреждением данных на жестком диске. это факт
если накопитель SSD, то возможно все будет гуд
 

sims

Осваивающий
Сообщения
184
Репутация
24
MnM [?]
Но пока что не известно откуда брать константы для передачи функции.
Это не проблема, ведь код можно компильнуть в dll и подключить в AutoIt, то собственно и сделал.
В файле off.dll имеется функция Off(), вызвав которую, можно программно выключить комп, правда комп выключается довольно долго.

Есть у меня один кодец, который моментально перезагружает комп (типа, нажатия на reset, только программно). Компильнул из него dll, FastReset.dll с функцией Reset().
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Запускать с ключами:
/s - Отключение
/r - Рестарт
:smile:


Добавлено:
Сообщение автоматически объединено:

P.S. Самому интересно данное решение более простым способом (не тот, что я предложил: FileInstall + Run), поэтому, если кто знает, как это выполнить, допустим, "без посторонних файлов" - буду рад :smile:
 

Вложения

  • SHUTDOWNNOW.7z
    42.1 КБ · Просмотры: 1
  • SHUTDOWNNOW.7z
    42.1 КБ · Просмотры: 0
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Astel064; sims
Спасибо, хорошие варианты. Печально нет исходных кодов =)
И еще хотелось бы узнать какие параметры выдавать функции ExitWindowsEx(user32.dll) а то с этими long и int уже голова опускается)
OffTopic:
joiner сказал(а):
выключение ПК подобным образом чревато повреждением данных на жестком диске. это факт
если накопитель SSD, то возможно все будет гуд
Это увы да, но когда основную рабочую часть программ закрыл хотелось бы по быстрее "усыпить" электрическую железку :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
AZJIO сказал(а):
предлагает потом проверить HDD с помощью chkdsk.exe или предлагает загрузить предыдущий успешный запуск
Не удивительно, эта программа напрямую старается ковыряться в системе. :smile:
OffTopic:
Устанавливает свои службы, копирует ntos и впрямь "вируска"
 

sims

Осваивающий
Сообщения
184
Репутация
24
MnM [?]
Печально нет исходных кодов =)
off.dll создана на основе исходника из вашей ссылки, правда, установленных дельфей небыло и код переписал на др. ЯП, но логика работы сохранилась.
Исходники.
off.dll
Код:
#EWX_FORCEIFHUNG = $10

ProcedureDLL Off()
  tp.TOKEN_PRIVILEGES
  tp\PrivilegeCount=1
  tp\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
  If OpenProcessToken_(GetCurrentProcess_(), #TOKEN_ADJUST_PRIVILEGES, @th)
    If LookupPrivilegeValue_(#Null, "SESHUTDOWNPRIVILEGE", @tp\Privileges[0]\Luid)
      AdjustTokenPrivileges_(th, #False, @tp, SizeOf(TOKEN_PRIVILEGES), #Null, @n)
    EndIf
    CloseHandle_(th)
  EndIf
  ExitWindowsEx_(#EWX_FORCE | #EWX_FORCEIFHUNG | #EWX_POWEROFF | #EWX_SHUTDOWN, 0)
EndProcedure

FastReset.dll
Код:
ProcedureDLL Reset()
  IO_Out($64, $FE)
EndProcedure
 

sims

Осваивающий
Сообщения
184
Репутация
24
OffTopic:
asdf8 [?]
А почему не на AutoIt?
Неохота было возится с декларацией структур, констант и API функций. Это бы заняло больше времени чем создать dll.

Это ж форум не про "др. ЯП"
Поэтому и не выкладывал исходники в месте с библиотеками.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
OffTopic:

sims [?]
Неохота было возится с декларацией структур, констант и API функций. Это бы заняло больше времени чем создать dll.

Объявить несколько констант и структур по-любому лучше, чем таскать с программой костыли в виде dll, особенно, если можно обойтись без костылей.
 

sims

Осваивающий
Сообщения
184
Репутация
24
OffTopic:
asdf8 [?]
Объявить несколько констант и структур по-любому лучше, чем таскать с программой костыли в виде dll, особенно, если можно обойтись без костылей.
В место того чтобы разводить здесь оффтоп, вы могли бы взять и переписать на AutoIt. Или вы можете только других упрекать?
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Побездельничал, побездельничал и немного покопался в коде на PB, "почитал" значения у констант, уже на четверть пути к завершению. Не получается "расковырять" присвоение привилегий для token, и не уверен что именно те значения(т.е. тип у значений) я передаю функции:
Код:
#include<WinAPiEx.au3>
Global Const $EWX_FORCEIFHUNG=16
Global Const $EWX_FORCE=4
Global Const $EWX_POWEROFF=8
Global Const $EWX_SHUTDOWN=1
Global Const $EWX_REBOOT=2
Func _ExitWindowsEx($param)
	Local $shutdown,$adj
	Switch $param
		Case "1"
			$shutdown=BitOR($EWX_FORCE,$EWX_FORCEIFHUNG,$EWX_POWEROFF,$EWX_SHUTDOWN)
		Case "2"
			$shutdown=BitOR($EWX_FORCE,$EWX_FORCEIFHUNG,$EWX_REBOOT,$EWX_SHUTDOWN)
		Case Else
			Return SetError(1)
	EndSwitch
	$hToken=_WinAPI_OpenProcessToken($TOKEN_ADJUST_PRIVILEGES)
	_WinAPI_AdjustTokenPrivileges($hToken,,$SE_PRVILEGE_ENABLED,$adj);тут проблемы, что во 2 параметр вставлять
	$call=DllCall("user32.dll","long","ExitWindowsEx",'UINT',$shutdown,'dword',0)
	Return $call[0]
EndFunc

OffTopic:
Кстати на счет оффтопа. Вы не останавливайтесь, продолжайте дискуссии, мне греют душу всякие "разборки" :smile:



Добавлено:
Сообщение автоматически объединено:

Странно, у msdn расходятся константы:
Код:
Global Const $EWX_FORCEIFHUNG=0x00000010
Global Const $EWX_FORCE=0x00000004
Global Const $EWX_POWEROFF=0x00000008
Global Const $EWX_SHUTDOWN=0x00000001
Global Const $EWX_REBOOT=0x00000002
 
Верх