Powershell注销远程会话

jla*_*oix 29 powershell rdp

我正在尝试制定一个Powershell命令来远程注销用户.我们有一个终端服务器,程序非常不稳定,有时会锁定会话.我们必须远程注销用户,但我正在尝试编写一个Powershell语句,该语句将注销运行该脚本的人员.我用Google搜索,发现了这个命令:

Invoke-Command -ComputerName MyServer -Command {shutdown -l}
Run Code Online (Sandbox Code Playgroud)

但是,该命令返回"不正确的功能".我可以在括号中成功运行其他命令,例如Get-Process.

我的想法是让我把它放到一个脚本中,用户可以运行该脚本将自己从服务器上注销(因为当它锁定时,它们无法访问开始菜单或ALT + CTRL + END通过GUI完成它).

流程将是这样的:Bob通过RDP登录MyServer,但他的会话冻结了.在他的本地桌面上,他可以运行MyScript(包含类似于上面的命令),这将在MyServer上注销他的会话.

Ans*_*ers 45

也许令人惊讶的是,您可以使用该logoff命令注销用户.

C:\> logoff /?
Terminates a session.

LOGOFF [sessionname | sessionid] [/SERVER:servername] [/V] [/VM]

  sessionname         The name of the session.
  sessionid           The ID of the session.
  /SERVER:servername  Specifies the Remote Desktop server containing the user
                      session to log off (default is current).
  /V                  Displays information about the actions performed.
  /VM                 Logs off a session on server or within virtual machine.
                      The unique ID of the session needs to be specified.
Run Code Online (Sandbox Code Playgroud)

可以使用qwinsta(query session)或quser(query user)命令确定会话ID (请参阅此处):

$server   = 'MyServer'
$username = $env:USERNAME

$session = ((quser /server:$server | ? { $_ -match $username }) -split ' +')[2]

logoff $session /server:$server
Run Code Online (Sandbox Code Playgroud)


use*_*867 12

添加普通DOS命令,如果有人如此倾向.是的,这仍适用于Win 8和Server 2008 + Server 2012.

Query session /server:Server100
Run Code Online (Sandbox Code Playgroud)

将返回:

SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
rdp-tcp#0         Bob                       3  Active  rdpwd
rdp-tcp#5         Jim                       9  Active  rdpwd
rdp-tcp                                 65536  Listen
Run Code Online (Sandbox Code Playgroud)

要注销会话,请使用:

Reset session 3 /server:Server100
Run Code Online (Sandbox Code Playgroud)


Jas*_*ski 12

这是一个很棒的脚本解决方案,可以远程或本地记录人员.我正在使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

在此脚本的第一行中,如果在本地运行,则为$ serverName指定适当的值或localhost.在自动进程尝试移动某些文件夹之前,我使用此脚本来踢用户.为我防止"文件使用中"错误.另请注意,此脚本必须以管理员用户身份运行,否则您可能会被拒绝尝试将某人记录下来.希望这可以帮助!

  • 此解决方案非常有效,允许对几乎任何条件进行过滤,例如部分用户名匹配或仅断开会话.您可以将整个事物包装在另一个foreach循环中,以便针对多个服务器运行. (2认同)

Jos*_*non 7

这是oldschool并且早于PowerShell,但我使用qwinsta/rwinsta组合为YEARS远程注销陈旧的RDP会话.它内置于至少Windows XP和前进(可能更早)

确定会话ID:

qwinsta /SERVER:<NAME>
Run Code Online (Sandbox Code Playgroud)

删除有问题的会话:

rwinsta <SESSION_ID> /SERVER:<NAME>
Run Code Online (Sandbox Code Playgroud)


Gau*_*uss 5

您可以使用Invoke-RDUserLogoff

注销特定组织单位的Active Directory用户的示例:

$users = Get-ADUser -filter * -SearchBase "ou=YOUR_OU_NAME,dc=contoso,dc=com"

Get-RDUserSession | where { $users.sAMAccountName -contains $_.UserName } | % { $_ | Invoke-RDUserLogoff -Force }
Run Code Online (Sandbox Code Playgroud)

在管道末端,如果您尝试仅使用foreach(%),它将仅注销一个用户。但是使用foreach和pipe的这种组合:

| %{$ _ | 命令

将按预期工作。

附言 以Adm身份运行。

  • 这很棒,但是似乎仅限于Windows Server 2012 R2 / Windows 8.1? (3认同)