我目前正在开发一个脚本,用于从域中的特定用户帐户中识别断开连接的会话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
我正在努力解决的问题是:
如果我离开并需要相应调整,我也很感激被告知这一点。
谢谢安迪
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
运算符创建一个少一个元素的数组。无论SESSIONNAME是否包含任何有用的数据,这样做都可以让您将来的$State
变量更改为其他变量。
-match
运算符匹配字符+
。 +
继续进行天数。由于您正在搜索至少一天的空闲时间,这使得正则表达式匹配更简单。如果您想在不到一天的空闲时间内进行匹配,则需要进行更改。
有关-match
的信息,请参阅有关-split
的信息,请参阅about_Split
有关-replace
和-match
的信息,请参阅about_Comparison_Operators
对于一般的操作员,您可以仔细阅读about_Operators
更改
$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组合多个条件。