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

  • Вопрос

  • Наш офис работает на удаленном столе на иностранном хостинге. 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


    23 августа 2018 г. 5:44
    Модератор

Все ответы

  • Добрый день,

    Попробуйте отследить значение IP (вывести в файл) при запуске из планировщика

    22 августа 2018 г. 8:34
  • а почему на стороне хостинга не настроить firewall и просто пускать тех кто пришел из вашей сети?

    и еще одно зачем вам шедуллер если есть логон скрипты?


    The opinion expressed by me is not an official position of Microsoft

    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...

    У меня начали закрадываться мысли о неправильной кодировке. Возможно планировщик заданий не переваривает кириллицу?? Это баг или известная проблема?

    У вас фильтр который выгребает адрес, включает кирилицу которая неправильно интерпретируется, поэтому и 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

    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


    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


     Огромное спасибо, в notepad++ было выставлено "UTF-8 без BOM", поменял на просто "UTF-8" стало ОК!
    27 августа 2018 г. 12:53