0

我目前正在编写一个脚本,以从整个域中的特定用户帐户识别断开连接的会话 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 塞进太多内容的结果吗?或者那个 State 不是一个有效的参数?还是我缺少的另一个问题?据我所知,由于状态不是关键,所以这是我遇到麻烦的地方,但我不知道如何解决它。

如果我已经离开并需要相应地调整,我也将很感激被告知这一点。

谢谢安迪

4

2 回答 2

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]

您需要使用逻辑运算符组合多个条件。

于 2019-02-21T13:56:52.067 回答
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正在匹配 character 。+收益天+数。由于您正在搜索至少一天前的空闲时间,这使得正则表达式匹配更简单。如果您想在少于一天的空闲时间进行匹配,则需要更改此设置。

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

有关-replaceand的信息-match,请参阅about_Comparison_Operators

对于一般的运算符,您可以仔细阅读about_Operators

于 2019-02-21T15:16:27.693 回答