SmartIndicator: индикатор здоровья дисков при входе в Windows

SMART-индикатор дисков при запуске Windows 1.14.4

  • Автор темы Автор темы Guest
  • Дата начала Дата начала
  • Теги Теги
    smart

Переводчик Google

Обновил три текста 1.14.0:
  • Документ «SmartIndicator: как включить оповещения». Поправил разделы про почту, проверку и возможные проблемы. Теперь там есть кнопка «Отправить тест», галочка про сертификат сервера, требование полных адресов и несколько адресов в «Кому».
  • Инструкция по оповещениям (txt). То же самое, что в документе.
  • Текст для форума. Файл SmartIndicator_forum_1.14.0.txt: добавлено чтение журнала NVMe и строка про 1.14.0 в списке изменений (износ SSD из нескольких источников, у HDD строка про износ убрана).
  • Просьба прислать логи. Теперь просит версию 1.14.0 или новее.
 
  • Like
Реакции: E100
Добавил пять копий bat-файлов с английскими именами, архив обновлён (версия 1.14.3).
Русское имя Английское имя
Запуск.bat Run.bat
История.bat History.bat
Проверка без окна.bat Check.bat
Установить в автозапуск.bat Install.bat
Удалить из автозапуска.bat Uninstall.bat

Содержимое у копий то же самое. SmartIndicatorSettings.bat и так назван латиницей. Русские файлы остались, так что ничего не сломается у тех, кто уже ими пользуется.

Теперь их можно запускать и из PsExec, и из любой консоли, где русские буквы набираются неверно. Для PsExec помните: установку (Install.bat) нужно запускать от имени пользователя, а не SYSTEM. Иначе скрипт остановится и объяснит почему.
 

Вложения

Второй ноутбук.

1793604181175.webp
 

Вложения

Сравнил диск «SSD 256GB» с CrystalDiskInfo: цифры совпадают, ошибок в разборе нет.
  • Наработка: в скрипте 1969 ч, в CrystalDiskInfo 1969 ч.
  • Температура: 40 °C в обоих.
  • Износ 0%: верно. В CrystalDiskInfo остаток ресурса A9 равен 100%, то есть износ нулевой. Раньше в 1.13.0 такой ноль был просто значением Windows, теперь он подтверждён SMART.
  • Сектора: переназначенных и нестабильных нет, статус OK.
Но проверка идёт долго: 23, 41 и 32 секунды для одного SSD. На других ваших компьютерах она занимает 8–9 секунд. Это не ошибка, но на ежедневной проверке и при входе в Windows лишнее ожидание заметно.

Чтобы понять, на чём теряется время, в 1.14.4 в лог попадёт строка вида медленный этап (12.3 с): Get-WmiObject … для каждого этапа, который длится 3 секунды и дольше. Туда же попадёт время компиляции C#, если оно большое. Версия есть в архиве, запустить её на Windows я не мог.

Запустите на этом компьютере Check.bat (или Проверка без окна.bat) и пришлите свежий лог: по нему станет видно, какой запрос тормозит (старый WMI, запрос к Storage или определение букв дисков). Дальше можно решать, как его ускорить или отключить.
 

Вложения

Guest обновил(а) ресурс SmartIndicator: индикатор здоровья дисков при входе в Windows новой записью:

Изменения с версии 1.13.0 до 1.14.4

1.14.0
  • NVMe: журнал здоровья читается напрямую: наработка, износ, критические предупреждения, резервная ёмкость, ошибки целостности.
  • Износ SSD берётся из нескольких источников (Windows, NVMe, SMART). У HDD строка про износ убрана.
1.14.1
  • Исправлена ошибка «Cannot find drive», когда TEMP указывает на несуществующий диск. Скрипт сам выбирает рабочую временную папку.
1.14.2
  • В неинтерактивном сеансе (служба, PsExec) окно не...

Узнать больше об этом обновлении...
 
  • Like
Реакции: akok
В последней проверке:

[2026-11-02 15:42:54] SmartIndicator v1.14.4 | запуск: проверка без окна (-Check) | Итог: OK
OK | SSD 256GB (224 ГБ, C:) 1975 ч работы | 40 °C, износ SSD 0% | источник: Storage + WMI (сектора) | тип: SSD
Время проверки: 21.3 с
 
В последней проверке:
Эта вставка выглядит обрезанной: у строки диска нет отступа и пропущено «:» после «C». Строк «медленный этап» в ней нет, хотя в 1.14.4 они должны идти сразу после «Время проверки». Либо вы их не скопировали, либо этапы действительно короче 3 секунд.

Пришлите, пожалуйста, файл SmartIndicator.log целиком, как вложение, а не вставкой. Если «медленных этапов» окажется нет, то время уходит не на запросы WMI, а на что-то другое: например, на сам запуск PowerShell или компиляцию C# в начале. Тогда я добавлю замеры по остальным частям скрипта.
 
