Migrace konfigurace SMB sdílení mezi Windows servery pomocí PowerShellu

Skript Migrate-WindowsShares.ps1 exportuje vybrané vlastnosti běžných SMB sdílení ze zdrojového Windows Serveru, zkontroluje je na cílovém serveru a následně je může importovat.

📥 Stáhnout skript Migrate-WindowsShares.ps1

⚠️ Skript nekopíruje soubory. Data musíme přenést samostatně, například pomocí Storage Migration Service nebo robocopy. Skript je určen pro migraci mezi samostatnými souborovými servery; nenahrazuje kompletní migraci clusteru nebo Scale-Out File Serveru.


1. Co skript přenáší

Skript exportuje a importuje:

  • název a lokální cestu sdílení,
  • popis sdílení,
  • Access-Based Enumeration (FolderEnumerationMode),
  • režim offline ukládání (CachingMode),
  • limit současně připojených uživatelů,
  • požadavek na šifrování SMB (EncryptData),
  • všechna oprávnění na úrovni SMB sdílení,
  • volitelně NTFS bezpečnostní deskriptor kořenové složky ve formátu SDDL.

Skript nepřenáší:

  • soubory a adresáře,
  • rekurzivně NTFS oprávnění celého adresářového stromu,
  • DFS Namespaces a DFS Replication,
  • FSRM kvóty, klasifikaci ani file screeny,
  • shadow copies,
  • lokální uživatele a skupiny,
  • název, IP adresu ani identitu původního serveru,
  • SMB kompresi, leasing, QoS ani další pokročilé vlastnosti sdílení,
  • clusterové a SOFS vlastnosti sdílení.

📌 Přepínač -IdentityMapFile mění účty pouze v oprávněních SMB sdílení. SID uložené v NTFS SDDL nemění.


2. Příprava migrace

Na obou serverech potřebujeme:

  • podporovaný Windows Server s modulem SmbShare,
  • Windows PowerShell 5.1,
  • účet správce serveru,
  • připravené cílové disky a dostatečnou volnou kapacitu,
  • dostupné doménové nebo lokální účty, kterým jsou přidělena oprávnění,
  • otestovanou zálohu a servisní okno.

Před migrací na zdrojovém serveru zkontrolujeme běžná sdílení:

Get-SmbShare |
  Where-Object { -not $_.Special } |
  Select-Object Name, Path, Description, FolderEnumerationMode, CachingMode,
    ConcurrentUserLimit, EncryptData |
  Format-Table -AutoSize

Oprávnění konkrétního sdílení zobrazíme:

Get-SmbShareAccess -Name "Finance"

Stažení a kontrola skriptu

Na obou serverech spustíme PowerShell jako správce:

New-Item -ItemType Directory -Path C:\Migration -Force | Out-Null

Invoke-WebRequest `
  -Uri "https://navody.te23.cz/assets/scripts/Migrate-WindowsShares.ps1" `
  -OutFile C:\Migration\Migrate-WindowsShares.ps1

Get-FileHash C:\Migration\Migrate-WindowsShares.ps1 -Algorithm SHA256

Pro verzi publikovanou s tímto článkem očekáváme:

A63A3D945A66B645851E2D232E6A2A6BAC0F742521B1DD75AA1748AEC48D8506

Pokud otisk nesouhlasí, skript nespouštíme. Po kontrole obsahu a v souladu s pravidly organizace můžeme odstranit internetové označení souboru:

Get-Content C:\Migration\Migrate-WindowsShares.ps1
Get-AuthenticodeSignature C:\Migration\Migrate-WindowsShares.ps1
Unblock-File C:\Migration\Migrate-WindowsShares.ps1
Get-Help C:\Migration\Migrate-WindowsShares.ps1 -Full

📌 Publikovaný skript není podepsán pomocí Authenticode. Uvedený hash slouží ke kontrole konkrétní verze souboru, ale digitální podpis nenahrazuje.

📌 Exportní JSON obsahuje názvy serverů, cesty, účty a SID. Ukládáme jej a přenášíme stejně bezpečně jako ostatní administrátorská data.


3. Export na zdrojovém serveru

Varianta A: konfigurace SMB sdílení

Tato varianta exportuje vlastnosti sdílení a jejich SMB oprávnění:

Set-Location C:\Migration

.\Migrate-WindowsShares.ps1 `
  -Mode Export `
  -FilePath C:\Migration\shares.json

Varianta B: také NTFS ACL kořenových složek

