Files
WindowsServer/Resize-OSPartition

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 20192025
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

┌──────────────────────────────────────┐
│                                      │
│                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