Než se pustíme do prohlídky dvou nových modulů, povíme si něco o možnosti takzvaného module autoloading. Pokud jste v PowerShell v2 potřebovali pracovat s cmdletem patřícím do určitého modulu, museli jste nejdříve tento modul načíst. V PowerShellu v3 již toto není potřeba. Stačí poprvé cmdlet použít a modul se automaticky importuje, jako kdybychom použili Import-Module. Podívejte se na následující obrázek:
Při startu PowerShellu se načetly pouze dva základní moduly. Poté jsem rovnou zavolal cmdlet Get-SmbShare. Ihned poté je vidět ve výpisu opětovného volání Get-Module, že modul SmbShare se načetl automaticky.
Automatické načítání funguje i při použití tabulátoru (doplňování jmen cmdletů), což je na jednu stranu výhoda při hledání vhodného příkazu. Na druhou stranu se tím zvětšuje možnost dostupných cmdletů při automatickém doplňování. Pokud by se vám toto automatické načítání nelíbilo, lze jej vypnout pomocí proměnné $PSModuleAutoLoadingPreference.
Dlouhou dobu jsme čekali na modul pro správu sdílených složek. Existovaly moduly vytvořené různými lidmi, ale oficiální podporu jsme neměli. S PowerShellem v3 přichází modul SmbShare, který v sobě obsahuje množství (přesně 28) užitečných cmdletů. Jelikož si myslím, že si zaslouží pozornost, budeme se dnes věnovat pouze tomuto modulu.
Nejdříve si ukážeme dostupné funkce (modul obsahuje opravdu funkce, nikoli cmdlety).
PS C:\> Get-Command -Module smbshare
CommandType Name ModuleName ----------- ---- ---------- Function Block-SmbShareAccess SmbShare Function Close-SmbOpenFile SmbShare Function Close-SmbSession SmbShare Function Get-SmbClientConfiguration SmbShare Function Get-SmbClientNetworkInterface SmbShare Function Get-SmbConnection SmbShare Function Get-SmbMapping SmbShare Function Get-SmbMultichannelConnection SmbShare Function Get-SmbMultichannelConstraint SmbShare Function Get-SmbOpenFile SmbShare Function Get-SmbServerConfiguration SmbShare Function Get-SmbServerNetworkInterface SmbShare Function Get-SmbSession SmbShare Function Get-SmbShare SmbShare Function Get-SmbShareAccess SmbShare Function Grant-SmbShareAccess SmbShare Function New-SmbMapping SmbShare Function New-SmbMultichannelConstraint SmbShare Function New-SmbShare SmbShare Function Remove-SmbMapping SmbShare Function Remove-SmbMultichannelConstraint SmbShare Function Remove-SmbShare SmbShare Function Revoke-SmbShareAccess SmbShare Function Set-SmbClientConfiguration SmbShare Function Set-SmbServerConfiguration SmbShare Function Set-SmbShare SmbShare Function Unblock-SmbShareAccess SmbShare Function Update-SmbMultichannelConnection SmbShare
Je vidět, že si dal Microsoft opravdu záležet a z pohledu správce souborového serveru zde nechybí nic důležitého. Na některé funkce se podíváme podrobněji.
Seznam sdílených složek zobrazíme pomocí Get-SmbShare:
PS C:\> Get-SmbShare
Name ScopeName Path Description ---- --------- ---- ----------- ADMIN$ * C:\Windows Remote Admin C$ * C:\ Default share E$ * E:\ Default share F$ * F:\ Default share IPC$ * Remote IPC
Všechny příkazy spouštím na čisté instalaci Windows 2012 Serveru, takže nejsou dostupné jiné, než administrativní sdílené složky. Každá složka obsahuje některé další zajímavé vlastnosti:
PS C:\> Get-SmbShare -Name c$ | Format-List *
PresetPathAcl : ShareState : Online AvailabilityType : NonClustered ShareType : FileSystemDirectory FolderEnumerationMode : Unrestricted CachingMode : Manual CATimeout : 0 ConcurrentUserLimit : 0 ContinuouslyAvailable : False CurrentUsers : 0 Description : Default share EncryptData : False Name : C$ Path : C:\ Scoped : False ScopeName : * SecurityDescriptor : O:SYG:SYD:(A;;GA;;;BA)(A;;GA;;;BO)(A;;GA;;;IU) ShadowCopy : False Special : True Temporary : False Volume : \\?\Volume{de1d5a93-11b8-11e2-93e8-806e6f6e6963}\ PSComputerName : CimClass : ROOT/Microsoft/Windows/SMB:MSFT_SmbShare CimInstanceProperties : {AvailabilityType, CachingMode, CATimeout, ConcurrentUserLimit...} CimSystemProperties : Microsoft.Management.Infrastructure.CimSystemProperties
Pojďme vytvořit novou sdílenou složku. Schválně nebudu zadávat žádné parametry z příkazové řádky, aby bylo vidět, které jsou povinné.
PS C:\> New-SmbShare
cmdlet New-SmbShare at command pipeline position 1 Supply values for the following parameters:´ Path: c:\temp\share1 Name: Share1
Name ScopeName Path Description ---- --------- ---- ----------- Share1 * c:\temp\share1
Pokud se nyní podíváme na práva ke sdílení, jsou nastavena na Everyone/Read. To nám nemusí vždy vyhovovat (a asi opravdu nebude). Proto využijeme nastavení práv již při vytváření sdílení.
PS C:\> New-SmbShare -Path C:\Temp\Share2 -Name Share2 -FullAccess Administrators -NoAccess Everyone
Name ScopeName Path Description ---- --------- ---- ----------- Share2 * C:\Temp\Share2
New-SmbShare totiž obsahuje parametry ChangeAccess, FullAccess, NoAccess a ReadAccess, pomocí kterých můžeme přístup ovlivnit.
Z prvního výpisu je vidět, že práva na složky se zobrazují jako SecurityDescriptor
SecurityDescriptor : O:SYG:SYD:(A;;GA;;;BA)(A;;GA;;;BO)(A;;GA;;;IU)
což není úplně příjemné počtení. Proto se nám bude hodit funkce Get-SmbShareAccess, která zobrazí práva v přehledné formě:
PS C:\> Get-SmbShareAccess Share1
Name ScopeName AccountName AccessControlType AccessRight ---- --------- ----------- ----------------- ----------- Share1 * Everyone Allow Read
Pokud již máme sdílený adresář vytvořený, můžeme měnit jeho nastavení pomocí Set-SmbShare. Jednou z možností, jak nastavit práva na Share1 podle Share2 je například toto.
PS C:\> Set-SmbShare -Name Share1 -SecurityDescriptor (Get-SmbShare -Name Share2).SecurityDescriptor
Confirm Are you sure you want to perform this action?Performing operation 'Modify' on Target '*,Share3'. [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Pokud bychom toto nastavení prováděli ze skriptu, je potřeba použít parametr Force, abychom se „nezasekli“ na potvrzovacím dialogu.
Životní cyklus našich sdílených adresářů ukončíme pomocí Remove-SmbShare.
PS C:\> Get-SmbShare share*
Name ScopeName Path Description ---- --------- ---- ----------- Share1 * c:\temp\share1 Share2 * C:\Temp\Share2
PS C:\> Get-SmbShare share* | Remove-SmbShare -WhatIf What if: Performing operation 'Remove-Share' on Target '*,Share1'. What if: Performing operation 'Remove-Share' on Target '*,Share2'.
PS C:\> Get-SmbShare share* | Remove-SmbShare -Force PS C:\> Get-SmbShare share*
Na souborovém serveru se hodí, podívat se, které soubory jsou otevřené a kým.
Z obrázku je vidět, že jsem přes vytvořený share otevřel soubor test.txt. Poté jsem použil Get-SmbOpenFile pro zobrazení tohoto spojení.
PS C:\> Get-SmbOpenFile | Format-Table -AutoSize
FileId SessionId Path ShareRelativePath ClientComputerName ClientUserName ------ --------- ---- ----------------- ------------------ -------------- 652835029037 652835029029 C:\Temp\Share3\ [fe80::e005:9d1a:128:f8ef] WIN2012\Administrator
PS C:\> Close-SmbOpenFile
Confirm Are you sure you want to perform this action?Performing operation 'Close-File' on Target '652835029037'. [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):Y
Otevřené spojení pak mohu i zavřít.
Pro zjištění nastavení serveru slouží Get-SmbServerConfiguration.
PS C:\> Get-SmbServerConfiguration
AnnounceServer : False AsynchronousCredits : 64 AutoShareServer : True AutoShareWorkstation : True CachedOpenLimit : 5 AnnounceComment : EnableDownlevelTimewarp : False EnableLeasing : True EnableMultiChannel : True EnableStrictNameChecking : True AutoDisconnectTimeout : 0 DurableHandleV2TimeoutInSeconds : 30 EnableAuthenticateUserSharing : False EnableForcedLogoff : True EnableOplocks : True EnableSecuritySignature : False ServerHidden : True IrpStackSize : 15 KeepAliveTime : 2 MaxChannelPerSession : 32 MaxMpxCount : 50 MaxSessionPerConnection : 16384 MaxThreadsPerQueue : 20 MaxWorkItems : 1 NullSessionPipes : NullSessionShares : OplockBreakWait : 35 PendingClientTimeoutInSeconds : 120 RequireSecuritySignature : False EnableSMB1Protocol : True EnableSMB2Protocol : True Smb2CreditsMax : 2048 Smb2CreditsMin : 128 SmbServerNameHardeningLevel : 0 TreatHostAsStableStorage : False ValidateAliasNotCircular : True ValidateShareScope : True ValidateShareScopeNotAliased : True ValidateTargetName : True EncryptData : FalseRejectUnencryptedAccess : True
V případě, že byste potřebovali některou hodnotu změnit, můžete použít naopak Set-SmbServerConfiguration.
Co třeba nastavení síťového rozhraní:
PS C:\> Get-SmbServerNetworkInterface
Scope Name Interface Index RSS Capable RDMA Capable Speed IpAddress ---------- --------------- ----------- ------------ ----- --------- * 12 False False 54 Mbps 192.168.10.101 * 12 False False 54 Mbps fe80::e005:9d1a:...
Celý modul obsahuje funkce pro práci s následujícími vlastnostmi:
PS C:\> Get-Command -Module smbshare |% { $verb,$noun = $_.name -split '-'; $noun} | group | sort count -desc
Count Name Group ----- ---- ----- 5 SmbShareAccess {SmbShareAccess, SmbShareAccess, SmbShareAccess, SmbShareAccess...} 4 SmbShare {SmbShare, SmbShare, SmbShare, SmbShare} 3 SmbMapping {SmbMapping, SmbMapping, SmbMapping} 3 SmbMultichannelConstraint {SmbMultichannelConstraint, SmbMultichannelConstrain...} 2 SmbOpenFile {SmbOpenFile, SmbOpenFile} 2 SmbSession {SmbSession, SmbSession} 2 SmbClientConfiguration {SmbClientConfiguration, SmbClientConfiguration} 2 SmbMultichannelConnection {SmbMultichannelConnection, SmbMultichannelConnection} 2 SmbServerConfiguration {SmbServerConfiguration, SmbServerConfiguration} 1 SmbClientNetworkInterface {SmbClientNetworkInterface} 1 SmbConnection {SmbConnection} 1 SmbServerNetworkInterface {SmbServerNetworkInterface}
Pokud by vás zajímala nápověda k dalším funkcím, najdete ji na TechNetu v sekci SMB Share Cmdlets in Windows PowerShell.
- David Moravec, MVP