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

Powershell 根据用户名输入变量断开RDS用户连接,powershell,powershell-4.0,Powershell,Powershell 4.0,我正在尝试创建一个脚本,该脚本可以强制RDS服务器场环境中的用户注销。用户可以登录到4个RDS服务器中的1个,我正在尝试这样做,以便您运行脚本,输入用户名,它将强制用户注销。到目前为止,我已经: import-module remotedesktop $user = read-host -prompt 'Enter Username you want to disconnect' $sid = Get-RDUserSession | Where-Object -filter {$_.UserNa

我正在尝试创建一个脚本,该脚本可以强制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
变量作为该项的输入。如果执行
写入输出$sid
,它将显示正确的
UnifiedSessionID
编号


我可能会完全错误地这样做,但我只需要一种方法在提示时根据用户名输入断开用户会话。

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

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

可能是
调用RDUserLogoff
-UnifiedSessionID
参数必须是字符串,而
$sid
不是
字符串


如果是这种情况,您必须将
$sid
转换为
字符串
,问题是您永远无法获得格式广泛的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
我可能完全用错了方法

事实上:

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

    • 永远不要将它们用于编程处理
  • 对于编程处理,请使用
    选择对象

    • 使用
      选择对象,…
      将多个特性提取为自定义对象
    • 使用
      Select Object-ExpandProperty
      提取单个属性的值

演示如何在您的案例中执行此操作。

这正是数据类型。对不起,我该如何将该数据类型转换为字符串?不管怎样,我只是在末尾添加了
| out string
,现在可以正常工作了。非常感谢你!很好听-很容易忘记,
PowerShell
cmdlet
通常接受并发出基于对象的实体。
Get Member
cmdlet
是您的朋友,因为它可以告诉您任何对象的
datatype
是什么,而您可以在特定情况下检索
Format-*
cmdlet生成的对象的底层数据,更好的方法是,当目的是对输出进行编程处理时,首先不要使用这些cmdlet。你应该在回答中说清楚。@mklement0:同意。你的回答解决了根本原因。但是,我认为我们都必须考虑到他的需求也可能需要格式化输出。如果我要改变我的答案,我想我会把这个问题/错误和他最初的(暗示的)要求放在一边:。我明白了,这是一个很好的信息。我两天前就开始在powershell里组装东西了