Лучший отвечающий
Ручной ввод и запуск через планировщик отличаются. Баг в powershell?

Вопрос
-
Наш офис работает на удаленном столе на иностранном хостинге. Windows server 12 R2 Есть ~20 пользователей. Некоторым из них нужно запретить заходить на удаленку из других мест. Для этого я хочу использовать скрипт
$localnet = "x.x.x.x" $lastevent = Get-EventLog Security -Message '*username*адрес:*.*.*.*' -Newest 1 $IP = $lastevent.message.substring($lastevent.message.indexof("Сетевой адрес:")+15,$lastevent.message.indexof("Порт:")-$lastevent.message.indexof("Сетевой адрес:")-18) $IDbyName = ((query session username)[1] -split '\s+')[3] if ($IDbyName -notlike $null) {if ($IP -notlike $localnet) {logoff $IDbyName}}
В процессе тестирования я перепробовал множество вариантов и сам код намного уменьшился. Ручной ввод команд в консоль дает 100% корректный результат - система выкидывает username который зашел не с $localnet, а с офиса пускает.
Проблема начинается с автоматизацией. Я создал в планировщик задачу триггер, который включает данный скрипт. Условием ставил самые разные события - от фильтрации событий до разблокировки рабочей станции. Отмучился несколько дней с дебагом. Наконец понял в чем проблема. Она не в коде и не в условии! Вот как всё выглядит
1) Копирую вручную скрипт в консоль - оставляет с разрешенного IP, выкидывает с других (это правильно)
2) Запускаю тот же скрипт через сам планировщик - выкидывает независимо от IP.
Проверял условия перед и после выполнения. Обратите внимание, в ручном режиме $ip -notlike $localnet выдает false, НО В РЕЖИМЕ ПЛАНИРОВЩИКА LOGOFF СРАБАТЫВАЕТ! Похоже какой-то баг с проверкой условий. Что делать?
PS C:\Windows\system32> $localnet = "x.x.x.x" PS C:\Windows\system32> PS C:\Windows\system32> $lastevent = Get-EventLog Security -Message '*username*адрес:*.*.*.*' -Newest 1 PS C:\Windows\system32> $IP = $lastevent.message.substring($lastevent.message.indexof("Сетевой адрес:")+15,$lastevent.me ssage.indexof("Порт:")-$lastevent.message.indexof("Сетевой адрес:")-18) PS C:\Windows\system32> $IDbyName = ((query session username)[1] -split '\s+')[3] PS C:\Windows\system32> if ($IDbyName -notlike $null) {if ($IP -notlike $localnet) {logoff $IDbyName}} PS C:\Windows\system32> $IDbyName -notlike $null True PS C:\Windows\system32> $ip -notlike $localnet False
Каждая отдельная строка выдает правильное событе, адрес и айди юзера.
По разработке скрипта я сделал платный запросом в техническую поддержку нашего хостинга, уже больше недели нет ответа. В процессе "паралельной" разработки я им выдавал свой код, за который они благодарили и сообщали, его тестируют на их тестовом серваке. Похоже даже они не могут справится...
- Изменено ArsenCool 22 августа 2018 г. 8:02
- Изменен тип Vector BCOModerator 25 августа 2018 г. 6:50 это вопио
22 августа 2018 г. 7:58
Ответы
-
PS C:\Windows\system32> PowerShell -File "C:\Program Files\Scripts\TEST.ps1"
Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\Scripts\TEST.ps1:5 знак:1
+ $IP = $lastevent.message.substring($lastevent.message.indexof("РЎРчС'РчР?Р?Р№ Р° ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Не существуют сеансы для username
Не удается индексировать в массив NULL.
C:\Program Files\Scripts\TEST.ps1:6 знак:1
+ $IDbyName = ((query session $username)[1] -split '\s+')[3]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
------------Ну и как мне запустить с кириллицей? Если никак, то как по другому вытянуть IP? Он же может находится в разных позициях зависимо от других параметров. Я понимаю, что вы хотите впарить мне модуль, но эта же проблема останется. Нужно найти обход и написать разрабам о баге (видел тему недавно)
начинали вы с того что проблема в планировщике а уже выяснилось что в кодировке (что не баг в принципето). Впарить вам никто, ничего не пытается, просто предлагают альтернативно рабочие варианты (без бубна).
для того что бы ваш скрипт отработал ему нужно сменить кодировку и пересохранить в UTF8
вы к слову, сервер давно обновляли? posh у вас часом не второй версии? если второй, то эмнип проблему с кодировками поправили в 4 версии, а последняя версия или 5 или 6...
The opinion expressed by me is not an official position of Microsoft
- Изменено Vector BCOModerator 23 августа 2018 г. 6:12
- Предложено в качестве ответа Vector BCOModerator 25 августа 2018 г. 6:50
- Помечено в качестве ответа Vector BCOModerator 25 августа 2018 г. 6:50
23 августа 2018 г. 5:44Модератор
Все ответы
-
Добрый день,
Попробуйте отследить значение IP (вывести в файл) при запуске из планировщика
22 августа 2018 г. 8:34 -
а почему на стороне хостинга не настроить firewall и просто пускать тех кто пришел из вашей сети?
и еще одно зачем вам шедуллер если есть логон скрипты?
The opinion expressed by me is not an official position of Microsoft
- Изменено Vector BCOModerator 22 августа 2018 г. 10:16
22 августа 2018 г. 10:13Модератор -
Так настроить надо только конкретных пользователей. Всех нельзя заблокировать. Плюс магазины в разных городах тоже пропишу, как они получат статику. Я пытался настроить через правила фаерволла конкретным пользователям, но винда не разрешила
- "и еще одно зачем вам шедуллер если есть логон скрипты"
Так я так и делал. Изначально я перепробовал все варианты автозапуска. Некоторые не срабатывали, некоторые срабатывали через ~5 минут. Пока я не понял, что большая проблема с его выполнением, а не запуском.
22 августа 2018 г. 12:29 -
Посмотрите это обсуждение https://social.technet.microsoft.com/Forums/Azure/ru-RU/c30ff8a3-07d9-4416-a3e3-ff9de99901a9/1055109110891082107210901100?forum=sharedru
The opinion expressed by me is not an official position of Microsoft
22 августа 2018 г. 12:52Модератор -
Просмотрел варианты по вашей ссылке. Не все подходит, т.к:
1) Сервак в Германии, не локальный.
2) Пользователи в разных городах.
Задача в том, чтобы рядовым юзерам имеющим статический IP можно было заходить только с рабочего места. С дому нельзя. Админам/боссам/избранным можно. Вариант с доменом и прокси в данный момент не рабочий, т.к. нет ни того ни другого.
22 августа 2018 г. 15:20 -
Добрый день,
Попробуйте отследить значение IP (вывести в файл) при запуске из планировщика
Только что доделал скрипт. Результат сверхстранный...
Пошагово
1) Захожу тестовым пользователем и прописываю команды ручками в консоль - всё корректно
Запись в файле
22 серпня 2018 р. 18:03:59 Сессия RDP завершена USER: username IP: x.x.x.103
2) Делаю через планировщик заданий - абсолютный бред
22 серпня 2018 р. 18:21:41 Сессия RDP завершена USER: username IP:
В логах IP пустой, но в консоли я сразу же вытягиваю событие руками и получаю правильный IP...
У меня начали закрадываться мысли о неправильной кодировке. Возможно планировщик заданий не переваривает кириллицу?? Это баг или известная проблема?
- Изменено ArsenCool 22 августа 2018 г. 15:29
22 августа 2018 г. 15:28 -
Добрый день,
Попробуйте отследить значение IP (вывести в файл) при запуске из планировщика
Только что доделал скрипт. Результат сверхстранный...
Пошагово
1) Захожу тестовым пользователем и прописываю команды ручками в консоль - всё корректно
Запись в файле
22 серпня 2018 р. 18:03:59 Сессия RDP завершена USER: username IP: x.x.x.103
2) Делаю через планировщик заданий - абсолютный бред
22 серпня 2018 р. 18:21:41 Сессия RDP завершена USER: username IP:
В логах IP пустой, но в консоли я сразу же вытягиваю событие руками и получаю правильный IP...
У меня начали закрадываться мысли о неправильной кодировке. Возможно планировщик заданий не переваривает кириллицу?? Это баг или известная проблема?
Как вы выполняете задачу?The opinion expressed by me is not an official position of Microsoft
22 августа 2018 г. 15:42Модератор -
Чтобы не мучаться с парсингом EventLog,есть прекрасный модуль - https://github.com/imseandavis/PSTerminalServices, особенно, когда пользователей будет не один.
PS > Get-TSSession Server SessionID State IPAddress ClientName WindowStationName UserName ------ --------- ----- --------- ---------- ----------------- -------- localhost 0 Disconnected Services localhost 1 Connected Console localhost 2 Active 11.11.11.11 ABCZABCBQQ RDP-Tcp#37 AV\test localhost 65536 Listening RDP-Tcp
И производим фильтрацию:
Get-TSSession -UserName test | ? {$_.IPAddress -notlike "11.11.11.11"} | Stop-TSSession -Force
- Предложено в качестве ответа Vector BCOModerator 25 августа 2018 г. 6:50
- Помечено в качестве ответа Vector BCOModerator 25 августа 2018 г. 6:50
- Снята пометка об ответе ArsenCool 27 августа 2018 г. 12:52
- Отменено предложение в качестве ответа ArsenCool 27 августа 2018 г. 12:52
22 августа 2018 г. 16:24Отвечающий -
Почему отображаемая консоль понимает кириллицу, а фоновое выполнение нет? Если что, я запускал консоль для тестирования именно вводом слова "powershell". По факту, и руками и автоматикой запускается тот же самый интерпретатор, но каким-то образом автоматика багованная
22 августа 2018 г. 16:49 -
Вы пробовали не построчно скрипт копировать в консоль, а выполнять его именно той командой которая у вас зипухнута в планировщик?
А так то Kazun выше предложил решение
The opinion expressed by me is not an official position of Microsoft
- Изменено Vector BCOModerator 22 августа 2018 г. 16:53
22 августа 2018 г. 16:52Модератор -
PS C:\Windows\system32> PowerShell -File "C:\Program Files\Scripts\TEST.ps1"
Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\Scripts\TEST.ps1:5 знак:1
+ $IP = $lastevent.message.substring($lastevent.message.indexof("РЎРчС'РчР?Р?Р№ Р° ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Не существуют сеансы для username
Не удается индексировать в массив NULL.
C:\Program Files\Scripts\TEST.ps1:6 знак:1
+ $IDbyName = ((query session $username)[1] -split '\s+')[3]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
------------Ну и как мне запустить с кириллицей? Если никак, то как по другому вытянуть IP? Он же может находится в разных позициях зависимо от других параметров. Я понимаю, что вы хотите впарить мне модуль, но эта же проблема останется. Нужно найти обход и написать разрабам о баге (видел тему недавно)
23 августа 2018 г. 5:25 -
PS C:\Windows\system32> PowerShell -File "C:\Program Files\Scripts\TEST.ps1"
Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\Scripts\TEST.ps1:5 знак:1
+ $IP = $lastevent.message.substring($lastevent.message.indexof("РЎРчС'РчР?Р?Р№ Р° ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Не существуют сеансы для username
Не удается индексировать в массив NULL.
C:\Program Files\Scripts\TEST.ps1:6 знак:1
+ $IDbyName = ((query session $username)[1] -split '\s+')[3]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
------------Ну и как мне запустить с кириллицей? Если никак, то как по другому вытянуть IP? Он же может находится в разных позициях зависимо от других параметров. Я понимаю, что вы хотите впарить мне модуль, но эта же проблема останется. Нужно найти обход и написать разрабам о баге (видел тему недавно)
начинали вы с того что проблема в планировщике а уже выяснилось что в кодировке (что не баг в принципето). Впарить вам никто, ничего не пытается, просто предлагают альтернативно рабочие варианты (без бубна).
для того что бы ваш скрипт отработал ему нужно сменить кодировку и пересохранить в UTF8
вы к слову, сервер давно обновляли? posh у вас часом не второй версии? если второй, то эмнип проблему с кодировками поправили в 4 версии, а последняя версия или 5 или 6...
The opinion expressed by me is not an official position of Microsoft
- Изменено Vector BCOModerator 23 августа 2018 г. 6:12
- Предложено в качестве ответа Vector BCOModerator 25 августа 2018 г. 6:50
- Помечено в качестве ответа Vector BCOModerator 25 августа 2018 г. 6:50
23 августа 2018 г. 5:44Модератор -
PS C:\Windows\system32> PowerShell -File "C:\Program Files\Scripts\TEST.ps1"
Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\Scripts\TEST.ps1:5 знак:1
+ $IP = $lastevent.message.substring($lastevent.message.indexof("РЎРчС'РчР?Р?Р№ Р° ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Не существуют сеансы для username
Не удается индексировать в массив NULL.
C:\Program Files\Scripts\TEST.ps1:6 знак:1
+ $IDbyName = ((query session $username)[1] -split '\s+')[3]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
------------Ну и как мне запустить с кириллицей? Если никак, то как по другому вытянуть IP? Он же может находится в разных позициях зависимо от других параметров. Я понимаю, что вы хотите впарить мне модуль, но эта же проблема останется. Нужно найти обход и написать разрабам о баге (видел тему недавно)
начинали вы с того что проблема в планировщике а уже выяснилось что в кодировке (что не баг в принципето). Впарить вам никто, ничего не пытается, просто предлагают альтернативно рабочие варианты (без бубна).
для того что бы ваш скрипт отработал ему нужно сменить кодировку и пересохранить в UTF8
вы к слову, сервер давно обновляли? posh у вас часом не второй версии? если второй, то эмнип проблему с кодировками поправили в 4 версии, а последняя версия или 5 или 6...
The opinion expressed by me is not an official position of Microsoft
27 августа 2018 г. 12:53