通过PS

时间:2019-02-21 13:34:33

标签: powershell automation rdp logoff

我目前正在研究一个脚本,用于从整个域中的特定用户帐户中识别X天前断开的会话。

我们拥有一个可以在所有选定计算机上运行此脚本的工具,因此选择目标没有问题,因为在这种情况下本地主机就足够了。

但是,由于我是Powershell的新手,所以我在脚本中的一些元素上苦苦挣扎。

$userName = 'USERNAMEHERE'
$State = 'Disc'
$sessionId = ((quser /server:localhost | Where-Object { $_ -match $userName }{ $_ -match $State }{[datetime]$_."Idle Time" -le (Get-Date).AddDays(-1)})-split ' +')[3]
$sessionId
logoff $sessionId /server:localhost

我正在努力解决的问题是:

  1. 找不到一个接受参数“ $ _ -match $ State”的位置参数-这是我试图在会话ID上过多填充此行的结果吗?还是那个状态不是有效的参数?还是我缺少的另一个问题?据我所知,国家不是关键,所以这就是我遇到麻烦的地方,但是我不确定如何解决。

如果我要离开并且需要进行相应的调整,我也将不胜感激。

谢谢 安迪

2 个答案:

答案 0 :(得分:0)

更改

$sessionId = ((quser /server:localhost | Where-Object { $_ -match $userName }{ $_ -match $State }{[datetime]$_."Idle Time" -le (Get-Date).AddDays(-1)})-split ' +')[3]

进入

$sessionId = ((quser /server:localhost | Where-Object { $_ -match $userName -and $_ -match $State -and [datetime]$_."Idle Time" -le (Get-Date).AddDays(-1)})-split ' +')[3]

您需要使用logical operators组合多个条件。

答案 1 :(得分:0)

Toby的建议对于处理错误消息是正确的。如果要输出会话 ID ,则可以运行以下命令:

$userName = 'username'
$State = 'Disc'
$sessions = (quser /server:localhost).TrimStart() -replace "\s{2,}",","
$sessionIDs = $sessions | ForEach-Object {
    $SessionProperties = $_ -split ","  
    if ($SessionProperties[0] -eq $userName -and $SessionProperties[-3] -eq $state -and $SessionProperties[-2] -match "\+") { 
        $SessionProperties[-4]
    }
    }
$sessionIDs

TrimStart()方法从quser输出中删除了初始空格/缩进。

-replace运算符正在做一些格式化。它用逗号替换连续的空格。这只是一个自制的定界符,可以更好地访问数据。

我之所以选择遍历$sessions是因为有时同一用户可能有多个断开的会话。它永远不会发生,但Windows将是Windows。

$SessionProperties$sessions的每一行拆分为一个数组。逗号之间的每个部分字符串都是数组中的一个元素。为了访问数组的元素,我使用了各种索引号。 [0]是第一个元素,应始终为用户名。像[-4]这样的负索引从数组末尾开始倒计数。 [-1]表示数组的最后一个索引,而[-2]则是倒数第二个元素,依此类推。我选择负索引的原因是,有时quser输出的 SESSIONNAME 是空格,这使得-split运算符创建的数组少了一个元素。这样做可以使您将来将$State变量更改为 SESSIONNAME 是否包含任何有用的数据。

-match运算符与字符+匹配。 +处理天数。由于您要搜索至少一天的空闲时间,因此这使正则表达式匹配更加简单。如果您想在少于一天的空闲时间内进行匹配,则需要对此进行更改。

有关-match的信息,请参阅 有关-split的信息,请参见about_Split

有关-replace-match的信息,请参见about_Comparison_Operators

对于一般操作员,您可以细读about_Operators