Скрипт для выхода из системы конкретного отключенного пользователя через PS - PullRequest
0 голосов
/ 21 февраля 2019

В настоящее время я работаю над сценарием для определения отключенных сеансов 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" - это результат моих попытоквтиснуть слишком много в эту строку для Session ID?Или это состояние не является допустимым параметром?Или другой вопрос, который мне не хватает?Из того, что я могу понять, так как Государство не является ключом, вот где я сталкиваюсь с неприятностями, но я не уверен, как их решить.

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

Спасибо, Энди

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Предложение Тоби верно для сообщения об ошибке.Если вы хотите вывести сеанс 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] будет вторым по последнему элементу и так далее.Причина, по которой я выбрал отрицательные индексы, заключается в том, что иногда SESSIONNAME в выводе запроса содержит пробелы, в результате чего оператор -split создает массив с одним элементом меньше.Это позволит вам в будущем изменить переменную $State на другую, независимо от того, содержит ли SESSIONNAME какие-либо полезные данные.

Оператор -match совпадает с символом +,+ продолжается количество дней.Поскольку вы ищете как минимум один день простоя, это упрощает сопоставление с регулярным выражением.Это необходимо изменить, если вы когда-нибудь захотите сопоставить в простое меньше, чем за день.

Для получения информации о -match см. Для получения информации о -split см. about_Split

Для получения информации о -replace и -match см. about_Cararison_Operators

Для операторов в целом вы можете просмотреть about_Operators

0 голосов
/ 21 февраля 2019

Изменить

$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]

Вам нужно объединить несколько условий, используя логические операторы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...