【问题标题】:Disconnect RDS User Based On Username Input Variable根据用户名输入变量断开 RDS 用户
【发布时间】:2018-05-25 16:41:31
【问题描述】:

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

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

【问题讨论】:

标签: powershell powershell-4.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

【讨论】:

    【解决方案2】:

    我可能完全用错了方法

    确实:

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

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

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

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

    【讨论】:

    • 我明白了,这是很好的信息。 2 天前,我开始在 powershell 中拼凑一些东西
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 这正是数据类型。抱歉,我该如何将该数据类型转换为字符串?
    • 没关系,我只是在末尾添加了| out-string,现在它工作正常。非常感谢!
    • 很高兴听到 - 很容易忘记 PowerShell cmdlets 通常接受和发出 object-based 实体。 Get-Member cmdlet 是你的朋友,因为它可以告诉你 datatype 是什么对象
    • 虽然您可能能够检索Format-* cmdlet 生成的对象所依据的数据,但更好的方法是首先在以下情况下不使用这些 cmdlet目的是对输出进行程序化处理。您应该在回答中明确说明。
    • @mklement0:同意。您的回答解决了根本原因。但是,我认为我们都必须考虑到他的要求也可能需要格式化输出。如果我要改变我的答案,我想我会同时解决问题/错误和他原来的(隐含的)要求
    猜你喜欢
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 2015-03-26
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多