public/Get-MoodleUser.ps1

<#
.SYNOPSIS
Gets a Moodle user.
 
.DESCRIPTION
Gets the details of a Moodle user.
 
.PARAMETER Id
Specifies the unique ID of a user.
 
.PARAMETER UserName
Specifies the unique user name of a user.
 
.PARAMETER IdNumber
Specifies the free-text ID Number of a user.
 
.PARAMETER Email
Specifies the unique email address of a user.
 
.EXAMPLE
Get-MoodleUser -UserName teacher
 
Gets a user whose user name is 'teacher'.
 
.EXAMPLE
Get-MoodleUser -Email JBloggs@example.com
 
Searches for a user whose email address is 'JBloggs@example.com' or 'jbloggs@example.com'.
Searching for a user by email is case-sensitive, so we try the lower-case variation as part of the same search.
#>

function Get-MoodleUser {
    # [OutputType([MoodleUserDetails])]
    [CmdletBinding(DefaultParameterSetName='id')]
    param (
        # The unique user id.
        [Parameter(ParameterSetName="id",Mandatory,Position=0)][int] $Id,
        # The unique user name.
        [Parameter(ParameterSetName="username",Mandatory)][string] $UserName,
        # The external "ID Number" of the user.
        [Parameter(ParameterSetName="idnumber",Mandatory)][string] $IdNumber,
        # THe unique email address of the user.
        [Parameter(ParameterSetName="email",Mandatory)][string] $Email
    )
    
    Begin {
        $Url = $PsCmdlet.SessionState.PSVariable.GetValue("_MoodleUrl")
        $Token = $PsCmdlet.SessionState.PSVariable.GetValue("_MoodleToken")
        
        if (!$Url -or !$Token) {
            Throw "You must call the Connect-Moodle cmdlet before calling any other cmdlets."
        }

        $function = 'core_user_get_users_by_field'
    }
    
    Process {
        $path = "webservice/rest/server.php?wstoken=$Token&wsfunction=$function&moodlewsrestformat=json"
        
        $params = @{
            id = $Id
            username = $UserName
            idnumber = $IdNumber
            email = $Email
        }
    
        $index = 0
        foreach ($key in $params.Keys) {
            $value = $params[$key]
            if ($PSBoundParameters.ContainsKey($key)) {
                $path = $path + "&field=$($key)&values[0]=$value"

                if ($value -cne $value.ToString().ToLower()) {
                    $path = $path + "&values[1]=$($value.ToLower())"
                }
                $index++
            }
        }

        $results = Invoke-RestMethod -Uri ([uri]::new($Url, $path)) 
        $results | Foreach-Object {
            New-Object -TypeName MoodleUserDetails -Property @{
                Id=$_.id 
                UserName = $_.username
                Auth = $_.auth
                FirstName = $_.firstname
                LastName = $_.lastname
                Email = $_.email
                IdNumber = $_.idnumber 
                Suspended = $_.suspended
                FirstAccess = if ($_.firstaccess -gt 0) { [DateTimeOffset]::FromUnixTimeSeconds($_.firstaccess).DateTime } else { $null }
                LastAccess = if ($_.lastaccess -gt 0) { [DateTimeOffset]::FromUnixTimeSeconds($_.lastaccess).DateTime } else { $null }
            } 
        }
    }
}