Si necesitamos deslogear a todos los usuarios de una máquina remota, ya sea por inactividad, ya sea para aplicar cambios en sus perfiles o para instalar nuevo software, podemos ejecutar el siguiente script:
<#PSScriptInfo .VERSION 1.0 .GUID 947c787b-1e06-4937-8022-1d3d39f267b0 .AUTHOR Adam Bertram .COMPANYNAME Adam the Automator, LLC .COPYRIGHT .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES .PRIVATEDATA #>
<# .DESCRIPTION A simple script to remotely log off users from one or more remote computers. #>
[OutputType(‘void’)]
[CmdletBinding(SupportsShouldProcess)]
param
(
[Parameter()]
[ValidateNotNullOrEmpty()]
[string[]]$ComputerName,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$UserName
)
$ErrorActionPreference = ‘Stop’
if (-not $PSBoundParameters.ContainsKey(‘ComputerName’)) {
$ComputerName = ‘localhost’
}
foreach ($c in $ComputerName) {
## Find the user’s session ID
$compArgs = $null
if ($PSBoundParameters.ContainsKey(‘ComputerName’)) {
$compArgs = «/server:$c»
}
$whereFilter = { ‘*’ }
if ($PSBoundParameters.ContainsKey(‘UserName’)) {
$whereFilter = [scriptblock]::Create(«`$_ -match ‘$UserName'»)
}
if ($sessions = ((quser $compArgs | Where-Object $whereFilter))) {
$sessionIds = ($sessions -split ‘ +’)[2]
if ($PSCmdlet.ShouldProcess(«UserName: $UserName», ‘Logoff’)) {
$sessionIds | ForEach-Object {
logoff $_ $compArgs
}
}
} else {
Write-Verbose -Message ‘No users found matching criteria found.’
}
}
Que guardaremos como «Invoke-UserLogoff.ps1» , y en la ubicación recomendada «C:\Program Files\WindowsPowerShell\Scripts\Invoke-UserLogoff.ps1»
Para ejecutarlo en varias máquinas simultáneamente :
Invoke-UserLogoff.ps1 -ComputerName ip_cliente1, ip_cliente2, ip_cliente3, ip_cliente4
Si tenemos las direcciones ip de los equipos en un fichero :
$computers = Get-Content -Path C:\ip_clientes.txt
C:\Invoke-UserLogoff.ps1 -ComputerName $computers