我是否可以使用powershell命令将“断开连接”的用户从服务器中踢出来?一旦我知道了单个用户的一行,我就可以编写脚本。
例如,我想在下面的对话框中看到8个用户。
答案 0 :(得分:8)
我无法尝试:
$pc = qwinsta /server:YourServerName | select-string "Disc" | select-string -notmatch "services"
if ($pc)
{
$pc| % {
logoff ($_.tostring() -split ' +')[2] /server:YourServerName
}
}
答案 1 :(得分:4)
在我看来,最简单的方法是使用你机器上已经存在的logoff.exe。例如,在屏幕截图中注销第一个断开连接的用户:
logoff 3 /server:YOURSERVERNAME
答案 2 :(得分:2)
这是一个很棒的脚本解决方案,可以远程或本地记录人员。我正在使用qwinsta获取会话信息并从给定输出中构建数组。这样就可以很容易地遍历每个条目并仅注销实际用户,而不是系统或RDP监听器本身,这通常只会抛出拒绝访问错误。
$serverName = "Name of server here OR localhost"
$sessions = qwinsta /server $serverName| ?{ $_ -notmatch '^ SESSIONNAME' } | %{
$item = "" | Select "Active", "SessionName", "Username", "Id", "State", "Type", "Device"
$item.Active = $_.Substring(0,1) -match '>'
$item.SessionName = $_.Substring(1,18).Trim()
$item.Username = $_.Substring(19,20).Trim()
$item.Id = $_.Substring(39,9).Trim()
$item.State = $_.Substring(48,8).Trim()
$item.Type = $_.Substring(56,12).Trim()
$item.Device = $_.Substring(68).Trim()
$item
}
foreach ($session in $sessions){
if ($session.Username -ne "" -or $session.Username.Length -gt 1){
logoff /server $serverName $session.Id
}
}
在此脚本的第一行中,如果在本地运行,则为$ serverName提供适当的值或localhost。在自动进程尝试移动某些文件夹之前,我使用此脚本来踢用户。为我防止“文件使用中”错误。另请注意,此脚本必须以管理员用户身份运行,否则您可能会被拒绝尝试将某人记录下来。希望这有帮助!
答案 3 :(得分:1)
你走了:
@echo off
(set STATE=Disconnected)
REM !! IMPORTANT set length in 4th from last line !!
FOR /f "Skip=1 tokens=3,4" %%i in ('qwinsta') do (
IF /I NOT "%%i"=="The" (
call :checkpath %%i "%%j"
)
)
::pause
GOTO :EOF
:checkpath
set id=%1
set STATUS=%~2
:: !! The last number in the next line needs to
:: be the length of the STATE string
SET root=%STATUS:~0,12%
IF /I NOT "%ROOT%"=="%STATE%" GOTO :EOF
@echo on
Session ID %ID% is %STATUS%. Logging off...
@echo off
logoff %ID% /server:YOURSERVERNAME