Во вложении только мой же архив версии 1.14.5, байт в байт, без логов, так что нового там ничего нет.

Продолжаем с ускорением проверки на компьютере с «SSD 256GB» (21–41 секунда). Нужны два лога версии 1.14.5 с него:

  1. Как есть. Запустите Check.bat. В логе появится строка «медленный этап … Get-PhysicalDisk», если именно этот запрос тормозит. Если он завис бы, его теперь прервёт таймаут 20 секунд.
  2. С быстрым вариантом. Откройте SmartIndicator.ini рядом со скриптом, добавьте строку StorageSource=wmi и снова запустите Check.bat. Если «Время проверки» упадёт с 21 секунды до 5–8, то причина в командлетах, и этот режим можно сделать основным. Данные о диске при этом должны остаться теми же (1975 ч, 40 °C, износ 0%).
Пришлите оба результата одним файлом SmartIndicator.log. Если после первого запуска времени всё равно будет около 21 секунды без «медленных этапов», значит дело не в запросах Storage, и я добавлю замеры по остальным частям скрипта
 

Вложения

Последнее редактирование:
Хотел сделать для всех пользователей окно но антивирус удаляет
  • Новый InstallForAllUsers.bat запускают под администратором. Он копирует программу в C:\Program Files\SmartIndicator, потому что папку администратора другие пользователи не прочитают.
  • Он удаляет старые задачи, привязанные к пользователю, и создаёт задачи от имени SYSTEM: проверка при старте компьютера, ежедневная и наблюдатель за дисками. Их можно запустить и без входа пользователя.
  • Результат проверки пишется в файл SmartIndicator.result. В реестре (HKLM Run) появляется запись, и при входе любого пользователя запускается режим -Show.
  • -Show только читает результат и показывает то же окно (зелёное, оранжевое или красное). Если проверка после загрузки ещё идёт, он ждёт свежий результат до 150 секунд. Если результат старше 3 дней, в окне будет пометка.
  • Обычный пользователь без прав администратора окно получит. Сами SMART-данные он прочитать не может, поэтому их читает SYSTEM.
  • Обычная установка (Install.bat) убирает запись для всех пользователей, чтобы окна не дублировались. Uninstall.bat удаляет и задачи, и эту запись.
Касперский (Kaspersky Endpoint Security) удалил SmartIndicator.ps1 по эвристике поведения: PDM:Trojan.Win32.…. Сработал и в C:\Tools, и в C:\Program Files\SmartIndicator , то есть сразу после установки для всех пользователей. Это ложное срабатывание, но не случайное.

Как исправить это?
 

Вложения

  • Like
Реакции: E100
Я бы посоветовал избавится от Windows как бесполезной прослойки, и забирать SMART у устройства напрямую, отправляя ему низкоуровневые контрольные коды. Это к примеру умеет делать smartctl из состава smartmontools, консольная утилита с исходным кодом. Релизный бинарь без зависимостей. Описание.

Вот накидал пример ps1 через ChatGPT. Права администратора не требуются.
% Health для SSD/NVME получает из специального параметра, а для HDD вычисляет из совокупности параметров через весы.
 

Вложения

  • Like
Реакции: E100
Идея разумная, но в этом сообщении есть неточности.
Что верно
  • smartctl отлично читает SMART и поддерживает множество USB-мостов, RAID и NVMe. Как справочный источник он полезен.
  • Это не противоречит нашему скрипту. Мы уже шлём ATA- и NVMe-команды напрямую (SAT и NVMe IOCTL), как и smartctl. Без драйвера Windows не обойтись ни ему, ни нам.
Что неверно
  • «Права администратора не требуются». На Windows smartctl открывает \\.\PhysicalDriveN, и без прав администратора почти всегда получит «Permission denied». Скрипт из архива тоже придётся запускать от администратора.
  • Совместимость. В Get-SmartData.ps1 используется ConvertFrom-Json, -in и $PSScriptRoot. Всё это есть только в PowerShell 3.0 и новее. В Windows 7 с PowerShell 2.0 скрипт не заработает. Бинарник в архиве 64-битный (PE32+ x86-64), на 32-битной Windows он не запустится.
  • Оценка «% здоровья» для HDD. Она грубая. Для вашего Seagate она даст 0%: 88 переназначенных секторов умножаются на 2 и обрезаются до 100, а 8 неисправимых добавляют ещё 40. Итого 140 штрафа, 0% здоровья. Диск при этом работает, и его состояние не меняется. Мы выдаём предупреждение и следим за ростом счётчиков.
  • Атрибуты износа SSD. Скрипт не знает часть названий, например Wear_Leveling_Count, поэтому такие диски попадут в схему штрафов для HDD.
  • Чего вообще нет. Нет окна, истории, сравнения с прошлой проверкой, расписания, уведомлений и таймаутов на зависшие диски.
