PowerShell - управление сессиями пользователей - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть сценарий PowerShell, который регистрирует пользователей со временем IDLE, превышающим 1 час:

#Force script to run.
Set-ExecutionPolicy Unrestricted -force
#Check connected users and save output.
quser|out-file C:\Users\Administrator\Documents\disconectAgora\quser.txt
#Read output with logged in users.
$file = Get-Content C:\Users\Administrator\Documents\disconectAgora\quser.txt

#Obtain IDLE time by using patters.
$pattern = "Disc(.*?)11"
#Obtaons session ID by using patther.
$pattern2 = "adminagora(.*?)Disc"


#Execute query using above patterns.
$result = [regex]::Match($file,$pattern).Groups[1].Value
$result2 = [regex]::Match($file,$pattern2).Groups[1].Value

#Trim file and save both session id and username.

$result = $result -replace(' ','')
$result |out-file C:\Users\Administrator\Documents\disconectAgora\getDCUser.txt

$result2 = $result2 -replace(' ','')
$result2 |out-file C:\Users\Administrator\Documents\disconectAgora\getDCUserID.txt

#If IDLE time is greater than 1 hour user is disconnected.
if ($result -gt '1:00'){    
    logoff $result2
    }
else{
    write-host "No users with IDLE time greater than 1 hour found.No users to be logged off."
    }

Что я хочу сделать, это проверить, запущен процесс cmd или нет, поэтому пользователь может остатьсявошел в систему, пока этот процесс не завершился.

Я подумал, что, возможно, запустив эту команду get-process | where-object {$_.mainwindowhandle -ne 0} | select-object name, mainwindowtitle и используя регулярное выражение для получения только процессов cmd, он может добиться цели, но это очень примитивный подход.

Если вы, ребята, имеете какое-либо представление о том, как это сделать, пожалуйста, дайте мне знать.

По запросу, вот вывод команды quser:

enter image description here

Короче говоря

Мне нужен способ узнать, выполняется ли что-то с помощью CMD , кроме проверки использования ЦП:

enter image description here

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Последующее немного упрощено и возвращает пользователей, кроме adminagora, которые отключили сеансы в течение часа

(& quser) -split "`n" | ? {$_ -match "(?<!adminagora).*?Disc\s+\d:\d{2}"}

разбивка

(& quser) -split "`n"  -- Executes quser 
                          Splits each line on newline to pass through the pipeline
? {$_ -match           -- Where the current item matches the regex
(?<!adminagora)        -- Use a negative lookbehind to exclude adminagora
.*?Disc                -- match any characters as few times as possible up until Disc. 
\s+\d:\d{2}            -- match any space character followed by
                       -- a digit, a colon and two digits
0 голосов
/ 27 декабря 2018

Чтобы получить процессы cmd, просто запустите get-process -name cmd

Чтобы найти любые дочерние процессы в cmd, вы можете использовать что-то вроде этого:

Get-WmiObject win32_process | where {$_.ParentProcessId -eq ((Get-Process -name cmd).id)}

Upd.Как заметил @LievenKeersmaekers, это не может работать в случае одновременного запуска нескольких cmds.Фиксированная версия:

(Get-Process -name cmd).id | foreach { Get-WmiObject win32_process -filter "ParentProcessId='$_'"}
...