[英]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
我正在努力解決的問題是:
如果我的路還很遙遠,需要進行相應的調整,我也將不勝感激。
謝謝安迪
更改
$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]
您需要使用邏輯運算符組合多個條件。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.