# Resize-OSpartition.ps1 ## Přehled | Položka | Hodnota | |---|---| | Skript | `Resize-OSpartition.ps1` | | Verze | `2.1.0` | | Autor | F. Š. | | PowerShell | 5.1+ | | Podporované systémy | Windows 10/11, Windows Server 2019–2025 | | Režim | Interaktivní / `-AuditOnly` | | Výchozí velikost Recovery | 2000 MB | | Výchozí buffer na konci disku | 1 MB | | Výchozí log | `C:\Temp` | ## 1. Účel `Resize-OSpartition.ps1` slouží k rekonstrukci Windows Recovery Environment (WinRE) Recovery partition a případnému rozšíření systémového oddílu `C:`. Skript: 1. detekuje systémový disk a oddíl `C:`, 2. zjistí aktuální layout disku, 3. ověří stav WinRE pomocí `reagentc.exe`, 4. identifikuje existující Recovery partition, 5. zkontroluje BitLocker a dostupné místo, 6. před destruktivní operací vyžádá potvrzení, 7. deaktivuje WinRE, 8. odstraní původní Recovery partition, pokud existuje, 9. vytvoří novou Recovery partition na konci disku, 10. podle volby uživatele rozšíří `C:` do dostupného prostoru, 11. znovu aktivuje WinRE, 12. obnoví BitLocker ochranu, 13. provede závěrečnou validaci. Skript nepředpokládá konkrétní číslo disku ani partition. Systémový disk a Recovery partition jsou určovány podle aktuálního stavu systému. ## 2. Cílový layout ```text ┌──────────────────────────────────────┐ │ │ │ C: │ │ Windows / OS / Data │ │ │ ├──────────────────────────────────────┤ │ Recovery partition │ │ ~2000 MB │ ├──────────────────────────────────────┤ │ ~1 MB buffer │ └──────────────────────────────────────┘ KONEC DISKU ``` Hlavním principem verze 2.1.0 je vytvoření Recovery partition na explicitně vypočteném offsetu u konce disku. ```text Offset = Disk.Size - RecoverySize - DiskEndBuffer ``` Po zarovnání na 1 MB je offset předán do: ```powershell New-Partition -Offset $alignedOffset ``` Tím se zabrání vytvoření Recovery partition bezprostředně za `C:` a následnému ponechání volného prostoru až za Recovery partition. ## 3. Parametry ### `-AuditOnly` Provede pouze detekci a kontrolu. Nemění partition layout, WinRE ani BitLocker. ```powershell .\Resize-OSpartition.ps1 -AuditOnly ``` Audit zobrazí zejména: - systémový disk, - partition layout, - stav WinRE, - nalezenou Recovery partition, - BitLocker stav, - dostupné místo, - plánované změny. ### `-RecoverySizeMB` Velikost nové Recovery partition. Výchozí hodnota je `2000 MB`. ```powershell .\Resize-OSpartition.ps1 -RecoverySizeMB 2500 ``` Skript kontroluje velikost `C:\Windows\System32\Recovery\Winre.wim` a porovnává ji s požadovanou velikostí Recovery partition. Doporučená velikost se počítá jako: ```text Winre.wim + 400 MB + 100 MB ``` Pokud je požadovaná velikost menší než doporučená, skript zobrazí varování a vyžádá potvrzení. ### `-DiskEndBufferMB` Velikost nealokovaného prostoru, který zůstane na úplném konci disku. Výchozí hodnota je `1 MB`. ```powershell .\Resize-OSpartition.ps1 -DiskEndBufferMB 1 ``` ### `-LogPath` Adresář pro logy. Výchozí hodnota: ```text C:\Temp ``` Příklad: ```powershell .\Resize-OSpartition.ps1 -LogPath "D:\Logs" ``` Skript vytváří aplikační log a PowerShell transcript. ### `-SkipBanner` Potlačí úvodní banner. Vhodné pro automatizované nebo vzdálené spuštění. ```powershell .\Resize-OSpartition.ps1 -SkipBanner ``` ## 4. Požadavky Skript musí být spuštěn s administrátorskými právy. Používá zejména: - Storage PowerShell module, - BitLocker PowerShell cmdlets, - `reagentc.exe`, - `diskpart.exe`. Kontrolované cmdlety zahrnují: ```powershell Get-Disk Get-Partition Get-Volume Get-PartitionSupportedSize Resize-Partition New-Partition Format-Volume ``` ## 5. Průběh skriptu ```text Discovery ↓ Validation ↓ User Confirmation ↓ Disable WinRE ↓ Delete old Recovery ↓ Create Recovery at disk end ↓ Expand C: (optional) ↓ Enable WinRE ↓ Resume BitLocker ↓ Final Validation ``` ## 6. Detekce systému ### Systémový disk Skript nejprve najde partition s `C:` a z ní určí číslo systémového disku: ```powershell Get-Partition -DriveLetter C Get-Disk -Number $cPartition.DiskNumber ``` Není tedy pevně nastavena hodnota `Disk 0`. ### Partition layout Partition jsou načteny pomocí: ```powershell Get-Partition -DiskNumber $DiskNumber ``` a seřazeny podle offsetu. ### WinRE Stav WinRE se zjišťuje pomocí: ```powershell reagentc.exe /info ``` Skript používá výstup pro určení: - stavu WinRE, - umístění `Winre.wim`, - disku a partition, na které je WinRE umístěno. ## 7. Detekce Recovery partition U GPT se kontroluje Recovery partition GUID: ```text de94bba4-06d1-4d40-a16a-bfd50179d6ac ``` U MBR se kontroluje typ: ```text 27 ``` Současně se zohledňuje: - umístění partition, - absence drive letter, - vazba na `reagentc /info`, - aktuální partition layout. Pokud je nalezeno více nejednoznačných kandidátů, skript automaticky žádnou partition neodstraní. Pokud Recovery partition neexistuje, skript může vytvořit novou bez předchozího mazání. ## 8. Kontrola prostoru Skript ověřuje dostupný prostor pro novou Recovery partition. Musí platit: ```text Available >= RecoverySizeMB ``` Pokud prostor nestačí, skript skončí před destruktivní operací. ## 9. BitLocker Pokud je na `C:` aktivní BitLocker ochrana, skript ji před změnou partition dočasně pozastaví: ```powershell Suspend-BitLocker -MountPoint C: -RebootCount 1 ``` Po dokončení operace se ochrana obnoví. Pozastavení BitLockeru není dešifrování disku. Skript obsahuje také podpůrnou logiku pro případy, kdy je nutné BitLocker skutečně dešifrovat kvůli problému s `reagentc`. Tato cesta je výrazně rizikovější a během dešifrování je systémový disk dočasně nešifrovaný. ## 10. Potvrzení před změnou Před destruktivní operací skript zobrazuje informace o Recovery partition: - Disk Number, - Partition Number, - Size, - Offset, - Type, - GPT Type, - Drive Letter, - pozice na disku. Uživatel musí také potvrdit: - existenci aktuální zálohy, - absenci VMware Snapshot / Hyper-V Checkpointu. Před samotným odstraněním se partition table znovu načte. Mazání vyžaduje přesný vstup: ```text DELETE ``` Jakýkoliv jiný vstup operaci ukončí. ## 11. Rekonstrukce Recovery partition Před změnou partition layoutu se WinRE deaktivuje: ```powershell reagentc.exe /disable ``` Pokud existuje stará Recovery partition, je odstraněna pomocí `diskpart`. Po odstranění se ověří, že partition skutečně zmizela. ### Vytvoření nové partition Offset se vypočítá: ```text rawOffset = Disk.Size - RecoverySize - DiskEndBuffer ``` Následně se zarovná na 1 MB: ```text alignedOffset = floor(rawOffset / 1 MB) × 1 MB ``` Nová Recovery partition je vytvořena na tomto offsetu. Po vytvoření skript ověří její skutečnou pozici. Pokud není umístěna v očekávané oblasti na konci disku, operace se považuje za chybnou. ## 12. Formátování a označení Recovery Nová partition je: - formátována jako NTFS, - označena `Recovery`, - ponechána bez drive letter, - nastavena jako Windows Recovery partition. ### GPT ```text de94bba4-06d1-4d40-a16a-bfd50179d6ac ``` Atribut: ```text 0x8000000000000001 ``` ### MBR ```text 27 ``` ## 13. Rozšíření C: Po vytvoření Recovery partition skript znovu změří prostor mezi `C:` a Recovery. Pokud je dostupný prostor, uživatel může zvolit rozšíření `C:`. Maximální podporovaná velikost se zjistí pomocí: ```powershell Get-PartitionSupportedSize ``` a následně se použije: ```powershell Resize-Partition ``` Rozšíření `C:` probíhá před `reagentc /enable`. Pokud uživatel rozšíření odmítne, prostor zůstane nealokovaný: ```text C: | FREE | Recovery | ``` ## 14. Aktivace WinRE Po dokončení partition operací: ```powershell reagentc.exe /enable ``` Následuje: ```powershell reagentc.exe /info ``` Skript ověřuje nejen stav: ```text Windows RE status: Enabled ``` ale také to, že WinRE location odpovídá nově vytvořené Recovery partition. Pokud `reagentc` hlásí `Enabled`, ale WinRE není umístěno na očekávané Recovery partition, je výsledek vyhodnocen jako problém. Při selhání `reagentc /enable` se kontroluje také: ```text C:\Windows\Logs\ReAgent\ReAgent.log ``` ## 15. Final Validation Na konci se kontroluje: ### Disk - Online - Healthy ### C: - existuje, - NTFS. ### Recovery - existuje, - nemá drive letter, - je poslední partition, - má správný typ. ### WinRE - je `Enabled`, - WinRE location odpovídá nové Recovery partition. ### BitLocker - ochrana byla po dokončení obnovena. Výsledek je označen jako: ```text SUCCESS ``` nebo: ```text FAIL ``` ## 16. Logování Významné operace jsou zapisovány pomocí `Write-Log`. Úrovně: | Level | Význam | |---|---| | `INFO` | Běžná informace | | `SUCCESS` | Úspěšné dokončení | | `WARNING` | Upozornění | | `ERROR` | Chyba | | `DEBUG` | Technický detail | Vedle aplikačního logu skript používá také: ```powershell Start-Transcript ``` Typické soubory: ```text C:\Temp\Resize-OSpartition-YYYYMMDD-HHMMSS-COMPUTERNAME.log C:\Temp\Resize-OSpartition-YYYYMMDD-HHMMSS-COMPUTERNAME.transcript.log ``` ## 17. Exit codes Úspěšný běh: ```text 0 ``` Chyba: ```text 1 ``` To umožňuje použití skriptu v RMM, deploymentu nebo jiném automatizačním systému. ## 18. Doporučený postup ### 1. Ověřit zálohu Před změnou ověřit dostupnost aktuální úspěšné zálohy. ### 2. Ověřit snapshot / checkpoint Na virtuálních serverech ověřit stav VMware Snapshot nebo Hyper-V Checkpointu. ### 3. Spustit audit ```powershell .\Resize-OSpartition.ps1 -AuditOnly ``` ### 4. Zkontrolovat výstup Ověřit: - systémový disk, - `C:`, - WinRE, - Recovery partition, - BitLocker, - dostupné místo, - plánovanou velikost Recovery. ### 5. Spustit ostrý běh ```powershell .\Resize-OSpartition.ps1 -RecoverySizeMB 2000 ``` ### 6. Potvrdit správnou Recovery partition Před mazáním zkontrolovat zobrazené údaje. ### 7. Potvrdit destruktivní operaci Zadat: ```text DELETE ``` ### 8. Volitelně rozšířit C: Pokud je k dispozici volný prostor, potvrdit rozšíření `C:`. ### 9. Ověřit výsledek Po dokončení zkontrolovat zejména: ```powershell reagentc /info Get-Disk Get-Partition Get-Volume Get-BitLockerVolume -MountPoint C: ``` ## 19. Doporučené spuštění Audit: ```powershell .\Resize-OSpartition.ps1 -AuditOnly ``` Standardní ostrý běh: ```powershell .\Resize-OSpartition.ps1 ` -RecoverySizeMB 2000 ` -DiskEndBufferMB 1 ` -LogPath "C:\Temp" ``` ## 20. Bezpečnostní mechanismy Skript obsahuje: - kontrolu administrátorských práv, - dynamickou detekci systémového disku, - dynamickou detekci Recovery partition, - kontrolu GPT/MBR typu, - kontrolu WinRE location, - kontrolu dostupného prostoru, - kontrolu velikosti `Winre.wim`, - potvrzení zálohy, - potvrzení snapshotu/checkpointu, - explicitní potvrzení `DELETE`, - opětovnou validaci těsně před mazáním, - kontrolu umístění nové Recovery partition, - final validation, - log a transcript. Skript však nemůže automaticky garantovat: - existenci a použitelnost zálohy, - konzistenci VMware Snapshotu nebo Hyper-V Checkpointu, - správnost externího backup systému, - escrow BitLocker recovery klíče mimo zařízení. ## 21. Troubleshooting Při problému zkontrolovat: ### Aplikační log ```text C:\Temp\Resize-OSpartition-*.log ``` ### Transcript ```text C:\Temp\Resize-OSpartition-*.transcript.log ``` ### WinRE ```powershell reagentc /info ``` ### ReAgent log ```text C:\Windows\Logs\ReAgent\ReAgent.log ``` ### Partition layout ```powershell Get-Disk Get-Partition Get-Volume ``` ### BitLocker ```powershell Get-BitLockerVolume -MountPoint C: ``` ## 22. Očekávaný výsledek Ideální layout: ```text Disk 0 │ ├── EFI System Partition ├── MSR ├── C: NTFS │ └── Windows └── Recovery NTFS └── \Recovery\WindowsRE ``` Recovery partition: ```text Drive Letter: None Position: Last partition WinRE: Enabled ``` U GPT: ```text GPT Type: de94bba4-06d1-4d40-a16a-bfd50179d6ac ```