7

是否有一个 powershell 命令可以用来将“断开连接”的用户踢出服务器?一旦我知道踢单个用户的单行,我就可以编写脚本。

例如,我想踢掉下面对话框中看到的 8 个用户。

在此处输入图像描述

4

4 回答 4

8

我不能试试这个:

$pc = qwinsta /server:YourServerName | select-string "Disc" | select-string -notmatch "services"

if ($pc)
{
  $pc| % { 

  logoff ($_.tostring() -split ' +')[2] /server:YourServerName 

  }
}
于 2013-01-17T19:32:49.840 回答
5

在我看来,最简单的方法是使用你机器上已经存在的 logoff.exe。例如,在您的屏幕截图中注销第一个断开连接的用户:

logoff 3 /server:YOURSERVERNAME
于 2013-01-17T18:29:15.303 回答
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。我使用此脚本在自动过程尝试移动某些文件夹之前踢出用户。为我防止“文件正在使用”错误。另请注意,此脚本必须以管理员用户身份运行,否则您可能会在尝试注销某人时被拒绝访问。希望这可以帮助!

于 2016-03-07T16:30:21.483 回答
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
于 2014-09-29T17:38:11.737 回答