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

Disconnect RDS User Based On Username Input Variable

我正在尝试创建一个可以在 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 数字。

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

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

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

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

如果是这种情况,您必须将 $sid 转换为 string

问题是您永远无法获得全格式的 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

I could be doing this the wrong way altogether

确实:

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

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

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

向您展示了如何根据您的情况执行此操作。