Public/Set-User.ps1

<#
    .SYNOPSIS
    Updates a user.
 
    .DESCRIPTION
    Updates a user.
 
    If the result returns null, try the parameter "-Verbose" to get more details.
 
    .EXAMPLE
 
    .LINK
    https://github.com/erwindevreugd/PSDataConduIT
 
    .EXTERNALHELP PSDataConduIT-help.xml
#>

function Set-User {
    [CmdletBinding()]
    param
    (
        [Parameter(
            Position = 0,
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The name of the server where the DataConduIT service is running or localhost.')]
        [string]
        $Server = $Script:Server,

        [Parameter(
            Position = 1,
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The credentials used to authenticate the user to the DataConduIT service.')]
        [PSCredential]
        $Credential = $Script:Credential,

        [Parameter(
            Mandatory = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the id of the user to update.')]
        [int]
        $UserID,

        [ValidateLength(0, 64)]
        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new first name of the user.')]
        [string]
        $Firstname,

        [ValidateLength(0, 64)]
        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new last name of the user.')]
        [string]
        $Lastname,

        [ValidateLength(1, 64)]
        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new internal username of the user.')]
        [string]
        $LogonID,

        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new system permission group id of the user.')]
        [nullable[int]]
        $SystemPermissionGroupID,

        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new monitoring permission group id of the user.')]
        [nullable[int]]
        $MonitoringPermissionGroupID,

        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new card permission group id of the user.')]
        [nullable[int]]
        $CardPermissionGroupID,

        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new field permission id of the user.')]
        [nullable[int]]
        $FieldPermissionID,

        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new report permission group id of the user.')]
        [nullable[int]]
        $ReportPermissionGroupID,

        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new monitoring zone id of the user.')]
        [nullable[int]]
        $MonitoringZoneID,

        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new primary segment id of the user.')]
        [nullable[int]]
        $SegmentID,

        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Determines wheter the new user is enabled or disabled.')]
        [nullable[bool]]
        $Enabled = $true,

        [ValidateLength(0, 250)]
        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specifies the new note field for the user.')]
        [string]
        $Notes
    )

    begin {
        $currentUser = Get-CurrentUser -Server $Server -Credential $Credential
    }

    process {
        $query = "SELECT * FROM Lnl_User WHERE __CLASS='Lnl_User'"

        if ($UserID) {
            $query += " AND ID=$UserID"
        }

        LogQuery $query

        $parameters = @{
            ComputerName = $Server;
            Namespace    = $Script:OnGuardNamespace;
            Query        = $query
        }

        if ($Credential -ne $null) {
            $parameters.Add("Credential", $Credential)
        }

        if (($user = Get-WmiObject @parameters) -eq $null) {
            Write-Error -Message ("User id '$($UserID)' not found")
            return
        }

        if ($currentUser.UserID -eq $user.ID) {
            Write-Error -Message ("Cannot change the user account of the current user account '$($CurrentUser)'")
            return
        }

        $updateSet = @{}

        if ($Firstname -and $Firstname -ne $user.FirstName) {
            Write-Verbose -Message ("Updating firstname '$($user.FirstName)' to '$($Firstname)' on user '$($user.ID)'")
            $updateSet.Add("FirstName", $Firstname)
        }

        if ($Lastname -and $Lastname -ne $user.LastName) {
            Write-Verbose -Message ("Updating lastname '$($user.LastName)' to '$($Lastname)' on user '$($user.ID)'")
            $updateSet.Add("LastName", $Lastname)
        }

        if ($LogonID -and $LogonID -ne $user.LogonID) {
            Write-Verbose -Message ("Updating internal user name '$($user.LogonID)' to '$($LogonID)' on user '$($user.ID)'")
            $updateSet.Add("LogonID", $LogonID)
        }

        if ($SystemPermissionGroupID -and $SystemPermissionGroupID -ne $user.SystemPermissionGroupID) {
            Write-Verbose -Message ("Updating system permission group '$($user.SystemPermissionGroupID)' to '$($SystemPermissionGroupID)' on user '$($user.ID)'")
            $updateSet.Add("SystemPermissionGroupID", $SystemPermissionGroupID)
        }

        if ($MonitoringPermissionGroupID -and $MonitoringPermissionGroupID -ne $user.MonitoringPermissionGroupID) {
            Write-Verbose -Message ("Updating monitor permission group '$($user.MonitoringPermissionGroupID)' to '$($MonitoringPermissionGroupID)' on user '$($user.ID)'")
            $updateSet.Add("MonitoringPermissionGroupID", $MonitoringPermissionGroupID)
        }

        if ($CardPermissionGroupID -and $CardPermissionGroupID -ne $user.CardPermissionGroupID) {
            Write-Verbose -Message ("Updating card permission group '$($user.CardPermissionGroupID)' to '$($CardPermissionGroupID)' on user '$($user.ID)'")
            $updateSet.Add("CardPermissionGroupID", $CardPermissionGroupID)
        }

        if ($FieldPermissionID -and $FieldPermissionID -ne $user.FieldPermissionID) {
            Write-Verbose -Message ("Updating field permission '$($user.FieldPermissionID)' to '$($FieldPermissionID)' on user '$($user.ID)'")
            $updateSet.Add("FieldPermissionID", $FieldPermissionID)
        }

        if ($ReportPermissionGroupID -and $ReportPermissionGroupID -ne $user.ReportPermissionGroupID) {
            Write-Verbose -Message ("Updating report permission group '$($user.ReportPermissionGroupID)' to '$($ReportPermissionGroupID)' on user '$($user.ID)'")
            $updateSet.Add("ReportPermissionGroupID", $ReportPermissionGroupID)
        }

        if ($MonitoringZoneID -and $MonitoringZoneID -ne $user.MonitoringZoneID) {
            Write-Verbose -Message ("Updating monitoring zone '$($user.MonitoringZoneID)' to '$($MonitoringZoneID)' on user '$($user.ID)'")
            $updateSet.Add("MonitoringZoneID", $MonitoringZoneID)
        }

        if ($SegmentID -and $SegmentID -ne $user.PrimarySegmentID) {
            Write-Verbose -Message ("Updating primary segment '$($user.PrimarySegmentID)' to '$($SegmentID)' on user '$($user.ID)'")
            $updateSet.Add("PrimarySegmentID", $SegmentID)
        }

        if ($Enabled -and $Enabled -ne $user.Enabled) {
            Write-Verbose -Message ("Updating enabled state '$($user.Enabled)' to '$($Enabled)' on user '$($user.ID)'")
            $updateSet.Add("Enabled", $Enabled)
        }

        if ($Notes -and $Notes -ne $user.Notes) {
            Write-Verbose -Message ("Updating notes '$($user.Notes)' to '$($Notes)' on user '$($user.ID)'")
            $updateSet.Add("Notes", $Notes)
        }

        $user | Set-WmiInstance -Arguments $updateSet -PutType UpdateOnly |
            Select-Object -Property ID, @{L = 'UserID'; E = {$_.ID}} |
            Get-User
    }
}