Files
WindowsServer/Resize-OSPartition/README.md
T

681 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 | 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
```