Public/Set-UnityUser.ps1

Function Set-UnityUser {

  <#
      .SYNOPSIS
      Modifies local user parameters.
      .DESCRIPTION
      Modifies local user parameters.
      You need to have an active session with the array.
      .NOTES
      Written by Erwan Quelin under MIT licence - https://github.com/equelin/Unity-Powershell/blob/master/LICENSE
      .LINK
      https://github.com/equelin/Unity-Powershell
      .EXAMPLE
      Set-UnityUser -Name 'User' -Role 'operator'
 
      Gives the role 'operator' to the user 'User'
      .EXAMPLE
      Get-UnityUSer -Name 'User' | Set-UnityUser -Role 'operator'
 
      Gives the role 'operator' to the user 'User'. The user's information are provided by the Get-UnityUser through the pipeline.
  #>


  [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')]
  Param (
    [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')]
    $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}),
    [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User Name or User Object')]
    $Name,
    [Parameter(Mandatory = $false,HelpMessage = 'User role. It mights be administrator, storageadmin, vmadmin or operator')]
    [String]$Role,
    [Parameter(Mandatory = $false,HelpMessage = 'User Password')]
    [String]$Password,
    [Parameter(Mandatory = $false,HelpMessage = 'User Password')]
    [String]$oldPassword
  )

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

  Process {

    Foreach ($sess in $session) {

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

      If ($Sess.TestConnection()) {

        Foreach ($n in $Name) {

          # Determine input and convert to UnityUser object
          Switch ($n.GetType().Name)
          {
            "String" {
              $User = get-UnityUser -Session $Sess -Name $n
              $UserID = $User.id
              $UserName = $n
            }
            "UnityUser" {
              Write-Verbose "Input object type is $($n.GetType().Name)"
              $UserName = $n.Name
              If (Get-UnityUser -Session $Sess -Name $n.Name) {
                        $UserID = $n.id
              }
            }
          }

          If ($UserID) {
            # Creation of the body hash
            $body = @{}

            # Role parameter
            $body["id"] = "$($UserID)"

            # role parameter
            If ($Role) {
              $body["role"] = "$($Role)"
            }

            # oldPassword parameter
            If ($password -and $oldPassword) {
              $body["oldPassword"] = "$($oldPassword)"
              $body["password"] = "$($password)"
            }

            #Building the URI
            $URI = 'https://'+$sess.Server+'/api/instances/user/'+$UserID+'/action/modify'
            Write-Verbose "URI: $URI"

            #Sending the request
            If ($pscmdlet.ShouldProcess($UserName,"Modify User")) {
              $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body
            }

            If ($request.StatusCode -eq '204') {

              Write-Verbose "User with ID: $id has been modified"

              Get-UnityUser -Session $Sess -id $UserID

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

  End {
  }
}