1 Востаннє редагувалося Konstantin78 (22.06.2018 17:05:22)

Тема: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

Добрий час доби

У мене моя програма (написана на Delphi) №1, контроллирует деякий процес №2, і якщо що то перевантажує комп'ютер(ПК).

Windows10 чиста, встановлена тільки програма яка займається обчисленням значень(деякий процес №2) і моя програма і ще декілька не суттевих програм.

Але ось після деякого часу став помічати, що моя програма НЕ ЗАВЖДИ може перезавантажити ПК, тобто в момент коли №1 починає перевантажувати ПК, №1 і №2 вивантажуються з пам'яті ПК, а сам ПК продовжує працювати з відміткою в журналі:

"спроба користувача DESCTOP - UU0QHSS\home перезапустити або завершити роботу комп'ютера DESCTOP - UU0QHSS не вдалася" (дивися малюнок внизу)

Звіт запуску "sfc/scannow" :

C:\WINDOWS\system32>sfc/scannow
Начато сканирование системы. Этот процесс может занять некоторое время.

Начало стадии проверки при сканировании системы.
Проверка 100% завершена.

Программа защиты ресурсов Windows обнаружила поврежденные файлы, но не
может восстановить некоторые из них.
Подробные сведения см. в файле CBS.Log, который находится по следующему пути:
windir\Logs\CBS\CBS.log. Например, C:\Windows\Logs\CBS\CBS.log. Подробные сведения
включены в файл журнала, предоставляемый флагом /OFFLOGFILE.

C:\WINDOWS\system32

>
Звіт CBS.log

Та ще одна така штука, перевантажую ПК (Вимкнув/включив), ПК заводиться, писк, знову вирубується на пів секунди, і знову заводиться вже нормально.

Post's attachments

generic.png 238.59 kb, 182 downloads since 2018-06-22 

2

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

Є така фішка в Windows; буває навіть якщо ви вручну перезавантажуєте. Самого бісить.
Можете спробувати налаштувати завдання, щоб ваша програма перезапускалася раз на годину, чи навіть створити службу (це трохи складніше).

3

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

Таке може бути, якщо деякі програми не підтвердили свою готовність до перезавантаження, або зробили це надто пізно. Найпростіший приклад, це коли у вас в блокноті чи Ворді є незбережений документ. Якщо ви запустите вимкнення, а потім в діалозі Блокнота клікнете кнопку Відміна, то комп не вимкнеться. Аналогічний механізм є в сервісах та драйверах. Щоб ігнорувати подібні обмеження, можна запустити команду "shutdown -r -f" (форсоване перезавантаження). На жаль не знаю, який аналог є в WinAPI.

Подякували: leofun011

4

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

https://msdn.microsoft.com/uk-ua/librar … s.85).aspx
Щось на кшталт

InitiateShutdown(NULL,NULL,5,SHUTDOWN_FORCE_OTHERS|SHUTDOWN_FORCE_SELF|SHUTDOWN_RESTART,SHTDN_REASON_MAJOR_SOFTWARE);
Подякували: leofun011

5

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

koala написав:

https://msdn.microsoft.com/uk-ua/librar … s.85).aspx
Щось на кшталт

InitiateShutdown(NULL,NULL,5,SHUTDOWN_FORCE_OTHERS|SHUTDOWN_FORCE_SELF|SHUTDOWN_RESTART,SHTDN_REASON_MAJOR_SOFTWARE);

Ось мій блок коду, який перезавантажує ПК, програма працювала з грудня минулого року бездоганно

function TFMain.MyExitWindows(RebootParam: Longword): Boolean;
//restart or off computer
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;

Звичайно я використовую тут ExitWindowsEx
може треба було використати щось інше?

6 Востаннє редагувалося Konstantin78 (22.06.2018 20:56:20)

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

так, а виклик функції ось так:

FMain.MyExitWindows(EWX_REBOOT or EWX_FORCE);

7 Востаннє редагувалося koala (22.06.2018 21:04:14)

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

Якщо я правильно пам'ятаю, то в Delphi це

Result := InitiateShutdown(nil{computer, nil=local}, 
                           nil{message}, 
                           5{seconds to reboot}, 
                           SHUTDOWN_FORCE_OTHERS|SHUTDOWN_FORCE_SELF|SHUTDOWN_RESTART, 
                           SHTDN_REASON_MAJOR_SOFTWARE);

Але біс його зна, чи захоче воно реально перезавантажуватися з першого разу. Ще раз раджу додати в "призначені завдання" запуск ваших програм, а в самі програми - перевірку, чи не треба перезавантажуватися.

8

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

koala написав:

...Ще раз раджу додати в "призначені завдання" запуск ваших програм

Якщо ви про запуск програм, тут все просто програма №1 вписана в реєстр

\HKEY _ CURRENT _ USER\Software\Microsoft\Wi ndows\CurrentVersion\Run"

, з ключем "

d:\Min\Min control\Control.exe

"
а вона всвою черга запускає вже програму №2.

Але я ваш варіант, всеже спробую...

9 Востаннє редагувалося Konstantin78 (23.06.2018 07:07:50)

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

Так, ваш варіант також працює (перевантажує ПК)

InitiateSystemShutdown(nil, // shut down local computer
                       nil,//'Cheater detected on this system. Shutdown initiated.', // message to user
                       1, // time-out period
                       FALSE, // ask user to close apps
                       TRUE

але помилки не прибирає, тобто при якихось діях ОС, система НЕ перезавантажується.

цікаво, що в журналі пишеться:

Процесс D:\Min\Min control\Control.exe (DESKTOP-UU0QHS5) инициировал действие "Перезапустить" для компьютера DESKTOP-UU0QHS5 от имени пользователя DESKTOP-UU0QHS5\home по причине: Завершение работы, вызванное устаревшей API-функцией
Код причины: 0x80070000
Тип выключения: Перезапустить
Комментарий:

а раніше писало

"спроба користувача DESCTOP - UU0QHSS\home перезапустити або завершити роботу комп'ютера DESCTOP - UU0QHSS не вдалася"

треба всетаки вивчити лог(там помилка по ), приведену в першому моєму посту

Дякую всім за відгук

10

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

По-перше, це не мій варіант.
По-друге, якщо ви відкриєте документацію, то побачите, що 4-й параметр вашої функції FALSE якраз каже НЕ перезавантажувати, якщо хтось заважає. Поміняйте на TRUE.

11

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

Якщо у вас сімка або щось свіжіше, то там є планувальник завдань. Знайдіть у лівій колонці провідника або на робочому столі значок комп'ютера, клацніть по ньому правою кнопкою, далі Керування, і там буде Task Scheduler. У ньому можна дуже гнучко налаштувати виконання різних дій. В тому числі і після появи певного запису в системному журналі подій.

12 Востаннє редагувалося Konstantin78 (25.06.2018 23:02:25)

Re: Іноді програма не може перевантажити комп'ютер "спроба користувача пер

Всеж зупинився на команді:

WinExec('shutdown /r /f /t 0', SW_HIDE);

припало правда ще поправити ОС:

DISM /Online /Cleanup-Image /RestoreHealth

оскільки були помилки з системними файлами, інакше навіть з 'shutdown /r /f /t 0' проблеми всеже були з рідкісним "неперевантаженням" ОС.

Подякували: leofun011