Тема: OFF: VBS Не убиваемая windows 10. Делюсь опытом.
Все действия производились на
Выпуск Windows 10 IoT Корпоративная LTSC
Версия 21H2
Сборка ОС 19044.3803
Взаимодействие Windows Feature Experience Pack 1000.19053.1000.0
2-а года назад вздумал создать ОС которая будет сама делать себя backup, от пакостей вирусов. Для решение данного вопроса, применил vhdx диски. Сделал их загружаемые. Для этого пришлось применить GPT (UEFI) тип дисков.
Потом нашёл как делать загрузочные распределённые vhdx диски. Получилось система у которой можно за 2 минуты создать "песочницу" (чистую ОС), наподобие как в VmWare с "золотой закладкой". Загрузился в такую "песочницу" поигрался с программы, выкл. комп, Загрузился в закладку "меню", удалил эту "песочницу", или сделал новую ..и т.д. Короче, как в игре. Заподозрил что можешь схватить вирус, "записался в уровне". Поигрался, понял, что есть вирус/нет_вируса, и стёр этот "уровень". Загрузился в ранее записанный, и опять продолжаешь работать.
На всё про всё 2-е минуты и новая закладка с "песочницей", готова.
При этом, хочу особо подчеркнуть, что сама ОС выступает как виртуальная машина, без сторонних софтов. Поэтому работает она по скорости на все 100% , без замедления, не то что с софтом VmWare.
Т.к. в такой системе рождаются много vhdx дисков с разными ОС и прогами, то применил загрузочное меню
с free софтом "EasyBCD". Для этого создал отдельный vhdx с этим софтом, со своей меню для загрузки в эту закладку с ОС . Она служит мне для редактирования/создания vhdx разностных дисков + меню загрузки для них.
Затем, т.к. эти vhdx диски имеют тип UEFI, то применил их в SSD, с переходником SATA3/USB3.
Т.о. мог менять как перчатки не только ОС-ы но и SSD, с разными установками.
Но всё равно случались беды. Несколько раз слетали прошивки с ssd. Приходилось заного перепрошивать, + туда переносить vhdx ранее за backup-ые диски. И опять создавать загрузчик... Короче морока, хотя она уже не такая была как до того, как связался я с vhdx дисками. Уже не надо было заного делать разворот ОС, настройка её и установка туда прог и т.д..
..
Все buck-ы vhdx диски расположены были у меня на hdd 1трб. При этом имею 2-е машины с разными мамами Gigabyte и MSI. Т.е. vhdx диски разные для 2-ух машин. Эти HDD были мной куплены ещё в 2012 годах. При этом для того что бы была надёжная копия на hdd применял софт от микрософт которая делала репликацию Hdd копию на 2-ой такой же HDD. При этом один HDD был в системе на SATA, а второй на "полке", как копия. Т.о. я имел их 4-е шт, для 2-ух машин. И вот один из других дисков на которых была не backup система, сбойнул (застучал). Понял что "время пришло" и надо что-то делать.
Если переходить на ssd 1трб, то это просто огромные для меня деньги (шутка что ли >6000р на алике и то перед Новым Годом, а их нужно 4-е шт)
И вот решил создать уже защищённую ОС по железу (SSD/HDD) без такого количества hdd. Опробовал софтовую RAID в вине. Понял что она как раз то что надо. Но ОС нужна с raid1 на загрузке. Поэтому решил купить контролёр RAID на чипе ASM1061R (на авито за 500р за штуку - 2-е штуки брал). Возился с ним 2-ое суток что бы понять как там и что. Если кому нужны подробности в насторойках - пишите. Там не так всё просто оказалось. Но зато за копейки. Проверил, ОС грузиться и скорость не изменилась. Всё как и было с переходником SATA3/USB3. Правда эти 2-а SSD стояли уже в sata на контролёре PCI. А не были внешними. Однако с помощью F11-MSI/F12-Gigabyte мог грузиться и с внешнего SSD по USB3.
Проверил сбой. Оключал один из SSD (вытаскивал SATA или питание SATA провода). И смотрел как утилита показывала как засекала сбой и предупреждала. При этом вся ОС и загрузка не страдали. Потом цеплял "плохой" SSD и при очередной загругке ОС плата контролёра сама восстанавливала сбойный SSD. Всё автоматом.
ремарка.
Загрузчик на этих SSD имеет тип MBR. Но при развороте ОС диск "C" имеет тип GPT (UEFI). Вот такие хитрые нюансы имею. Проверил с шифровальщиком BitLocker - всё пашет как надо. Но не стал с ним заморачиваться. Но в "тетрадочке" пометил этот факт.
Теперь остался HDD 1трб на RAID посадить. Для этого подкупил ещё один контролёр PCI на ASM1061 (без "R") - расширитель по SATA на 2-а порта. На них посадил эти 2-а HDD. Но RAID1 сделал в самой винде 10. НОНОНОНО. Не в "Управлении дисками", а в "Дисковое пространство" из "Панели управления". Оказалосб ЭТО 2-е разные утилиты по созданию разных RAID. И имеют из-за этого разные свойства по этим RAID. Например.
Если делать RAID1 в "Управлении дисками", то при сбое одного из hdd нужно соблюсти при замене очерёдность по портам sata этих дисков. При этом если эти диски установить во вторую мою машину с другой мамой, то эти диски не будут видны. Короче опять нужно выходить на наличие 4-ёх дисков по 1 трб. А вот если применить "Дисковое пространство" из "Панели управления", то "меняй чего угодно - не хочу". И очерёдность по sata портам, и во вторую маму впихивай их, и в разные закладки vhdx , пофигу - везде видяться и пашут как надо- ВЕЩЬ!!! При этом даже видяться в загрузочной дискете WinPe. Когда как RAID сделанный в "Управлении дисками" такого широкого жеста не позволяет делать.
Докупил на алике по 700р -4е штуки SSD по 120гиг, и вставил их в остальные 4-е порта SATA на маме.
В "Дисковое пространство" из "Панели управления" установил их как RAID5. Получилось, что софтовые я имею 2-а RAID. RAID1 и RAID5.
И вот тут возникла проблема с монитором этих RAID. На PCI на ASM1061R имелся свой соф. Загружается с ОС и следит сам за RAID1 ОС. А вот с софтовым туго. С RAID "Управлении дисками", просто. Загрузил diskpart с командой "lis vol" и читай где нет параметра "Healthy". А вот с "Дисковое пространство" из "Панели управления" diskpart не понимает. Есть 3-и варианта мониторить RAID в "Дисковое пространство".
1- с помощью Powershell. Запуск доступа к дискам только из под Админа.
# FriendlyName это имя заданное в пространстве дисков как общее пространство включая физические и виртуальные диски
Write-Output "-----------------------------------"
Get-StoragePool -IsPrimordial $False | Select-Object FriendlyName, HealthStatus
Write-Output "-----------------------------------"
Get-VirtualDisk | Select-Object FriendlyName, HealthStatus
Write-Output "-----------------------------------"
# Следующая команда выдаёт на каком порту SATA находиться тот или иной диск в RAID5 для того чтобы можно было его извлекать.
Get-PhysicalDisk | Select-Object FriendlyName, SerialNumber
Write-Output "-----------------------------------"
2- с помощью команлной строки и встроенной в вин10 утилиты "wmic.exe".Запуск доступа к дискам только из под Админа.
wmic /namespace:\\root\microsoft\windows\storage path msft_disk get FriendlyName,HealthStatus
rem -------------------------
rem BusType=11 --> Это тип порта SATA.
rem SerialNumber --> Это серийник который обозначается автоматом в графической утилите "Дисковое
rem пространство"
rem DeviceId --> Это порядковый номер по порядку портов SATA в маме и PCI контрол1рах.
rem - Это нужно для того что бы индентифицировать серийник с номером SATA в RAID5.
wmic /namespace:\\ROOT\Microsoft\Windows\Storage\Providers_v2 path SPACES_PhysicalDisk where BusType=11 get FriendlyName,SerialNumber,DeviceId
3- с помощью VBS скрипта. Для меня лучше всего подходит.
Потому что 1-вставляется в автозагрузку в taskschd.msc (Планировщик заданий). 2- От туда же он перезапускается по времени каждые 5 минут. 3-сразу запускается от админа. 4- выскакивает при неоходимости диалоговое окно (при первом заходе в винду) со статусом дисков. А если не "Healthy", то сразу выскакивает графическая утилита "Дисковое пространство", в котором можно уже "чинить" диски.
'taskschd.msc ------ приложение Планировщика задачь
Option Explicit
Dim Run0orNext
Dim wmiObject, objShell
Dim sleep_
'###########################################################
'###########################################################
' Класс ожидания
'###########################################################
'###########################################################
Class sleep1
private objwsh
sub tm(tim)
Set objwsh = CreateObject("WScript.Shell")
objwsh.Run "Timeout /T " & tim & " /nobreak" ,0 ,true
Set objwsh = Nothing
end sub
End Class
' инициализация класса пауза
set sleep_=new sleep1 '----класс ожидания паузы
'###########################################################
'###########################################################
' Класс создание ГЛОБАЛЬНОЙ ВЕЧНОЙ переменной и внесение туда значения
'###########################################################
'###########################################################
Class GlobalObject
Private ShellWindow_, ShellWindows_
Sub OpenContainer(name)
Dim ShellWindows_
Set ShellWindows_ = CreateObject("Shell.Application").Windows
For Each ShellWindow_ in ShellWindows_
if Instr(1,ShellWindow_.StatusText,name) = 1 Then Exit Sub
Next
'#################### Переменная в "проводник" #######################
sleep_.tm(1)
Set ShellWindow_ = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
'###########################################################
ShellWindow_.StatusText = name
End Sub
Property Let Value(name, newValue)
ShellWindow_.PutProperty name, newValue
End Property
Public Default Property Get Value(name)
On Error Resume Next
if IsObject(ShellWindow_.GetProperty(name)) Then
Set Value = ShellWindow_.GetProperty(name)
Else
Value = ShellWindow_.GetProperty(name)
End if
End Property
End Class
Dim GlobalObj
Set GlobalObj = New GlobalObject
GlobalObj.OpenContainer "storage"
'###########################################################
'###########################################################
' Проверяется , на начальный запуск скрипта
' Если первый раз заускается, то в переменную выставляется TRUE
' Это условия запуска диалогового окна о статусе "Дискового пространства"
'###########################################################
'###########################################################
'###########################################################
If GlobalObj("Run_0_or_next") = Empty then
Run0orNext=TRUE
GlobalObj("Run_0_or_next") =Run0orNext
elseIf GlobalObj("Run_0_or_next") = TRUE then
Run0orNext=FALSE
end if
'###########################################################
'###########################################################
' Процедура Получения Статуса дисков и их имен
'###########################################################
'###########################################################
Call Main
'###########################################################
'###########################################################
Sub Main()
Dim oWMI, WQL, Instances, Instance
Dim FriendlyName_():ReDim Preserve FriendlyName_(0,0)
Dim HealthStatus_: HealthStatus_=100
Set objShell=CreateObject("WScript.Shell")
'###########################################################
'###########################################################
' Этот пустой запуск обязательно должен быть.
' Иначе путь WMI "SPACES_VirtualDisk" не булет срабатывать.
Set oWMI = GetObject("WINMGMTS:\\.\ROOT\Microsoft\Windows\Storage")
WQL = "SELECT * FROM MSFT_StoragePool where IsPrimordial=false"
'############# IsPrimordial=false -- FALSE это выбираются только "Дисковые пространства"
Set Instances = oWMI.ExecQuery(WQL)
For Each Instance In Instances
sleep_.tm(1)
Next
Set Instances =Nothing
Set oWMI =Nothing
'###########################################################
'###########################################################
Set oWMI = GetObject("WINMGMTS:\\.\ROOT\Microsoft\Windows\Storage\Providers_v2")
WQL = "Select * from SPACES_VirtualDisk"
Set Instances = oWMI.ExecQuery(WQL)
sleep_.tm(1)
For Each Instance In Instances
'###########################################################
'###########################################################
' Получение всех имён всех дисков RAID
'###########################################################
'###########################################################
if FriendlyName_(0,0)="" then
FriendlyName_(0,0)=Instance.FriendlyName
else
ReDim Preserve FriendlyName_(0,Ubound(FriendlyName_)+1)
FriendlyName_(0,Ubound(FriendlyName_)+1)=Instance.FriendlyName
end if
'###########################################################
'###########################################################
' Проверка состояние RAID Дисков
'###########################################################
HealthStatus_= Instance.HealthStatus
'###########################################################
'###########################################################
' расшифровка кодов ответа "HealthStatus" о состоянии RAID
' ['0', '1', '2', '5']
' ['Healthy', 'Warning', 'Unhealthy', 'Unknown']
'###########################################################
'###########################################################
' Если "HealthStatus" не равно состоянию 'Healthy' то открывается
' графическая утилита редактирования "Дискового пространства"
'###########################################################
'###########################################################
If HealthStatus_<>0 then
objShell.run ("control /name Microsoft.StorageSpaces")
exit sub
end if
Next
'###########################################################
'###########################################################
' При первом запуске крмпьютера после проверки Дисков
' Если всё "ОК" открывается информационное окно с перечислением дисков
' О том что все диски находяться в отличном состоянии
'###########################################################
'###########################################################
if Run0orNext=TRUE then
Dim a,index, x:x=0
for each index in FriendlyName_
a= a & " " & FriendlyName_(0, x) & Vbcrlf
x=x+1
next
a= " Диски " & Vbcrlf & Vbcrlf & a & Vbcrlf & " не требуют вмешательства"
objShell.Popup a, 30, "Сосотояния Дискового пространства",48
end if
'###########################################################
'###########################################################
Set Instances = nothing
Set oWMI = nothing
Set objShell= nothing
end sub
'===========================
'===========================
..
Оссобености с RAID5. Долго проверял по сбоям. И выяснил следующее.
RAID5 при сбое выступает как контролёр SSD (например такой как SM2259XT2) который при сбое встает в режим "только чтение". Т.е. срочно куда либо копируй всё от туда и по новой создавая этот RAID5. Т.е. он позволяет при сбое сохранить данные НО НЕ ВОССТАНАВЛИВАЕТ сам RAID5.
При сбое RAID1, он сам восстанавливает сам RAID1 и данные на нём, но софтово.
Всё это проверял выдёргиванием проводов из HDD/SSD.
Теперь осталось сделать салазки для 4-ёх программных RAID5 дисков и для 2-ух дисков RAID1, что бы их можно было вставлять и пользоваться ими во второй машине с другой мамой.
В коде применил код который ранее тут на форуме появился для отслеживания самого первого запуска скрипта при старте винды. Правда применил "проводник"
https://forum.script-coding.com/viewtop … 73&p=3
Т.о. получил возможность сбрасывать глобальную переменную в "проводнике", методом "перезапуска" его в "диспетчер задач". Т.е. иметация первого захода в винду.
..
Подгрузил сюда утилиту для отслеживания портов SATA на которых сидят 4-е SSD в RAID5. Графическая утилита "Дисковое пространство" не показывает какой из дисков сидит на каком порту SATA в маме. Запустил утилиту, посмотрел какой на каком, и переименовал их в "Дисковое пространство", с указанием номера SATA порта.