.\Migrate-WindowsShares.ps1 `
  -Mode Export `
  -FilePath C:\Migration\shares-with-acl.json `
  -IncludeNtfsAcl

⚠️ -IncludeNtfsAcl uloží pouze SDDL kořenové složky každého sdílení. Oprávnění souborů a podadresářů musí zachovat nástroj použitý k přenosu dat.

NTFS ACL importujeme jen tehdy, pokud cílový server dokáže použité SID správně rozpoznat. Při změně domény nebo lokálních účtů nestačí -IdentityMapFile, protože SID uvnitř SDDL zůstanou beze změny.

📌 Nastavení vlastníka nebo auditní části SDDL může vyžadovat další systémová oprávnění. Selhání Set-Acl import zastaví, ale nevrátí automaticky změny provedené u předchozích sdílení.

Kontrola exportu

$Export = Get-Content C:\Migration\shares.json -Raw | ConvertFrom-Json

$Export |
  Select-Object schema_version, exported_at, source_computer,
    includes_ntfs_acl, includes_special_shares

$Export.shares |
  Select-Object name, path, folder_enumeration_mode, caching_mode,
    concurrent_user_limit, encrypt_data,
    @{Name = "permissions"; Expression = { $_.permissions.Count }} |
  Format-Table -AutoSize

📌 Přepínač -IncludeSpecialShares lze použít pouze pro inventurní export. Takový export nelze importovat a tento přepínač nelze kombinovat s -IncludeNtfsAcl. Sdílení jako ADMIN$, C$ nebo IPC$ necháme spravovat operační systém.


4. Přenos dat

Pro kompletní migraci souborového serveru je vhodné nejdříve posoudit Storage Migration Service, která přenáší data i širší konfiguraci serveru. Pokud data kopírujeme ručně, můžeme na cílovém serveru použít například:

robocopy "\\OLD-FS\D$\Data" "E:\Data" `
  /E /COPY:DATSOU /DCOPY:DAT /ZB /R:3 /W:5 /MT:16 /XJ `
  /TEE /LOG:C:\Migration\robocopy-initial.log

if ($LASTEXITCODE -ge 8) {
    throw "Robocopy skončilo chybou $LASTEXITCODE. Zkontrolujte protokol."
}

Použité parametry:

  • /E zkopíruje podadresáře včetně prázdných,
  • /COPY:DATSOU zachová data, atributy, časy, NTFS ACL, vlastníka a auditní informace,
  • /DCOPY:DAT zachová data, atributy a časy adresářů,
  • /ZB použije restartovatelný režim a při zamítnutí přístupu zkusí Backup mode,
  • /XJ zabrání následování junction pointů,
  • /MT:16 použije 16 paralelních vláken.

⚠️ Zachování vlastníka a auditních záznamů vyžaduje odpovídající oprávnění. Výsledek vždy ověříme na vzorku adresářů a souborů.

❌ Při prvním kopírování nepoužíváme bez rozmyslu /MIR. Tento přepínač může na cíli odstranit soubory, které na zdroji nejsou.

Před ostrým přepnutím zastavíme zápis uživatelů a aplikací na staré sdílení a spustíme poslední rozdílové kopírování.


5. Mapování cest a účtů

Pokud se mezi servery mění písmena disků nebo kořenové adresáře, vytvoříme na cílovém serveru soubor C:\Migration\path-map.json:

{
  "D:\\Data": "E:\\Data",
  "F:\\Aplikace": "D:\\Aplikace"
}

Skript použije nejdelší odpovídající prefix. Cestu D:\Data\Finance proto převede na E:\Data\Finance.

Pokud se mění názvy domén nebo lokálních účtů v SMB oprávněních, vytvoříme C:\Migration\identity-map.json:

{
  "OLD-FS\\local-share-admin": "NEW-FS\\local-share-admin",
  "OLD-DOMAIN\\Finance-RW": "NEW-DOMAIN\\Finance-RW"
}

Každý cílový účet musí před importem existovat a jít přeložit na SID. Ověříme jej například:

$Account = New-Object Security.Principal.NTAccount("NEW-DOMAIN\Finance-RW")
$Account.Translate([Security.Principal.SecurityIdentifier]).Value

⚠️ Při změně domény nebo lokálních účtů migrujeme NTFS oprávnění samostatně. Prosté použití původního SDDL může na cíli zachovat neplatné nebo nežádoucí SID.


6. Kontrola plánu na cílovém serveru

Nejdříve spustíme kontrolu bez změn:

Set-Location C:\Migration

.\Migrate-WindowsShares.ps1 `
  -Mode Validate `
  -FilePath C:\Migration\shares.json `
  -PathMapFile C:\Migration\path-map.json `
  -IdentityMapFile C:\Migration\identity-map.json

Pokud mají chybějící adresáře vzniknout až při importu, přidáme už při validaci:

-CreateMissingDirectories

Validace adresáře nevytvoří. Pouze je v plánu přestane označovat jako blokující problém.

Význam sloupce Action:

  • Create: sdílení lze vytvořit,
  • Update: existující sdílení lze aktualizovat,
  • Conflict: sdílení už existuje nebo ukazuje na jinou cestu,
  • Blocked: typicky chybí cílový adresář.

Skript také ověří, zda lze všechny účty z SMB oprávnění přeložit na SID. Dokud plán obsahuje Conflict nebo Blocked, import se neprovede.

Pokud chceme importovat NTFS SDDL, musíme použít -IncludeNtfsAcl při exportu, validaci i importu:

.\Migrate-WindowsShares.ps1 `
  -Mode Validate `
  -FilePath C:\Migration\shares-with-acl.json `
  -PathMapFile C:\Migration\path-map.json `
  -IncludeNtfsAcl

7. Zkušební a ostrý import

Záloha konfigurace cílového serveru

Pokud na cíli už nějaká sdílení existují, nejdříve jejich konfiguraci exportujeme:

.\Migrate-WindowsShares.ps1 `
  -Mode Export `
  -FilePath C:\Migration\target-before-import.json `
  -IncludeNtfsAcl

