Public/Set-UnityCIFSShare.ps1

Function Set-UnityCIFSShare {

  <#
      .SYNOPSIS
      Modifies CIFS share.
      .DESCRIPTION
      Modifies CIFS share.
      You need to have an active session with the array.
      .NOTES
      Written by Erwan Quelin under Apache licence - https://github.com/equelin/Unity-Powershell/blob/master/LICENSE
      .LINK
      https://github.com/equelin/Unity-Powershell
      .EXAMPLE
      Set-UnityCIFSShare -ID 'SMBShare_1' -Description 'New description'
 
      Modifies the CIFS share with id 'SMBShare_1'
  #>


    [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')]
  Param (
    #Default Parameters
    [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')]
    $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}),

    #cifsShareModify
    [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'ID of the CIFS share')]
    [String[]]$ID,

    #$cifsShareParameters
    [Parameter(Mandatory = $false,HelpMessage = 'CIFS share description')]
    [String]$description,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether the CIFS share is read-only')]
    [bool]$isReadOnly,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether CIFS encryption for Server Message Block (SMB) 3.0 is enabled for the CIFS share')]
    [bool]$isEncryptionEnabled,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether continuous availability for SMB 3.0 is enabled for the CIFS share')]
    [bool]$isContinuousAvailabilityEnabled,
    [Parameter(Mandatory = $false,HelpMessage = 'Enumerate file with read access and directories with list access in folder listings')]
    [bool]$isABEEnabled,
    [Parameter(Mandatory = $false,HelpMessage = 'Branch Cache optimizes traffic between the NAS server and Branch Office Servers')]
    [bool]$isBranchCacheEnabled,
    [Parameter(Mandatory = $false,HelpMessage = 'Offline Files store a version of the shared resources on the client computer in the file system cache, a reserved portion of disk space, which the client computer can access even when it is disconnected from the network')]
    [CifsShareOfflineAvailabilityEnum]$offlineAvailability,
    [Parameter(Mandatory = $false,HelpMessage = 'The default UNIX umask for new files created on the share')]
    [String]$umask
  )

  Begin {
    Write-Verbose "Executing function: $($MyInvocation.MyCommand)"
  }

  Process {

    Foreach ($sess in $session) {

      Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)"

      If (Test-UnityConnection -Session $Sess) {

        Foreach ($i in $ID) {

          # Determine input and convert to UnityFilesystem object
          Switch ($i.GetType().name)
          {
            "String" {
              $share = get-UnityCIFSShare -Session $Sess -ID $i
              $ShareID = $share.id
              $filesystemID = $share.filesystem.id
            }
            "UnityCIFSShare" {
              Write-Verbose "Input object type is $($i.GetType().Name)"
              If ($share = Get-UnityCIFSShare -Session $Sess -ID $i) {
                $ShareID = $share.id
                $filesystemID = $share.filesystem.id
              }
            }
          }

          If ($ShareID) {

            $UnityStorageRessource = Get-UnitystorageResource -Session $sess | Where-Object {($_.filesystem.id -like $filesystemID)}

            # Creation of the body hash
            $body = @{}

            $body["cifsShareModify"] = @()

              $cifsShareModifyParameters = @{}
                $cifsShareModifyParameters["cifsShare"] = @{}
                  $cifsShare = @{}
                  $cifsShare['id'] = $ShareID
                $cifsShareModifyParameters["cifsShare"] = $cifsShare

              #$cifsShareParameters
              If (($PSBoundParameters.ContainsKey('description')) -or ($PSBoundParameters.ContainsKey('isReadOnly')) -or ($PSBoundParameters.ContainsKey('isEncryptionEnabled')) -or ($PSBoundParameters.ContainsKey('isContinuousAvailabilityEnabled')) -or ($PSBoundParameters.ContainsKey('isABEEnabled')) -or ($PSBoundParameters.ContainsKey('isBranchCacheEnabled')) -or ($PSBoundParameters.ContainsKey('offlineAvailability')) -or ($PSBoundParameters.ContainsKey('umask'))){
                $cifsShareModifyParameters["cifsShareParameters"] = @{}
                
                $cifsShareParameters = @{}

                If ($PSBoundParameters.ContainsKey('description')) {
                  $cifsShareParameters["description"] = "$($description)"
                }

                If ($PSBoundParameters.ContainsKey('isReadOnly')) {
                  $cifsShareParameters["isReadOnly"] = $isReadOnly
                }

                If ($PSBoundParameters.ContainsKey('isEncryptionEnabled')) {
                  $cifsShareParameters["isEncryptionEnabled"] = $isEncryptionEnabled
                }

                If ($PSBoundParameters.ContainsKey('isContinuousAvailabilityEnabled')) {
                  $cifsShareParameters["isContinuousAvailabilityEnabled"] = $isContinuousAvailabilityEnabled
                }

                If ($PSBoundParameters.ContainsKey('isABEEnabled')) {
                  $cifsShareParameters["isABEEnabled"] = $isABEEnabled
                }

                If ($PSBoundParameters.ContainsKey('isBranchCacheEnabled')) {
                  $cifsShareParameters["isBranchCacheEnabled"] = $isBranchCacheEnabled
                }

                If ($PSBoundParameters.ContainsKey('offlineAvailability')) {
                  $cifsShareParameters["offlineAvailability"] = "$($offlineAvailability)"
                }

                If ($PSBoundParameters.ContainsKey('umask')) {
                  $cifsShareParameters["umask"] = "$($umask)"
                }

              $cifsShareModifyParameters["cifsShareParameters"] = $cifsShareParameters

              }

            $body["cifsShareModify"] += $cifsShareModifyParameters

            #Building the URI
            $URI = 'https://'+$sess.Server+'/api/instances/storageResource/'+($UnityStorageRessource.id)+'/action/modifyFilesystem'
            Write-Verbose "URI: $URI"

            #Sending the request
            if ($pscmdlet.ShouldProcess($ShareID,"Modify CIFS Share")) {
              $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body
            }
            
            If ($request.StatusCode -eq '204') {

              Write-Verbose "CIFS Share named $name on filesystem $filesystemName has been modified"

              Get-UnityFilesystem -Session $Sess -id $filesystemID

            }
          } else {
            Write-Verbose "CIFS Share $ShareID does not exist on the array $($sess.Name)"
          }
        }
      } else {
        Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)"
      }
    }
  }

  End {}
}