通过 PS 注销特定断开连接的用户的脚本
Script to Log Off Specific Disconnected User via PS
我目前正在编写一个脚本,用于从域中的特定用户帐户中识别 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
我遇到的问题是:
- 找不到接受参数“$_ -match $State”的位置参数 - 这是我试图在这一行中为会话 ID 塞入太多内容的结果吗?或者那个 State 不是一个有效的参数?或者我缺少的另一个问题?据我所知,由于 State 不是关键,所以这就是我 运行 遇到麻烦的地方,但我不确定如何解决它。
如果我偏离了方向并且需要相应地调整,我也很感激被告知这一点。
谢谢
安迪
改变
$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 组合多个条件。
Toby 的建议对于处理错误消息是正确的。如果要输出sessionID,可以运行如下:
$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 输出中删除初始 space/indent。
-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
我目前正在编写一个脚本,用于从域中的特定用户帐户中识别 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
我遇到的问题是:
- 找不到接受参数“$_ -match $State”的位置参数 - 这是我试图在这一行中为会话 ID 塞入太多内容的结果吗?或者那个 State 不是一个有效的参数?或者我缺少的另一个问题?据我所知,由于 State 不是关键,所以这就是我 运行 遇到麻烦的地方,但我不确定如何解决它。
如果我偏离了方向并且需要相应地调整,我也很感激被告知这一点。
谢谢 安迪
改变
$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 组合多个条件。
Toby 的建议对于处理错误消息是正确的。如果要输出sessionID,可以运行如下:
$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 输出中删除初始 space/indent。
-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