Public/Remove-LoggedOnUsers.TempPoint.ps1

function Remove-LoggedOnUsers
{
<#
    .SYNOPSIS
        Log off users with stale sessions
     
    .DESCRIPTION
        This function calls quser.exe to get a list of logged on users with stale or active sessions on the named computer and will subsequently log them off.
     
    .PARAMETER ComputerName
        Computer object to perform action on.
     
    .PARAMETER Credential
        Add the credential object or use (Get-Credential)
     
    .PARAMETER RemoteSession
        Include PSSession variable.
     
    .EXAMPLE
        PS C:\> Remove-LoggedOnUsers -ComputerName server1.example.com -Credential $Credential
     
    .EXAMPLE
        PS C:\> Remove-LoggedOnUsers -Session $session
     
    .NOTES
        THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND.
        THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS
        CODE REMAINS WITH THE USER.
#>

    
    [CmdletBinding(DefaultParameterSetName = 'ComputerParameterSet',
                ConfirmImpact = 'Medium',
                SupportsShouldProcess = $true)]
    param
    (
        [Parameter(ParameterSetName = 'ComputerParameterSet',
                 Mandatory = $true,
                 HelpMessage = 'Type the fully qualified domain name of the computer.')]
        [Alias('CN', 'MachineName', 'Computer')]
        [string]$ComputerName,
        [Parameter(ParameterSetName = 'ComputerParameterSet',
                 Mandatory = $true,
                 HelpMessage = 'Add the credential object or use (Get-Credential)')]
        [pscredential]$Credential,
        [Parameter(ParameterSetName = 'SessionParameterSet',
                 Mandatory = $true,
                 HelpMessage = 'Include PSSession variable.')]
        [System.Management.Automation.Runspaces.PSSession]$RemoteSession
    )
    
    switch ($PSCmdlet.ParameterSetName)
    {
        "ComputerParameterSet" {
            if ($pscmdlet.ShouldProcess($ComputerName))
            {
                $userinit = Invoke-Command -ComputerName $ComputerName -Credential $Credential -ScriptBlock { param ($ComputerName); ((quser /server $using:ComputerName) -replace '\s{2,}', ',' | ConvertFrom-Csv) } -ArgumentList $ComputerName
                $loggedonusers = @()
                foreach ($session in $userinit)
                {
                    $loggedonusers += $Session.UserName
                    if ($loggedonusers.Count -ge 1)
                    {
                        $loggedonusers.foreach({
                                $user = $_
                                Invoke-Command -ComputerName $ComputerName -Credential $Credential -ScriptBlock {
                                    param ($session,
                                        $ComputerName); logoff.exe $using:session.ID /server $using:ComputerName $user /V
                                } -ArgumentList $session, $ComputerName
                            })
                    }
                    
                }
            }
        }
        "SessionParameterSet" {
            if ($pscmdlet.ShouldProcess($RemoteSession.ComputerName))
            {
                $userinit = Invoke-Command -Session $RemoteSession -ScriptBlock { param ($ComputerName); ((quser /server $using:ComputerName) -replace '\s{2,}', ',' | ConvertFrom-Csv) } -ArgumentList $ComputerName
                $loggedonusers = @()
                foreach ($session in $userinit)
                {
                    $loggedonusers += $Session.UserName
                    if ($loggedonusers.Count -ge 1)
                    {
                        $loggedonusers.foreach({
                                $user = $_
                                Invoke-Command -Session $RemoteSession -ScriptBlock {
                                    param ($session,
                                        $ComputerName); logoff.exe $using:session.ID /server $using:ComputerName $user /V
                                } -ArgumentList $session, $ComputerName
                            })
                    }
                    
                }
            }
        }
    }
} #end Remove-LoggedOnUsers