Public/Set-midPointUserActivation.ps1

function Set-midPointUserActivation {
    <#
    .SYNOPSIS
    Sets the administrative status and the validity of a midPoint user.

    .DESCRIPTION
    Changes activation/administrativeStatus, activation/validFrom and activation/validTo in one PATCH.
    midPoint computes the effective status from these: an explicit administrative status wins,
    without one the validity dates decide.

    .PARAMETER Identity
    The user: name, OID, or an object from Get-midPointUser.

    .PARAMETER AdministrativeStatus
    Enabled, Disabled, Archived, or None. None removes the explicit status, so the validity dates decide again.

    .PARAMETER ValidFrom
    The user is active from this point in time.

    .PARAMETER ValidTo
    The user is active until this point in time.

    .PARAMETER ClearValidFrom
    Removes validFrom.

    .PARAMETER ClearValidTo
    Removes validTo.

    .PARAMETER PassThru
    Returns the activation after the change.

    .EXAMPLE
    Set-midPointUserActivation jack -ValidTo '2026-12-31 23:59'

    .EXAMPLE
    Set-midPointUserActivation jack -AdministrativeStatus None -ClearValidTo -PassThru
    #>

    [CmdletBinding(SupportsShouldProcess)]
    [OutputType('midPointTools.Activation')]
    param(
        [Parameter(Mandatory, Position = 0, ValueFromPipeline)]
        [object] $Identity,

        [ValidateSet('Enabled', 'Disabled', 'Archived', 'None')]
        [string] $AdministrativeStatus,

        [datetime] $ValidFrom,
        [datetime] $ValidTo,
        [switch] $ClearValidFrom,
        [switch] $ClearValidTo,

        [switch] $PassThru
    )

    process {
        $activationParams = Get-midPointActivationParameter -BoundParameters $PSBoundParameters
        $deltas = New-midPointActivationDelta -Prefix 'activation' @activationParams
        if ($deltas.Count -eq 0) {
            throw [System.ArgumentException]::new('Nothing to change. Give -AdministrativeStatus, -ValidFrom, -ValidTo, -ClearValidFrom or -ClearValidTo.')
        }

        $oid = Resolve-midPointObjectOid -InputObject $Identity -Type users
        $label = Get-midPointIdentityLabel $Identity
        if (-not $PSCmdlet.ShouldProcess("$label ($oid)", 'Change activation of midPoint user')) { return }

        Invoke-midPointModify -Type users -Oid $oid -ItemDelta $deltas
        if ($PassThru) { Get-midPointUserActivation -Identity $oid }
    }
}