Simulace pomocí -WhatIf

.\Migrate-WindowsShares.ps1 `
  -Mode Import `
  -FilePath C:\Migration\shares.json `
  -PathMapFile C:\Migration\path-map.json `
  -IdentityMapFile C:\Migration\identity-map.json `
  -CreateMissingDirectories `
  -Apply `
  -WhatIf

Skript provádí vlastní kontrolu ShouldProcess, takže -WhatIf nezmění adresáře, sdílení ani jejich oprávnění.

Ostrý import

Po kontrole plánu spustíme stejný příkaz bez -WhatIf:

.\Migrate-WindowsShares.ps1 `
  -Mode Import `
  -FilePath C:\Migration\shares.json `
  -PathMapFile C:\Migration\path-map.json `
  -IdentityMapFile C:\Migration\identity-map.json `
  -CreateMissingDirectories `
  -Apply

Pokud chceme každé sdílení potvrdit samostatně, přidáme -Confirm.

Aktualizace existujících sdílení

Existující sdílení se bez přepínače -UpdateExisting nezmění. Pokud ukazuje na stejnou cílovou cestu, můžeme aktualizaci nejdříve simulovat:

.\Migrate-WindowsShares.ps1 `
  -Mode Import `
  -FilePath C:\Migration\shares.json `
  -PathMapFile C:\Migration\path-map.json `
  -UpdateExisting `
  -Apply `
  -WhatIf

⚠️ Aktualizace zcela nahradí SMB oprávnění existujícího sdílení oprávněními z exportu. Operace není transakční; při chybě může být část sdílení už upravena. Proto potřebujeme zálohu konfigurace, servisní okno a následnou kontrolu.

Sdílení se stejným názvem, ale jinou cestou, skript nikdy automaticky nepřesměruje. Takový konflikt musíme vyřešit ručně.


8. Kontrola po importu

U každého důležitého sdílení ověříme vlastnosti:

Get-SmbShare -Name "Finance" |
  Format-List Name, Path, Description, FolderEnumerationMode, CachingMode,
    ConcurrentUserLimit, EncryptData

Ověříme SMB oprávnění:

Get-SmbShareAccess -Name "Finance" |
  Sort-Object AccessControlType, AccountName |
  Format-Table -AutoSize

Pokud jsme importovali NTFS SDDL kořenové složky:

Get-Acl E:\Data\Finance |
  Format-List Owner, AccessToString, Sddl

Z klienta otestujeme dostupnost:

Test-Path "\\NEW-FS\Finance"

✅ Prakticky ověříme účet s oprávněním Read, Change i Full. Nestačí pouze zkontrolovat, že UNC cesta existuje.

Zkontrolujeme také:

  • zobrazení složek při zapnutém Access-Based Enumeration,
  • čtení, zápis, přejmenování a mazání podle přidělených práv,
  • přístup aplikací a služeb používajících UNC cestu,
  • offline ukládání a případný požadavek na šifrované SMB,
  • protokoly z posledního kopírování dat.

Původní server vypneme nebo zrušíme až po úspěšném funkčním testu a po uplynutí dohodnuté návratové lhůty.


9. Doporučené pořadí migrace

  1. Zkontrolujeme zdrojová sdílení, oprávnění a zálohy.
  2. Exportujeme konfiguraci a ručně projdeme JSON.
  3. Připravíme mapování cest a účtů.
  4. Přeneseme data nástrojem, který zachová požadovaná NTFS oprávnění.
  5. Na cílovém serveru spustíme -Mode Validate.
  6. Opravíme všechny položky Conflict a Blocked.
  7. Spustíme import s -Apply -WhatIf.
  8. V servisním okně zastavíme zápis na zdroj a dokončíme kopírování dat.
  9. Provedeme ostrý import s -Apply.
  10. Otestujeme SMB i NTFS oprávnění reálnými testovacími účty.
  11. Přesměrujeme klienty nebo DFS a sledujeme provoz.
  12. Zdroj ponecháme dostupný pro návrat po předem určenou dobu.

Shrnutí

  • ✅ Skript přenese vybrané vlastnosti běžných SMB sdílení a jejich share-level oprávnění.
  • ✅ Bez -Apply pouze připraví a zkontroluje plán.
  • -WhatIf použijeme před každým ostrým importem.
  • ✅ Data a rekurzivní NTFS ACL přeneseme samostatným nástrojem.
  • ✅ Existující sdílení aktualizujeme pouze po záloze a s vědomím, že jejich SMB oprávnění budou nahrazena.
  • ❌ Systémová, clusterová, DFS a FSRM nastavení tímto skriptem nemigrujeme.

Zdroje