public/New-MoodleUser.ps1

<#
.SYNOPSIS
Creates a new Moodle user.
 
.PARAMETER Password
Specifies the new user's password.
 
.PARAMETER GeneratePassword
If specified, allow Moodle to generate a password and email it to the new user.
 
.PARAMETER Auth
Specifies the new user's authentication type. Default is Manual.
 
.PARAMETER UserName
Specifies a unique user name for the new user.
 
.PARAMETER Email
Specifies a unique email address for the new user.
 
.PARAMETER FirstName
Specifies the new user's first name.
 
.PARAMETER LastName
Specifies the new user's last name.
 
.PARAMETER Department
Specifies the user's department.
 
.PARAMETER IdNumber
Specifies a free-text ID Number for the new user.
 
.EXAMPLE
New-MoodleUser -GeneratePassword -UserName jbloggs -Email jbloggs@example.com -FirstName Joe -LastName Bloggs
 
Creates a new user for Joe Bloogs with username jbloggs. Moodle will generate a password and email it to him.
 
#>

function New-MoodleUser {
    # [OutputType([MoodleUserDetails])]
    [CmdletBinding(SupportsShouldProcess)]
    param (
        # The user's password.
        [Parameter(Mandatory, ParameterSetName = 'suppliedpassword')][securestring] $Password,

        # Generate a password and email it to the new user.
        [Parameter(Mandatory, ParameterSetName = 'generatedpassword')][switch][bool] $GeneratePassword,

        # Don't set a password, for use with external identity providers.
        [Parameter(Mandatory, ParameterSetName = 'nopassword')][switch][bool] $NoPassword,

        # The user's authentication type.
        [Parameter(Mandatory)]
        [ValidateSet('Manual', 'LDAP', 'SAML2', 'OIDC', 'OAUTH2')]
        [string]$Auth,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName)][string]$UserName,

        # The unique email address of the user.
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)][string]$Email,

        # The user's first name.
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)][string]$FirstName,

        # The user's family name.
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)][string]$LastName,

        # The user's department.
        [Parameter(ValueFromPipelineByPropertyName)][string] $Department,

        # The external "ID Number" of the user.
        [Parameter(ValueFromPipelineByPropertyName)][string] $IdNumber
    )

    Begin {
        $Url = $Script:_MoodleUrl
        $Token = $Script:_MoodleToken
        $proxySettings = $Script:_MoodleProxySettings

        if (!$Url -or !$Token) {
            Throw "You must call the Connect-Moodle cmdlet before calling any other cmdlets."
        }

        $function = 'core_user_create_users'
        $path = "webservice/rest/server.php?wstoken=$Token&wsfunction=$function&moodlewsrestformat=json"
    }

    Process {
        $body = @{
            'users[0][username]'   = $UserName
            'users[0][auth]'       = $Auth.ToLower()
            'users[0][firstname]'  = $FirstName
            'users[0][lastname]'   = $LastName
            'users[0][email]'      = $Email
            'users[0][department]' = $Department
            'users[0][idnumber]'   = $IdNumber
        }

        if ($GeneratePassword) {
            $body['users[0][createpassword]'] = 1

        }
        elseif (!$NoPassword) {
            $marshal = [Runtime.InteropServices.Marshal]
            $pass = $marshal::PtrToStringAuto( $marshal::SecureStringToBSTR($Password) )
            $body['users[0][password]'] = $pass
        }

        if ($PSCmdlet.ShouldProcess($UserName, "Create")) {
            $results = Invoke-RestMethod -Method Post -Uri ([uri]::new($Url, $path)) -Body $body -ContentType 'application/x-www-form-urlencoded' @proxySettings
            $results | Foreach-Object {
                New-Object -TypeName MoodleUserDetails -Property @{
                    Id         = $_.id
                    UserName   = $UserName
                    Auth       = $Auth
                    FirstName  = $FirstName
                    LastName   = $LastName
                    Email      = $Email
                    Department = $Department
                    IdNumber   = $IdNumber
                }
            }
        }
    }
}