我正在尝试制定一个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.在自动进程尝试移动某些文件夹之前,我使用此脚本来踢用户.为我防止"文件使用中"错误.另请注意,此脚本必须以管理员用户身份运行,否则您可能会被拒绝尝试将某人记录下来.希望这可以帮助!
这是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)
您可以使用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身份运行。
| 归档时间: |
|
| 查看次数: |
141530 次 |
| 最近记录: |