public/Update-VPASEPVUser.ps1
<#
.Synopsis UPDATE EPV USER CREATED BY: Vadim Melamed, EMAIL: vmelamed5@gmail.com .DESCRIPTION USE THIS FUNCTION TO UPDATE AN EPV USER .PARAMETER token HashTable of data containing various pieces of login information (PVWA, LoginToken, HeaderType, etc). If -token is not passed, function will use last known hashtable generated by New-VPASToken .PARAMETER UpdateWorkStreet EPVUser new WorkStreet value .PARAMETER UpdateWorkCity EPVUser new WorkCity value .PARAMETER UpdateWorkState EPVUser new WorkState value .PARAMETER UpdateWorkZip EPVUser new WorkZip value .PARAMETER UpdateWorkCountry EPVUser new WorkCountry value .PARAMETER UpdateHomePage EPVUser new HomePage value .PARAMETER UpdateHomeEmail EPVUser new HomeEmail value .PARAMETER UpdateBusinessEmail EPVUser new BusinessEmail value .PARAMETER UpdateOtherEmail EPVUser new OtherEmail value .PARAMETER UpdateHomeNumber EPVUser new HomeNumber value .PARAMETER UpdateBusinessNumber EPVUser new BusinessNumber value .PARAMETER UpdateCellularNumber EPVUser new CellularNumber value .PARAMETER UpdateFaxNumber EPVUser new Faxnumber value .PARAMETER UpdatePagerNumber EPVUser new PagerNumber value .PARAMETER UpdateChangePassOnNextLogon Enable or Disable ChangePassOnNextLogon restriction Possible values: Yes, No .PARAMETER UpdatePasswordNeverExpires Enable ot Disable PasswordNeverExpires restriction Possible values: Yes, No .PARAMETER UpdateEnableUser Enable or Disable current state of EPVUser Possible values: Enable, Disable .PARAMETER UpdateDescription EPVUser new Descripion value .PARAMETER UpdateLocation EPVUser new Location value .PARAMETER UpdateStreet EPVUser new Street value .PARAMETER UpdateCity EPVUser new City value .PARAMETER UpdateState EPVUser new State value .PARAMETER UpdateZip EPVUser new Zip value .PARAMETER UpdateCountry EPVUser new Country value .PARAMETER UpdateTitle EPVUser new Title value .PARAMETER UpdateOrganization EPVUser new Organization value .PARAMETER UpdateDepartment EPVUser new Department value .PARAMETER UpdateProfession EPVUser new Profession value .PARAMETER UpdateFirstName EPVUser new FirstName value .PARAMETER UpdateMiddleName EPVUser new MiddleName value .PARAMETER UpdateLastName EPVUser new LastName value .PARAMETER LookupBy Which method will be used to query for the target EPVUser, via Username or UserID Possible values: Username, UserID .PARAMETER LookupVal Target searchquery string .PARAMETER AddVaultAuthorization Add VaultAuthorization permissions in addition to current permissions to target EPVUser Possible values: AddUpdateUsers, AddSafes, AddNetworkAreas, ManageDirectoryMapping, ManageServerFileCategories, AuditUsers, BackupAllSafes, RestoreAllSafes, ResetUsersPasswords, ActivateUsers .PARAMETER DeleteVaultAuthorization Delete specific existing VaultAuthorizations from target EPVUser Possible values: AddUpdateUsers, AddSafes, AddNetworkAreas, ManageDirectoryMapping, ManageServerFileCategories, AuditUsers, BackupAllSafes, RestoreAllSafes, ResetUsersPasswords, ActivateUsers .EXAMPLE $UpdateEPVUserJSON = Update-VPASEPVUser -Username {USERNAME VALUE} -Location {LOCATION VALUE} -ChangePasswordOnNextLogon true .OUTPUTS JSON Object (EPVUserDetails) if successful $false if failed #> function Update-VPASEPVUser{ [OutputType('System.Object',[bool])] [CmdletBinding()] Param( [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,HelpMessage="Enter search method (Username, UserID)",Position=0)] [ValidateSet('Username','UserID')] [String]$LookupBy, [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,HelpMessage="Enter search value to query target EPVUser",Position=1)] [String]$LookupVal, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=2)] [String]$UpdateWorkStreet, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=3)] [String]$UpdateWorkCity, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=4)] [String]$UpdateWorkState, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=5)] [String]$UpdateWorkZip, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=6)] [String]$UpdateWorkCountry, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=7)] [String]$UpdateHomePage, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=8)] [String]$UpdateHomeEmail, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=9)] [String]$UpdateBusinessEmail, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=10)] [String]$UpdateOtherEmail, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=11)] [String]$UpdateHomeNumber, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=12)] [String]$UpdateBusinessNumber, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=13)] [String]$UpdateCellularNumber, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=14)] [String]$UpdateFaxNumber, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=15)] [String]$UpdatePagerNumber, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=16)] [ValidateSet('Enable','Disable')] [String]$UpdateEnableUser, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=17)] [ValidateSet('Yes','No')] [String]$UpdateChangePassOnNextLogon, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=18)] [ValidateSet('Yes','No')] [String]$UpdatePasswordNeverExpires, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=19)] [String]$UpdateDescription, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=20)] [String]$UpdateLocation, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=21)] [String]$UpdateStreet, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=22)] [String]$UpdateCity, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=23)] [String]$UpdateState, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=24)] [String]$UpdateZip, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=25)] [String]$UpdateCountry, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=26)] [String]$UpdateTitle, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=27)] [String]$UpdateOrganization, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=28)] [String]$UpdateDepartment, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=29)] [String]$UpdateProfession, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=30)] [String]$UpdateFirstName, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=31)] [String]$UpdateMiddleName, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=32)] [String]$UpdateLastName, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=33)] [ValidateSet('AddUpdateUsers','AddSafes','AddNetworkAreas','ManageDirectoryMapping','ManageServerFileCategories','AuditUsers','BackupAllSafes','RestoreAllSafes','ResetUsersPasswords','ActivateUsers')] [String]$AddVaultAuthorization, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=34)] [ValidateSet('AddUpdateUsers','AddSafes','AddNetworkAreas','ManageDirectoryMapping','ManageServerFileCategories','AuditUsers','BackupAllSafes','RestoreAllSafes','ResetUsersPasswords','ActivateUsers')] [String]$DeleteVaultAuthorization, [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=35)] [hashtable]$token ) Begin{ $tokenval,$sessionval,$PVWA,$Header,$ISPSS,$IdentityURL,$EnableTextRecorder,$AuditTimeStamp,$NoSSL,$VaultVersion = Get-VPASSession -token $token $CommandName = $MyInvocation.MyCommand.Name $log = Write-VPASTextRecorder -inputval $CommandName -token $token -LogType COMMAND } Process{ Write-Verbose "SUCCESSFULLY PARSED PVWA VALUE" Write-Verbose "SUCCESSFULLY PARSED TOKEN VALUE" Write-Verbose "SUCCESSFULLY PARSED LOOKUPBY VALUE: $LookupBy" Write-Verbose "SUCCESSFULLY PARSED LOOKUPVAL VALUE: $LookupVal" try{ if($LookupBy -eq "Username"){ Write-Verbose "INVOKING HELPER FUNCTION" $searchQuery = "$LookupVal" $UserID = Get-VPASEPVUserIDHelper -token $token -username $searchQuery } elseif($LookupBy -eq "UserID"){ Write-Verbose "SUPPLIED USERID: $LookupVal, SKIPPING HELPER FUNCTION" $UserID = $LookupVal } Write-Verbose "GETTING CURRENT DETAILS FOR $LookupBy : $LookupVal" if($NoSSL){ $uri = "http://$PVWA/PasswordVault/api/Users/$UserID" } else{ $uri = "https://$PVWA/PasswordVault/api/Users/$UserID" } Write-Verbose "MAKING API CALL TO CYBERARK" if($sessionval){ $CurVals = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method GET -ContentType "application/json" -WebSession $sessionval } else{ $CurVals = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method GET -ContentType "application/json" } Write-Verbose "SUCCESSFULLY RETRIEVED CURRENT DETAILS FOR $LookupBy : $LookupVal" write-verbose "PARSING THROUGH CURRENT VALUES" $curVaultAuthorizations = @() $temp = $CurVals.vaultAuthorization foreach($rec in $temp){ $curVaultAuthorizations += $rec } $curUsername = $CurVals.username $curUserType = $CurVals.userType $curLocation = $CurVals.location $curEnableUser = $CurVals.enableUser $curAuthenticationMethod = $CurVals.authenticationMethod $curChangePassOnNextLogon = $CurVals.changePassOnNextLogon $curPasswordNeverExpires = $CurVals.passwordNeverExpires $curDistinguishedName = $CurVals.distinguishedName $curBusinessAddress = @{} $curWorkStreet = $CurVals.businessAddress.workStreet $curWorkCity = $CurVals.businessAddress.workCity $curWorkState = $CurVals.businessAddress.workState $curWorkZip = $CurVals.businessAddress.workZip $curWorkCountry = $CurVals.businessAddress.workCountry $curBusinessAddress = @{ workStreet = $curWorkStreet workCity = $curWorkCity workState = $curWorkState workZip = $curWorkZip workCountry = $curWorkCountry } $curInternet = @{} $curHomePage = $CurVals.internet.homePage $curHomeEmail = $CurVals.internet.homeEmail $curBusinessEmail = $CurVals.internet.businessEmail $curOtherEmail = $CurVals.internet.otherEmail $curInternet = @{ homePage = $curHomePage homeEmail = $curHomeEmail businessEmail = $curBusinessEmail otherEmail = $curOtherEmail } $curPhones = @{} $curHomeNumber = $CurVals.phones.homeNumber $curBusinessNumber = $CurVals.phones.businessNumber $curCellularNumber = $CurVals.phones.cellularNumber $curFaxNumber = $CurVals.phones.faxNumber $curPagerNumber = $CurVals.phones.pagerNumber $curPhones = @{ homeNumber = $curHomeNumber businessNumber = $curBusinessNumber cellularNumber = $curCellularNumber faxNumber = $curFaxNumber pagerNumber = $curPagerNumber } $curDescription = $CurVals.description $curPersonalDetails = @{} $curStreet = $CurVals.personalDetails.street $curCity = $CurVals.personalDetails.city $curState = $CurVals.personalDetails.state $curZip = $CurVals.personalDetails.zip $curCountry = $CurVals.personalDetails.country $curTitle = $CurVals.personalDetails.title $curOrganization = $CurVals.personalDetails.organization $curDepartment = $CurVals.personalDetails.department $curProfession = $CurVals.personalDetails.profession $curFirstName = $CurVals.personalDetails.firstName $curMiddleName = $CurVals.personalDetails.middleName $curLastName = $CurVals.personalDetails.lastName $curPersonalDetails = @{ street = $curStreet city = $curCity state = $curState zip = $curZip country = $curCountry title = $curTitle organization = $curOrganization department = $curDepartment profession = $curProfession firstName = $curFirstName middleName = $curMiddleName lastName = $curLastName } $curSuspended = $CurVals.suspended $curID = $CurVals.id $curSource = $CurVals.source $curComponentUser = $CurVals.componentUser write-verbose "REPLACING CURRENT VALUES WITH UPDATED VALUES" #WORK SECTION if([String]::IsNullOrEmpty($UpdateWorkStreet)){ Write-Verbose "VALUE FOR WORK STREET EMPTY, SKIPPING" } else{ $curBusinessAddress.workStreet = $UpdateWorkStreet } if([String]::IsNullOrEmpty($UpdateWorkCity)){ Write-Verbose "VALUE FOR WORK CITY EMPTY, SKIPPING" } else{ $curBusinessAddress.workCity = $UpdateWorkCity } if([String]::IsNullOrEmpty($UpdateWorkState)){ Write-Verbose "VALUE FOR WORK STATE EMPTY, SKIPPING" } else{ $curBusinessAddress.workState = $UpdateWorkState } if([String]::IsNullOrEmpty($UpdateWorkZip)){ Write-Verbose "VALUE FOR WORK ZIP EMPTY, SKIPPING" } else{ $curBusinessAddress.workZip = $UpdateWorkZip } if([String]::IsNullOrEmpty($UpdateWorkCountry)){ Write-Verbose "VALUE FOR WORK COUNTRY EMPTY, SKIPPING" } else{ $curBusinessAddress.workCountry = $UpdateWorkCountry } #INTERNET if([String]::IsNullOrEmpty($UpdateHomePage)){ Write-Verbose "VALUE FOR HOME PAGE EMPTY, SKIPPING" } else{ $curInternet.homePage = $UpdateHomePage } if([String]::IsNullOrEmpty($UpdateHomeEmail)){ Write-Verbose "VALUE FOR HOME EMAIL EMPTY, SKIPPING" } else{ $curInternet.homeEmail = $UpdateHomeEmail } if([String]::IsNullOrEmpty($UpdateBusinessEmail)){ Write-Verbose "VALUE FOR BUSINESS EMAIL EMPTY, SKIPPING" } else{ $curInternet.businessEmail = $UpdateBusinessEmail } if([String]::IsNullOrEmpty($UpdateOtherEmail)){ Write-Verbose "VALUE FOR OTHER EMAIL EMPTY, SKIPPING" } else{ $curInternet.otherEmail = $UpdateOtherEmail } #PHONES if([String]::IsNullOrEmpty($UpdateHomeNumber)){ Write-Verbose "VALUE FOR HOME NUMBER EMPTY, SKIPPING" } else{ $curPhones.homeNumber = $UpdateHomeNumber } if([String]::IsNullOrEmpty($UpdateBusinessNumber)){ Write-Verbose "VALUE FOR BUSINESS NUMBER EMPTY, SKIPPING" } else{ $curPhones.businessNumber = $UpdateBusinessNumber } if([String]::IsNullOrEmpty($UpdateCellularNumber)){ Write-Verbose "VALUE FOR CELLULAR NUMBER EMPTY, SKIPPING" } else{ $curPhones.cellularNumber = $UpdateCellularNumber } if([String]::IsNullOrEmpty($UpdateFaxNumber)){ Write-Verbose "VALUE FOR FAX NUMBER EMPTY, SKIPPING" } else{ $curPhones.faxNumber = $UpdateFaxNumber } if([String]::IsNullOrEmpty($UpdatePagerNumber)){ Write-Verbose "VALUE FOR PAGER NUMBER EMPTY, SKIPPING" } else{ $curPhones.pagerNumber = $UpdatePagerNumber } if([String]::IsNullOrEmpty($UpdateDescription)){ Write-Verbose "VALUE FOR DESCRIPTION EMPTY, SKIPPING" } else{ $curDescription = $UpdateDescription } #PERSONAL DETAILS if([String]::IsNullOrEmpty($UpdateStreet)){ Write-Verbose "VALUE FOR STREET EMPTY, SKIPPING" } else{ $curPersonalDetails.street = $UpdateStreet } if([String]::IsNullOrEmpty($UpdateCity)){ Write-Verbose "VALUE FOR CITY EMPTY, SKIPPING" } else{ $curPersonalDetails.city = $UpdateCity } if([String]::IsNullOrEmpty($UpdateState)){ Write-Verbose "VALUE FOR STATE EMPTY, SKIPPING" } else{ $curPersonalDetails.state = $UpdateState } if([String]::IsNullOrEmpty($UpdateZip)){ Write-Verbose "VALUE FOR ZIP EMPTY, SKIPPING" } else{ $curPersonalDetails.zip = $UpdateZip } if([String]::IsNullOrEmpty($UpdateCountry)){ Write-Verbose "VALUE FOR COUNTRY EMPTY, SKIPPING" } else{ $curPersonalDetails.country = $UpdateCountry } if([String]::IsNullOrEmpty($UpdateTitle)){ Write-Verbose "VALUE FOR TITLE EMPTY, SKIPPING" } else{ $curPersonalDetails.title = $UpdateTitle } if([String]::IsNullOrEmpty($UpdateOrganization)){ Write-Verbose "VALUE FOR ORGANIZATION EMPTY, SKIPPING" } else{ $curPersonalDetails.organization = $UpdateOrganization } if([String]::IsNullOrEmpty($UpdateDepartment)){ Write-Verbose "VALUE FOR DEPARTMENT EMPTY, SKIPPING" } else{ $curPersonalDetails.department = $UpdateDepartment } if([String]::IsNullOrEmpty($UpdateProfession)){ Write-Verbose "VALUE FOR PROFESSION EMPTY, SKIPPING" } else{ $curPersonalDetails.profession = $UpdateProfession } if([String]::IsNullOrEmpty($UpdateFirstName)){ Write-Verbose "VALUE FOR FIRST NAME EMPTY, SKIPPING" } else{ $curPersonalDetails.firstName = $UpdateFirstName } if([String]::IsNullOrEmpty($UpdateMiddleName)){ Write-Verbose "VALUE FOR MIDDLE NAME EMPTY, SKIPPING" } else{ $curPersonalDetails.middleName = $UpdateMiddleName } if([String]::IsNullOrEmpty($UpdateLastName)){ Write-Verbose "VALUE FOR LAST NAME EMPTY, SKIPPING" } else{ $curPersonalDetails.lastName = $UpdateLastName } #MISC if([String]::IsNullOrEmpty($UpdatePasswordNeverExpires)){ Write-Verbose "VALUE FOR PASSWORD NEVER EXPIRES EMPTY, SKIPPING" } elseif($UpdatePasswordNeverExpires -eq "Yes"){ $curPasswordNeverExpires = $true } elseif($UpdatePasswordNeverExpires -eq "No"){ $curPasswordNeverExpires = $false } if([String]::IsNullOrEmpty($UpdateChangePassOnNextLogon)){ Write-Verbose "VALUE FOR CHANGE PASS ON NEXT LOGON EMPTY, SKIPPING" } elseif($UpdateChangePassOnNextLogon -eq "Yes"){ $curChangePassOnNextLogon = $true } elseif($UpdateChangePassOnNextLogon -eq "No"){ $curChangePassOnNextLogon = $false } if([String]::IsNullOrEmpty($UpdateEnableUser)){ Write-Verbose "VALUE FOR ENABLE USER EMPTY, SKIPPING" } elseif($UpdateEnableUser -eq "Enable"){ $curEnableUser = $true } elseif($UpdateEnableUser -eq "Disable"){ $curEnableUser = $false } $locationstr = "\" if([String]::IsNullOrEmpty($UpdateLocation)){ Write-Verbose "VALUE FOR LOCATION EMPTY, SKIPPING" } else{ $locationstr += $UpdateLocation $curLocation = $locationstr } if([String]::IsNullOrEmpty($AddVaultAuthorization)){ Write-Verbose "VALUE FOR ADDING VAULT AUTHORIZATIONS EMPTY, SKIPPING" } else{ if($curVaultAuthorizations.Contains($AddVaultAuthorization)){ Write-Verbose "USER ALREADY HAS THIS PERMISSION, SKIPPING" } else{ $curVaultAuthorizations += $AddVaultAuthorization } } if([String]::IsNullOrEmpty($DeleteVaultAuthorization)){ Write-Verbose "VALUE FOR DELETING VAULT AUTHORIZATIONS EMPTY, SKIPPING" } else{ if($curVaultAuthorizations.Contains($DeleteVaultAuthorization)){ $newVaultAuths = @() foreach($rec in $curVaultAuthorizations){ if($rec -eq $DeleteVaultAuthorization){ #DO NOTHING } else{ $newVaultAuths += $rec } } $curVaultAuthorizations = $newVaultAuths } else{ write-verbose "USER DOES NOT HAVE THIS PERMISSION, SKIPPING" } } write-verbose "PARAMETERS HAVE BEEN UPDATED, ADDING TO API PARAMETERS" $params = @{ enableUser = $curEnableUser changePassOnNextLogon = $curChangePassOnNextLogon suspended = $curSuspended passwordNeverExpires = $curPasswordNeverExpires distinguishedName = $curDistinguishedName description = $curDescription businessAddress = $curBusinessAddress internet = $curInternet phones = $curPhones personalDetails = $curPersonalDetails id = $curID username = $curUsername source = $curSource usertype = $curUserType componentUser = $curComponentUser vaultAuthorization = $curVaultAuthorizations location = $curLocation authenticationMethod = $curAuthenticationMethod } $log = Write-VPASTextRecorder -inputval $params -token $token -LogType PARAMS $params = $params | ConvertTo-Json write-verbose "FINISHED PARSING API PARAMETERS" if($NoSSL){ Write-Verbose "NO SSL ENABLED, USING HTTP INSTEAD OF HTTPS" $uri = "http://$PVWA/PasswordVault/api/Users/$UserID" } else{ Write-Verbose "SSL ENABLED BY DEFAULT, USING HTTPS" $uri = "https://$PVWA/PasswordVault/api/Users/$UserID" } $log = Write-VPASTextRecorder -inputval $uri -token $token -LogType URI $log = Write-VPASTextRecorder -inputval "PUT" -token $token -LogType METHOD Write-Verbose "MAKING API CALL TO CYBERARK" if($sessionval){ $response = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method PUT -Body $params -ContentType "application/json" -WebSession $sessionval } else{ $response = Invoke-RestMethod -Headers @{"Authorization"=$Header} -Uri $uri -Method PUT -Body $params -ContentType "application/json" } $outputlog = $response $log = Write-VPASTextRecorder -inputval $outputlog -token $token -LogType RETURN Write-Verbose "SUCCESSFULLY UPDATED $LookupBy : $LookupVal" Write-verbose "RETURNING JSON OBJECT" return $response }catch{ $log = Write-VPASTextRecorder -inputval $_ -token $token -LogType ERROR $log = Write-VPASTextRecorder -inputval "REST API COMMAND RETURNED: FALSE" -token $token -LogType MISC Write-Verbose "UNABLE TO UPDATE $LookupBy : $LookupVal" Write-VPASOutput -str $_ -type E return $false } } End{ $log = Write-VPASTextRecorder -inputval $CommandName -token $token -LogType DIVIDER } } |