Что можно взять. Подключить smartctl.exe как необязательный резервный источник: если он лежит рядом со скриптом, а наши источники диск не прочитали (экзотический USB-бокс, RAID), запрашивать данные у него. Для PowerShell 2.0 разбирать вывод придётся обычным текстом, без JSON. Включать smartctl в архив я бы не стал, это отдельная лицензия GPL. Пусть пользователь кладёт его сам, да и антивирус на неподписанный exe может ругаться.


Хотите, добавлю такой резервный режим? Для этого лучше иметь пример диска, который наш скрипт не читает. Пока такого у вас не было.
 
  • Like
Реакции: E100
@Guest вы хотя бы немного редактировали ответы от ИИ, ей богу.

Чего вообще нет. Нет окна, истории, сравнения с прошлой проверкой, расписания, уведомлений и таймаутов на зависшие диски.
Я и не утверждал, что мой скрипт как-то конкурирует с вашим в плане финти-флюшек.
Это не противоречит нашему скрипту. Мы уже шлём ATA- и NVMe-команды напрямую (SAT и NVMe IOCTL), как и smartctl.
Не уследил. Я ссылался на вашу первую версию (где было только WMI), и не ожидал что за несколько дней объем кода увеличится аж на пару тысяч строк.
Мой посыл - отправлять контрольные коды вместо WMI, но раз у вас это реализовано, то вопрос снят.
Разве что... почитал код... и я бы поостерегся запускать на своем устройстве код с IOCTL со сложными специфическими структурами, созданными ИИ-кой, с магическими константами без имён, и Write-кодом, вроде включения функции SMART. Но сверившись с кодом smartmontools (той же ИИ-шкой), вроде без ошибок (ключевое слово "вроде").
Оценка «% здоровья» для HDD. Она грубая. Для вашего Seagate она даст 0%: 88 переназначенных секторов умножаются на 2 и обрезаются до 100, а 8 неисправимых добавляют ещё 40. Итого 140 штрафа, 0% здоровья. Диск при этом работает, и его состояние не меняется. Мы выдаём предупреждение и следим за ростом счётчиков.
Не буду спорить, это вообще не было целью моего сообщения, а только как доп. нагрузка, которую по быстрому накидал ИИ, можно смело выбросить.

«Права администратора не требуются». На Windows smartctl открывает \\.\PhysicalDriveN, и без прав администратора почти всегда получит «Permission denied». Скрипт из архива тоже придётся запускать от администратора.
Это не правда. Запустите smartmontools и убедитесь сами, а не спрашивайте ИИ.
Там используется 2 варианта CreateFile, как и в вашем коде:
Код:
if (h == new IntPtr(-1)) h = CreateFile("\\\\.\\PhysicalDrive" + n, 0, 3, IntPtr.Zero, 3, 0, IntPtr.Zero);
Второй аргумент dwDesiredAccess, когда равен 0, Windows не будет проверять права доступа, предоставив возможность запрашивать свойства и отправлять некоторые IOCTL.

Вот цитата из исходника:
C++:
if (!(*options && !options[strspn(options, "fp")]) && !query_device) {
    // Open with admin rights
    m_admin = true;
    h = CreateFileA(devpath, GENERIC_READ|GENERIC_WRITE,
      FILE_SHARE_READ|FILE_SHARE_WRITE,
      NULL, OPEN_EXISTING, 0, 0);
  }
  if (h == INVALID_HANDLE_VALUE) {
    // Open without admin rights
    m_admin = false;
    h = CreateFileA(devpath, 0,
      FILE_SHARE_READ|FILE_SHARE_WRITE,
      NULL, OPEN_EXISTING, 0, 0);
  }
Если сравнить с вашим вариантом, то при чтении описания диска, вы пытаетесь во второй раз открыть устройство без прав админа, а при чтения smart только с правами админа. Ну и плюс множественное открытие дескриптора устройства в нескольких функциях (вместо одного раза на чтение всей информации) может давать дополнительную просадку по скорости.

Без прав админа умеет работать отправка кода IOCTL_STORAGE_PREDICT_FAILURE.
Но это работает не для любых устройств, поэтому запрашивать права админа все равно нужно.

Хотите, добавлю такой резервный режим? Для этого лучше иметь пример диска, который наш скрипт не читает. Пока такого у вас не было.
Это вам решать, но утилита 5-я версия которой написана ещё в 2002 году без ИИ знает явно на много больше устройств, с учетом мешанины этих кодов, и специфических структур.
 

Похожие темы

Назад
Сверху Снизу