Seriál Windows PowerShell: PowerShell v3 – jak na sdílené složky (část 31.)

Automatické načítání modulů

Než se pustíme do prohlídky dvou nových modulů, povíme si něco o možnosti takzvaného module autoloadingPokud 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:

image

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.

Sdílené složky

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.

Get-SmbShare

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

New-SmbShare

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

Set-SmbShare

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.

Remove-SmbShare

Ž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*

*-SmbOpenFile

Na souborovém serveru se hodí, podívat se, které soubory jsou otevřené a kým.

image

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.

Další zajímavé funkce

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                     : False
RejectUnencryptedAccess         : 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.