Public/New-UnifiSiteAdmin.ps1
function New-UnifiSiteAdmin { [CmdletBinding(SupportsShouldProcess)] param( [Parameter(Mandatory=$true, ParameterSetName="Existing")] [Parameter(Mandatory=$true, ParameterSetName='SuperAdmin')] [Parameter(Mandatory=$true, ParameterSetName='Admin')] [Parameter(Mandatory=$true, ParameterSetName='Email')] [string]$name, [Parameter(Mandatory=$true, ParameterSetName="Existing")] [string]$ID, [Parameter(Mandatory=$true, ParameterSetName='SuperAdmin')] [Parameter(Mandatory=$true, ParameterSetName='Admin')] [Parameter(Mandatory=$true, ParameterSetName='Email')] [ValidateNotNull()] [System.Management.Automation.PSCredential]$Credentials, [Parameter(ParameterSetName='SuperAdmin')] [Parameter(ParameterSetName='Admin')] [switch]$ForcePasswordChange, [Parameter(Mandatory=$true, ParameterSetName='SuperAdmin')] [Parameter(Mandatory=$true, ParameterSetName='Admin')] [Parameter(Mandatory=$true, ParameterSetName='Email')] [string]$Email, [Parameter(Mandatory=$true, ParameterSetName="Existing")] [Parameter(Mandatory=$true, ParameterSetName='Admin')] [Parameter(Mandatory=$true, ParameterSetName='Email')] [ValidateSet('admin','readonly', IgnoreCase=$false)] [string]$Role, [Parameter(Mandatory=$true, ParameterSetName='SuperAdmin')] [boolean]$SuperAdmin, [Parameter(Mandatory=$true, ParameterSetName='Email')] [Switch]$EmailInvite, [Parameter(ParameterSetName='Email')] [switch]$SSO, [Parameter(ParameterSetName="Existing")] [Parameter(ParameterSetName='Admin')] [Parameter(ParameterSetName='Email')] [boolean]$AdoptDevices, [Parameter(ParameterSetName="Existing")] [Parameter(ParameterSetName='Admin')] [Parameter(ParameterSetName='Email')] [boolean]$PendingDevices, [Parameter(ParameterSetName="Existing")] [Parameter(ParameterSetName='Admin')] [Parameter(ParameterSetName='Email')] [boolean]$DashboardEdit, [Parameter(ParameterSetName="Existing")] [Parameter(ParameterSetName='Admin')] [Parameter(ParameterSetName='Email')] [boolean]$SystemStats, [Parameter(ParameterSetName="Existing")] [Parameter(ParameterSetName='Admin')] [Parameter(ParameterSetName='Email')] [boolean]$GlobalReadOnly ) function GlobalPermissions { $Permissions = [System.Collections.ArrayList]@() if ($PendingDevices -eq $true){ [void]$Permissions.add("API_STAT_DEVICE_ACCESS_SUPER_SITE_PENDING") } if ($DashboardEdit -eq $true){ [void]$Permissions.add("API_DASHBOARD_EDIT") } if ($SystemStats -eq $true){ [void]$Permissions.add("API_WIDGET_OS_STATS") } if ($GlobalReadOnly -eq $true){ [void]$Permissions.add("GLOBAL_READONLY_ADMIN_ACCESS") } $Permissions } $URI = "$controller/api/s/$name/cmd/sitemgr" # Username may only be upper case, lower case, numbers and underscore. Spaces are automatically stripped out as this is # the most likely error to be present. if ($Credentials){ [ValidatePattern("^[a-zA-Z0-9_]*$")][string]$Username=($Credentials.GetNetworkCredential().UserName).replace(' ','') [string]$Password=$Credentials.GetNetworkCredential().Password } $GlobalPermissions=GlobalPermissions write-verbose $GlobalPermissions.count if ($AdoptDevices -eq $true){ $SitePermissions = @('API_DEVICE_ADOPT') } else { $SitePermissions = @() } switch ($PsCmdlet.ParameterSetName){ {'Admin' -or 'SuperAdmin'} { write-verbose "ParameterSet $_ was used." # Set ParameterSet specific options. if ($ForcePasswordChange){ $PasswordChange=$true } else { $PasswordChange=$false } # The administrator role will always be 'readonly' when creating a SuperAdmin. if ($SuperAdmin -eq $true){ $Role = 'readonly' } #Create Admin $Params=@{ cmd = 'create-admin' email = $Email name = $Username requires_new_password = $PasswordChange role = $Role x_password = $Password permissions = $SitePermissions } $target=$username $command='create-admin' } 'Email' { write-verbose "ParameterSet $_ was used." if ($SSO){ $ForSSO = $true } else { $ForSSO = $false } $Params=@{ cmd = 'invite-admin' email = $Email for_sso = $ForSSO name = $Username role = $Role permissions = $SitePermissions super_site_permissions = $GlobalPermissions } $target=$username $command='invite-admin' } 'Existing' { write-verbose "ParameterSet $_ was used." $Params=@{ cmd = 'grant-admin' admin = $ID role = $Role permissions = $SitePermissions } $target=$ID $command='grant-admin' } default { write-verbose "No ParameterSet used. $_" } } # admin command $body = New-UnifiCommand $params write-verbose "Command parameters for admin role:" write-verbose $body if ($PSCmdlet.ShouldProcess($target,$command)){ $Response=Invoke-POSTRestAPICall -url $URI -payload $body } #Superadmin command -- The superadmin permissions are already part of the invite-admin command. if (($GlobalPermissions.count -ge 1) -AND ($PsCmdlet.ParameterSetName -ne 'Email')){ if ([string]::IsNullOrEmpty($ID)){ write-verbose "No admin ID found. Using value from previous controller response." $ID=$Response.data._id } $SuperParams=@{ cmd = 'grant-super-admin' admin = $ID role = 'nobody' permissions = $GlobalPermissions } $body = New-UnifiCommand $SuperParams write-verbose "Command parameters for superadmin role:" write-verbose $body if ($PSCmdlet.ShouldProcess($target,'grant-super-admin')){ $SAResponse=Invoke-POSTRestAPICall -url $URI -payload $body } } <# .SYNOPSIS Creates a new site administrator. .DESCRIPTION Creates a new site administrator. .PARAMETER Name Short name for the site. This is the 'name' value from the Get-UnifiSite command. .PARAMETER Credentials A PSCrendentials object containing the username and password. The password needs to be in plain text. .PARAMETER Email Email address for the new admin user. .PARAMETER Role Specify if the new account will be an 'admin' or 'readonly' account. .PARAMETER EmailInvite Specify that this user should be sent an email invite to manage the site rather than creating the credentials manually. .PARAMETER SSO Switch to specify that this account will have remote access through a Unifi SSO account. Without this switch, direct access to the controller will be needed. .PARAMETER SuperAdmin Specify that this account will be a SuperAdmin with access to all sites rather than limited to the site specified. .PARAMETER ForcePasswordChange Prompts for a new password upon initial logon. .PARAMETER AdoptDevices Allows for device adoptions. .PARAMETER PendingDevices Allows for viewing of pending devices. .PARAMETER DashboardEdit Allows for editing dashboard. .PARAMETER SystemStats Allows for viewing system statistics. .PARAMETER GlobalReadOnly Assigns readonly rights for all other sites. .INPUTS None. .OUTPUTS System.Object #> } |