681 lines
13 KiB
Markdown
681 lines
13 KiB
Markdown
# 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 | 1500 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
|
||
```
|