注销 根据 IDLE 时间断开连接的用户会话
我编写了一个 PS 脚本来查找在远程服务器上具有断开连接的 RDP 会话的任何用户,并且我得到了用户 @Theo 的帮助来完成它。
现在添加到我的脚本中,如果空闲时间超过 1 天,我想注销已断开连接的用户。
目标有很大帮助
这对我实现代码的
## Clear Host Console
Clear-Host
## Define Variable for Server Count
$z = 0
##Set Default Script Location
Set-Location $PSScriptRoot
## Provide List of Servers to Check for the Disconnected user session
$Servers = Get-Content ".\Servers\DA_Servers.txt"
## Get Servers Count
$count = $Servers.count
## Define Date for the Out file
$dt = Get-Date -Format yyyyMMdd
$Date = Get-Date
## Define Path for the Out File
$exportFile = ".\Out\RDP_DisConnected_Users.csv"
## Create a Function to list all user sessions from Remote Servers
function Get-RemoteUsers {
## Loop through each server to find the User session
foreach ($Computer in $Servers) {
#initiate counter for showing progress
$z = $z + 1
# Start writing progress
Write-Progress -Activity "Processing Server: $z out of $count servers." -Status " Progress" -PercentComplete ($z/$Servers.count*100)
$obj = "" | Select-Object @{Name = 'ServerName'; Expression = {$Computer}}, UserName, ID, State, IdleTime, LogonTime
try {
quser /server:$Computer 2>&1 | Select-Object -Skip 1 | ForEach-Object {
$items = $_.Trim() -split '\s{2,}'
$obj.UserName = $items[0]
# If session is disconnected different fields will be selected
if ($items[2] -like 'Disc*')
{
$obj.Id = $items[1]
$obj.State = $items[2]
$obj.IdleTime = $items[3]
$obj.LogonTime = $items[4..($items.GetUpperBound(0))] -join ' '
}
else {
$obj.Id = $items[1]
$obj.State = $items[2]
$obj.IdleTime = $items[3]
$obj.LogonTime = $items[4]
}
# reformat the IdleTime property
$obj.IdleTime = '{0} days, {1} hours, {2} minutes' -f ([int[]]([regex]'^(?:(\d+)\+)?(\d+):(\d+)').Match($obj.IdleTime).Groups[1..3].Value | ForEach-Object { $_ })
# output the object
$obj
}
}
catch {
#$obj.Error = $_.Exception.Message
#$obj
}
}
}
## Filter the results to find out the disconnected users
$allRemoteUsers = Get-RemoteUsers $Servers
$disconnectedUsers = $allRemoteUsers | Where-Object {$_.State -like 'disc*' }
if (@($disconnectedUsers).Count) {
#output on screen
$disconnectedUsers | Format-Table -AutoSize
# output to Csv
$disconnectedUsers | Export-Csv "$exportFile" -NoTypeInformation
}
else {
Write-Host "No disconnected users found" -BackgroundColor Red
}
I have written a PS script to find any user who has a disconnected RDP session on remote servers and I got help from user @Theo to get it finished.
Now add on to my script, I want to Log off the disconnected users if the IDLE time is more than 1 day.
This will help us a lot for me to achieve the things
CODE
## Clear Host Console
Clear-Host
## Define Variable for Server Count
$z = 0
##Set Default Script Location
Set-Location $PSScriptRoot
## Provide List of Servers to Check for the Disconnected user session
$Servers = Get-Content ".\Servers\DA_Servers.txt"
## Get Servers Count
$count = $Servers.count
## Define Date for the Out file
$dt = Get-Date -Format yyyyMMdd
$Date = Get-Date
## Define Path for the Out File
$exportFile = ".\Out\RDP_DisConnected_Users.csv"
## Create a Function to list all user sessions from Remote Servers
function Get-RemoteUsers {
## Loop through each server to find the User session
foreach ($Computer in $Servers) {
#initiate counter for showing progress
$z = $z + 1
# Start writing progress
Write-Progress -Activity "Processing Server: $z out of $count servers." -Status " Progress" -PercentComplete ($z/$Servers.count*100)
$obj = "" | Select-Object @{Name = 'ServerName'; Expression = {$Computer}}, UserName, ID, State, IdleTime, LogonTime
try {
quser /server:$Computer 2>&1 | Select-Object -Skip 1 | ForEach-Object {
$items = $_.Trim() -split '\s{2,}'
$obj.UserName = $items[0]
# If session is disconnected different fields will be selected
if ($items[2] -like 'Disc*')
{
$obj.Id = $items[1]
$obj.State = $items[2]
$obj.IdleTime = $items[3]
$obj.LogonTime = $items[4..($items.GetUpperBound(0))] -join ' '
}
else {
$obj.Id = $items[1]
$obj.State = $items[2]
$obj.IdleTime = $items[3]
$obj.LogonTime = $items[4]
}
# reformat the IdleTime property
$obj.IdleTime = '{0} days, {1} hours, {2} minutes' -f ([int[]]([regex]'^(?:(\d+)\+)?(\d+):(\d+)').Match($obj.IdleTime).Groups[1..3].Value | ForEach-Object { $_ })
# output the object
$obj
}
}
catch {
#$obj.Error = $_.Exception.Message
#$obj
}
}
}
## Filter the results to find out the disconnected users
$allRemoteUsers = Get-RemoteUsers $Servers
$disconnectedUsers = $allRemoteUsers | Where-Object {$_.State -like 'disc*' }
if (@($disconnectedUsers).Count) {
#output on screen
$disconnectedUsers | Format-Table -AutoSize
# output to Csv
$disconnectedUsers | Export-Csv "$exportFile" -NoTypeInformation
}
else {
Write-Host "No disconnected users found" -BackgroundColor Red
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
然后,您需要将
.IdleTime
属性反转回整数,以确定用户是否闲置超过 1 天:要将其添加到现有代码中,只需更新最终的if (..){..} else{..} 包括:
You then need to reverse the
.IdleTime
property back to integer numbers to determine if the user has been idle for more than 1 day:To add that to your existing code, just update the final
if(..){..} else{..}
to include that: