Advertisement
Yevrag35

Copy-SmbShareAccess

Mar 8th, 2020
774
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Function Copy-SmbShareAccess()
  2. {
  3.     [CmdletBinding(DefaultParameterSetName="BySmbShareName")]
  4.     param
  5.     (
  6.         [Parameter(Mandatory=$true, ValueFromPipeline=$true, ParameterSetName="ByInputObject", DontShow=$true)]
  7.         [CimInstance] $InputObject,
  8.  
  9.         [Parameter(Mandatory=$true, Position = 0, ParameterSetName="BySmbShareName")]
  10.         [string] $Name,
  11.  
  12.         [Parameter(Mandatory=$true, Position = 0, ParameterSetName="ByInputObject")]
  13.         [Parameter(Mandatory=$true, Position = 1, ParameterSetName="BySmbShareName")]
  14.         [ValidateScript({
  15.             # Must be a CimInstance or string.
  16.             $_ -is [CimInstance] -or $_ -is [string]
  17.         })]
  18.         [object] $Destination,
  19.  
  20.         [Parameter(Mandatory=$false)]
  21.         [switch] $Overwrite,
  22.  
  23.         [Parameter(Mandatory=$false)]
  24.         [switch] $Force,
  25.  
  26.         [Parameter(Mandatory=$false)]
  27.         [switch] $PassThru
  28.     )
  29.     Begin
  30.     {
  31.         if ($PSBoundParameters.ContainsKey("Name"))
  32.         {
  33.             $InputObject = Get-SmbShare -Name $Name
  34.         }
  35.  
  36.         if ($Destination -is [string])
  37.         {
  38.             $Destination = Get-SmbShare -Name $Destination
  39.         }
  40.     }
  41.     Process
  42.     {
  43.         $entries = New-Object 'System.Collections.Generic.List[object]'
  44.         if ($InputObject.CimSystemProperties.ClassName -eq "MSFT_SmbShare" -and $InputObject.CimSystemProperties.Namespace -eq "ROOT/Microsoft/Windows/SMB")
  45.         {
  46.             $InputObject | Get-SmbShareAccess | ForEach-Object {
  47.                 $entries.Add($_)
  48.             }
  49.         }
  50.         elseif ($InputObject.CimSystemProperties.ClassName -eq "MSFT_SmbShareAccessControlEntry" -and $InputObject.CimSystemProperties.Namespace -eq "ROOT/Microsoft/Windows/SMB")
  51.         {
  52.             $entries.Add($_)
  53.         }
  54.     }
  55.     End
  56.     {
  57.         if ($Overwrite)
  58.         {
  59.             $Destination | Get-SmbShareAccess | ForEach-Object {
  60.                 Revoke-SmbShareAccess -InputObject $Destination -AccountName $_.AccountName -ErrorAction Stop -Force:$Force | Out-Null
  61.             }
  62.         }
  63.  
  64.         foreach ($entry in $entries)
  65.         {
  66.             $accessArgs = @{
  67.                 InputObject = $Destination
  68.                 AccountName = $entry.AccountName
  69.                 #ScopeName = $entry.ScopeName
  70.                 Force = $Force.ToBool()
  71.             }
  72.             if ($entry.AccessControlType -eq "Allow")
  73.             {
  74.                 Grant-SmbShareAccess @accessArgs -AccessRight $entry.AccessRight | Out-Null
  75.             }
  76.             else
  77.             {
  78.                 Block-SmbShareAccess @accessArgs | Out-Null
  79.             }
  80.         }
  81.  
  82.         if ($PassThru)
  83.         {
  84.             $Destination | Get-SmbShareAccess
  85.         }
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement