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:
- detekuje systémový disk a oddíl
C:, - zjistí aktuální layout disku,
- ověří stav WinRE pomocí
reagentc.exe, - identifikuje existující Recovery partition,
- zkontroluje BitLocker a dostupné místo,
- před destruktivní operací vyžádá potvrzení,
- deaktivuje WinRE,
- odstraní původní Recovery partition, pokud existuje,
- vytvoří novou Recovery partition na konci disku,
- podle volby uživatele rozšíří
C:do dostupného prostoru, - znovu aktivuje WinRE,
- obnoví BitLocker ochranu,
- 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
┌──────────────────────────────────────┐
│ │
│ 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.
Offset = Disk.Size - RecoverySize - DiskEndBuffer
Po zarovnání na 1 MB je offset předán do:
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.
.\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.
.\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:
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.
.\Resize-OSpartition.ps1 -DiskEndBufferMB 1
-LogPath
Adresář pro logy. Výchozí hodnota:
C:\Temp
Příklad:
.\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í.
.\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í:
Get-Disk
Get-Partition
Get-Volume
Get-PartitionSupportedSize
Resize-Partition
New-Partition
Format-Volume
5. Průběh skriptu
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:
Get-Partition -DriveLetter C
Get-Disk -Number $cPartition.DiskNumber
Není tedy pevně nastavena hodnota Disk 0.
Partition layout
Partition jsou načteny pomocí:
Get-Partition -DiskNumber $DiskNumber
a seřazeny podle offsetu.
WinRE
Stav WinRE se zjišťuje pomocí:
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:
de94bba4-06d1-4d40-a16a-bfd50179d6ac
U MBR se kontroluje typ:
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:
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í:
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:
DELETE
Jakýkoliv jiný vstup operaci ukončí.
11. Rekonstrukce Recovery partition
Před změnou partition layoutu se WinRE deaktivuje:
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á:
rawOffset =
Disk.Size
- RecoverySize
- DiskEndBuffer
Následně se zarovná na 1 MB:
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
de94bba4-06d1-4d40-a16a-bfd50179d6ac
Atribut:
0x8000000000000001
MBR
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í:
Get-PartitionSupportedSize
a následně se použije:
Resize-Partition
Rozšíření C: probíhá před reagentc /enable.
Pokud uživatel rozšíření odmítne, prostor zůstane nealokovaný:
C: | FREE | Recovery |
14. Aktivace WinRE
Po dokončení partition operací:
reagentc.exe /enable
Následuje:
reagentc.exe /info
Skript ověřuje nejen stav:
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é:
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:
SUCCESS
nebo:
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é:
Start-Transcript
Typické soubory:
C:\Temp\Resize-OSpartition-YYYYMMDD-HHMMSS-COMPUTERNAME.log
C:\Temp\Resize-OSpartition-YYYYMMDD-HHMMSS-COMPUTERNAME.transcript.log
17. Exit codes
Úspěšný běh:
0
Chyba:
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
.\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
.\Resize-OSpartition.ps1 -RecoverySizeMB 2000
6. Potvrdit správnou Recovery partition
Před mazáním zkontrolovat zobrazené údaje.
7. Potvrdit destruktivní operaci
Zadat:
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:
reagentc /info
Get-Disk
Get-Partition
Get-Volume
Get-BitLockerVolume -MountPoint C:
19. Doporučené spuštění
Audit:
.\Resize-OSpartition.ps1 -AuditOnly
Standardní ostrý běh:
.\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
C:\Temp\Resize-OSpartition-*.log
Transcript
C:\Temp\Resize-OSpartition-*.transcript.log
WinRE
reagentc /info
ReAgent log
C:\Windows\Logs\ReAgent\ReAgent.log
Partition layout
Get-Disk
Get-Partition
Get-Volume
BitLocker
Get-BitLockerVolume -MountPoint C:
22. Očekávaný výsledek
Ideální layout:
Disk 0
│
├── EFI System Partition
├── MSR
├── C: NTFS
│ └── Windows
└── Recovery NTFS
└── \Recovery\WindowsRE
Recovery partition:
Drive Letter: None
Position: Last partition
WinRE: Enabled
U GPT:
GPT Type:
de94bba4-06d1-4d40-a16a-bfd50179d6ac