根据用户名输入变量断开RDS用户

时间:2018-05-25 16:41:32

标签: powershell powershell-v4.0

我正在尝试创建一个可以强制在RDS服务器场环境中注销用户的脚本。用户可以登录4个RDS服务器中的1个,我正在尝试这样做以便您运行脚本,输入用户名并强制注销用户。到目前为止,我有:

import-module remotedesktop
$user = read-host -prompt 'Enter Username you want to disconnect'
$sid = Get-RDUserSession | Where-Object -filter {$_.UserName -eq $user} | format-wide -Property UnifiedSessionID
$server = Get-RDUserSession | Where-Object -filter {$_.UserName -eq $user} | format-wide -Property HostServer
Invoke-RDUserLogoff -HostServer "$server" -UnifiedSessionID $sid

在最后一行中唯一的问题是它不喜欢$sid变量作为该项的输入。如果我执行write-output $sid,则会显示正确的UnifiedSessionID号码。

我可能完全以错误的方式执行此操作,但我只需要在提示时根据用户输入断开用户会话。

3 个答案:

答案 0 :(得分:1)

问题是你永远不会使用格式范围的

获得UnifiedSessionID商店

使用select -ExpandProperty

import-module remotedesktop

$user = read-host -prompt 'Enter Username you want to disconnect'

$sid = Get-RDUserSession | Where-Object -filter {$_.UserName -eq $user} | select -ExpandProperty UnifiedSessionID

$server = Get-RDUserSession | Where-Object -filter {$_.UserName -eq $user} | select -ExpandProperty HostServer

Invoke-RDUserLogoff -HostServer "$server" -UnifiedSessionID $sid

答案 1 :(得分:1)

  

我可能完全以错误的方式做这件事

确实:

  • Format-* cmdlet仅用于生成输出以供显示

    • 从不将它们用于程序化处理
  • 对于程序化处理,请使用Select-Object

    • 使用Select-Object <prop1>, ...多个属性提取为自定义对象
    • 使用Select-Object -ExpandProperty <prop>提取单个属性

Frédéric Bonneau's helpful answer告诉您如何在您的情况下执行此操作。

答案 2 :(得分:-1)

$sid变量正在加载数据,其数据类型是管道中最后一个操作的数据类型,即format-wide。因此,$sid的数据类型可能类似于Microsoft.PowerShell.Commands.Internal.Format.FormatStartData

您可以在加载$sid | get-member后立即执行命令$sid进行验证。

-UnifiedSessionID的{​​{1}}参数可能必须是字符串,而Invoke-RDUserLogoff不是$sid

如果是这种情况,您必须将string投放到$sid