Public/Remove-LoggedOnUsers.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 |