diff --git a/Resize-OSPartition/README.md b/Resize-OSPartition/README.md new file mode 100644 index 0000000..b554d0b --- /dev/null +++ b/Resize-OSPartition/README.md @@ -0,0 +1,680 @@ +# 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 +```