none
Запись ласт логона и выгрузка. RRS feed

  • Вопрос

  • Здравствуйте. Есть терминальный сервер. Есть юзеры АД. Кто-то подключается пару раз в год, кто-то часто.

    Нужно понаблюдать месяц и найти кто редко заходит или вовсе не заходит.

    - Как лучше сделать ? Я думал при логоне дозаписывать дату входа и в принципе и всё. Дальше я в проводнике по txt файлу буду видеть дату изменения, вот моя сортировка. А в текстовом файле дозаписывание дат входа.

    Но вот если нужно через пол года это всё проанализировать, наверно будет не удобно.

    Я ведь смогу кучу txt файлов собрать в csv и получить таблицу?:

    Юзер         Дата

    Или есть какая-то более лучшая логика реализации задачи ?

    27 ноября 2019 г. 14:09

Ответы

  • Или есть какая-то более лучшая логика реализации задачи ?

    Конечно, есть: не лепить свой скрипт, а вытащить (например, с помощью Get-EventLog) данные из журнала событий Безопасность (отфильтровать по EventID и типу входа), примерно так:
    Get-EventLog Security | ?{$_.EventID -eq 4624} | select TimeGenerated,@{N='UserName';e={$_.ReplacementStrings[5]}},@{N='LogonType';e={$_.ReplacementStrings[8]}} | ?{$_.logontype -eq 10} | Export-Csv 'logons.txt' -Encoding Unicode



    Слава России!

    27 ноября 2019 г. 19:53
  • будет ли интересно решение - запись логов в mysql базу на Linux с помощью PoweShell, с выводом информации в веб-интерфейсе?
    27 ноября 2019 г. 15:24
  • Select модифицирует тип, оставляя в нем только те свойства, которые указаны (и добавляя новые)Конструкция @{N[ame]='Имя_свойства';E[xpression]={выражение}} (в квадратный скобках - необязательные части) как раз добавляет новое свойство с именем Имя_свойства и значением выражение. В выражении $_ обозначает текущий обрабатываемый объект. В примере создаются два свойства - UserName (имя учетной записи, берется из массива строк подстановки сообытия, элемент с индексом 5 (индексы считаются с 0) и LogonType  - оттуда же, но с индексом 8. Входу через терминал соответствует тип входа 10.

    Скрипт выводит данные в формате CSV, которые потом несложно загрузить, например, в Excel и обработать так, как вам нужно.

    Если будут ещё вопросы - задавайте.

     

    Слава России!

    28 ноября 2019 г. 14:03
  • Здравствуйте. Есть терминальный сервер. Есть юзеры АД. Кто-то подключается пару раз в год, кто-то часто.

    Нужно понаблюдать месяц и найти кто редко заходит или вовсе не заходит.

    - Как лучше сделать ? Я думал при логоне дозаписывать дату входа и в принципе и всё. Дальше я в проводнике по txt файлу буду видеть дату изменения, вот моя сортировка. А в текстовом файле дозаписывание дат входа.

    Но вот если нужно через пол года это всё проанализировать, наверно будет не удобно.

    Я ведь смогу кучу txt файлов собрать в csv и получить таблицу?:

    Юзер         Дата

    Или есть какая-то более лучшая логика реализации задачи ?

    Сбор статистики лишним не бывает.

    У меня вот такой скрипт стоит на логоне всех и вся. В папку на сервере $logonpath создается csv файл с текущей датой и туда дописывается построчно логоны/логофы всех пользователей. Если нужно будет собрать статистику за какое-то время, можно парсить тем же PoSH-ем через Get-Content или import-csv

    $logonpath = "\\server\path\"
    $logonfile = $logonpath + (Get-Date -Format yyyy-MM-dd) + ".csv"
    
    #Проверка на существование файла
    if (!(Test-Path $logonfile))
        {
        New-Item -Path $logonfile -ItemType "file"
        "Time;Computer;Login;Domain Controller;IP;Action" | Out-file $logonfile -Append -Encoding utf8
        }
    
    #Что будем писать в файл
    $LocalIP = Get-NetIPAddress | Select-Object -Property IPAddress | Where-Object -FilterScript {$PSItem.IPAddress -like '192.168.*'}
    $Text = (get-date -Format HH:mm:ss) + ';' + $env:COMPUTERNAME + ';' + $env:USERNAME + ';' + $env:LOGONSERVER + ';' + $LocalIP.IPAddress + ';' + 'Logon'
    
    #Проверяем возможность записи в файл
    for ($i=1; $i -le 1000; $i++)
        {
        $TestConnection = New-Object IO.FileStream($logonfile,[IO.FileMode]::Open)
    
        if ($TestConnection.CanWrite -eq "True")
            {
            Write-Host "Test connection OK, let's write something" -ForegroundColor Green
            $TestConnection.Close()
            $Text | Out-file $logonfile -Append -Encoding utf8
            $i=1000
            }
        else
            {
            $TestConnection.Close()
            Write-Host "Can't get access to file, let's wait for some seconds" -ForegroundColor DarkYellow
            Start-Sleep -s 2
            }
        }

    27 ноября 2019 г. 14:17
  • Если эти пользователи используют только терминальный сервер то поиск в АД может быть достаточным. Только если контроллеров домена больше чем один - то надо искать во всех контроллерах домена. Аттрибут LastLogonDate не реплицируется между контроллерами домена.
    28 ноября 2019 г. 11:42

Все ответы

  • Здравствуйте. Есть терминальный сервер. Есть юзеры АД. Кто-то подключается пару раз в год, кто-то часто.

    Нужно понаблюдать месяц и найти кто редко заходит или вовсе не заходит.

    - Как лучше сделать ? Я думал при логоне дозаписывать дату входа и в принципе и всё. Дальше я в проводнике по txt файлу буду видеть дату изменения, вот моя сортировка. А в текстовом файле дозаписывание дат входа.

    Но вот если нужно через пол года это всё проанализировать, наверно будет не удобно.

    Я ведь смогу кучу txt файлов собрать в csv и получить таблицу?:

    Юзер         Дата

    Или есть какая-то более лучшая логика реализации задачи ?

    Сбор статистики лишним не бывает.

    У меня вот такой скрипт стоит на логоне всех и вся. В папку на сервере $logonpath создается csv файл с текущей датой и туда дописывается построчно логоны/логофы всех пользователей. Если нужно будет собрать статистику за какое-то время, можно парсить тем же PoSH-ем через Get-Content или import-csv

    $logonpath = "\\server\path\"
    $logonfile = $logonpath + (Get-Date -Format yyyy-MM-dd) + ".csv"
    
    #Проверка на существование файла
    if (!(Test-Path $logonfile))
        {
        New-Item -Path $logonfile -ItemType "file"
        "Time;Computer;Login;Domain Controller;IP;Action" | Out-file $logonfile -Append -Encoding utf8
        }
    
    #Что будем писать в файл
    $LocalIP = Get-NetIPAddress | Select-Object -Property IPAddress | Where-Object -FilterScript {$PSItem.IPAddress -like '192.168.*'}
    $Text = (get-date -Format HH:mm:ss) + ';' + $env:COMPUTERNAME + ';' + $env:USERNAME + ';' + $env:LOGONSERVER + ';' + $LocalIP.IPAddress + ';' + 'Logon'
    
    #Проверяем возможность записи в файл
    for ($i=1; $i -le 1000; $i++)
        {
        $TestConnection = New-Object IO.FileStream($logonfile,[IO.FileMode]::Open)
    
        if ($TestConnection.CanWrite -eq "True")
            {
            Write-Host "Test connection OK, let's write something" -ForegroundColor Green
            $TestConnection.Close()
            $Text | Out-file $logonfile -Append -Encoding utf8
            $i=1000
            }
        else
            {
            $TestConnection.Close()
            Write-Host "Can't get access to file, let's wait for some seconds" -ForegroundColor DarkYellow
            Start-Sleep -s 2
            }
        }

    27 ноября 2019 г. 14:17
  • будет ли интересно решение - запись логов в mysql базу на Linux с помощью PoweShell, с выводом информации в веб-интерфейсе?
    27 ноября 2019 г. 15:24
  • Или есть какая-то более лучшая логика реализации задачи ?

    Конечно, есть: не лепить свой скрипт, а вытащить (например, с помощью Get-EventLog) данные из журнала событий Безопасность (отфильтровать по EventID и типу входа), примерно так:
    Get-EventLog Security | ?{$_.EventID -eq 4624} | select TimeGenerated,@{N='UserName';e={$_.ReplacementStrings[5]}},@{N='LogonType';e={$_.ReplacementStrings[8]}} | ?{$_.logontype -eq 10} | Export-Csv 'logons.txt' -Encoding Unicode



    Слава России!

    27 ноября 2019 г. 19:53
  • У меня в принципе все нужные юзеры в одной OU. Можно раз в неделю даже запускать скрипт в планировщике и собирать данные, более часто отслеживать не нужно как они заходят. Вроде такой подошел:

    Get-ADUser -SearchBase ‘OU=Users,OU=SPDS,DC=fdo,DC=local’ -filter * -Properties Name, Description, LastLogonDate | Select-Object Name, Description, LastLogonDate | Export-Csv -Path C:\Log\users.csv -Delimiter ';' -Encoding UTF8

    Можно ли тут сделать, чтоб
    LastLogonDate 

    дозаписывал колонку ?

    То есть щас так:

    А нужно:


    28 ноября 2019 г. 11:32
  • Если эти пользователи используют только терминальный сервер то поиск в АД может быть достаточным. Только если контроллеров домена больше чем один - то надо искать во всех контроллерах домена. Аттрибут LastLogonDate не реплицируется между контроллерами домена.
    28 ноября 2019 г. 11:42
  • Если эти пользователи используют только терминальный сервер то поиск в АД может быть достаточным. Только если контроллеров домена больше чем один - то надо искать во всех контроллерах домена. Аттрибут LastLogonDate не реплицируется между контроллерами домена.
    А, теперь стало ясно, почему MVV про логи говорил )
    28 ноября 2019 г. 11:54
  • В общем, может кто подсказать алгоритм и нужные в помощь командлеты ? Ибо я даже не могу разобраться в скрипте MVV. Где в селекте новый тип объекта?

    select TimeGenerated , @{N='UserName';e={$_.ReplacementStrings[5]}} , @{N='LogonType';e={$_.ReplacementStrings[8]}}

    После каждой запятой ?

    - Пользователи AD. У них заполнено поле Company.

    - Есть терминальный сервер.

    - Пользователи заходят на него. У одного пользователя есть разные учетные записи.

    Задача: Вычислить, кто редко заходит или кто вовсе не использует какие-либо учетки, в ходе анализа вычислить и заблокировать нужного юзера.

    - Мне получается надо как-то и логи совместить и AD.


    28 ноября 2019 г. 12:31
  • Select модифицирует тип, оставляя в нем только те свойства, которые указаны (и добавляя новые)Конструкция @{N[ame]='Имя_свойства';E[xpression]={выражение}} (в квадратный скобках - необязательные части) как раз добавляет новое свойство с именем Имя_свойства и значением выражение. В выражении $_ обозначает текущий обрабатываемый объект. В примере создаются два свойства - UserName (имя учетной записи, берется из массива строк подстановки сообытия, элемент с индексом 5 (индексы считаются с 0) и LogonType  - оттуда же, но с индексом 8. Входу через терминал соответствует тип входа 10.

    Скрипт выводит данные в формате CSV, которые потом несложно загрузить, например, в Excel и обработать так, как вам нужно.

    Если будут ещё вопросы - задавайте.

     

    Слава России!

    28 ноября 2019 г. 14:03
  • Спасибо большое. В общем я тут уже начал мудрить.

    Пока что-то такое получается:

    $search = [adsisearcher]"(&(ObjectCategory=Person)(ObjectClass=User)(cn=3408*))"
    $users = $search.FindAll()
    
    foreach($user in $users) {
    
        $CN = $user.Properties['CN']
        $SamAccountName = $user.Properties['Description']
    
        "$CN -  $SamAccountName"
    }

    Не понадобиться ставить RSAT на терминальный сервер.

    Наверно в коде лучше как-то указать нужный OU, а не CN имеющие 3408, хотя и такой вариант мне подходит. Добавить скрипт выше от MVV, добавить запись в файл и дозаписывать только дату. Буду завтра пробовать дальше.

    28 ноября 2019 г. 14:16
  • скрипт запускается от имени доменного админа на контроллере домена в 00:01. Скрипт собирает информацию по логинам за вчерашний день на сервере terminal-server1 и записывает в текстовый файл (для примера):

    $today = get-date -DisplayHint date -UFormat %Y-%m-%d
    $yesterday = get-date (get-date).addDays(-1) -UFormat %Y-%m-%d
    $event = Get-WinEvent -ComputerName terminal-server1 -FilterHashTable @{LogName="security";starttime="$yesterday";endtime="$today";id=4624} | where {$_.properties[8].value -eq 10}
    foreach ($event in $event)
    { 
     $Description = Get-ADUser $event.Properties[5].Value -Properties * | fl Description
     $event.TimeCreated >> C:\logs\$yesterday.txt
     $event.Properties[5].Value >> C:\logs\$yesterday.txt
     $Description >> C:\logs\$yesterday.txt
    }

    Нужно только как-то записывать переменные $event.TimeCreated, $event.Properties[5].Value и $Description в Excel (я умею записывать их в базу данных, но не умею в Excel). Ещё один недостаток - события в жураналах дублируются. Возможно имеет смысл анализировать лог:

    Get-WinEvent -FilterHashTable @{LogName=Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational;id=1149}
    28 ноября 2019 г. 16:19
  • скрипт запускается от имени доменного админа на контроллере домена в 00:01. Скрипт собирает информацию по логинам за вчерашний день на сервере terminal-server1 и записывает в текстовый файл (для примера):

    $today = get-date -DisplayHint date -UFormat %Y-%m-%d
    $yesterday = get-date (get-date).addDays(-1) -UFormat %Y-%m-%d
    $event = Get-WinEvent -ComputerName terminal-server1 -FilterHashTable @{LogName="security";starttime="$yesterday";endtime="$today";id=4624} | where {$_.properties[8].value -eq 10}
    foreach ($event in $event)
    { 
     $Description = Get-ADUser $event.Properties[5].Value -Properties * | fl Description
     $event.TimeCreated >> C:\logs\$yesterday.txt
     $event.Properties[5].Value >> C:\logs\$yesterday.txt
     $Description >> C:\logs\$yesterday.txt
    }

    Нужно только как-то записывать переменные $event.TimeCreated, $event.Properties[5].Value и $Description в Excel (я умею записывать их в базу данных, но не умею в Excel). Ещё один недостаток - события в жураналах дублируются. Возможно имеет смысл анализировать лог:

    Get-WinEvent -FilterHashTable @{LogName=Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational;id=1149}
    Записывайте в CSV, а Excel  без труда подгружает файлы в этом формате.

    my blog: http://shserg.ru/

    29 ноября 2019 г. 7:06
  • Записывайте в CSV, а Excel  без труда подгружает файлы в этом формате.
    я хочу в Excel, чтобы определённое значение писалось в определённый столбец\строку.
    29 ноября 2019 г. 7:49
  • Записывайте в CSV, а Excel  без труда подгружает файлы в этом формате.

    я хочу в Excel, чтобы определённое значение писалось в определённый столбец\строку.
    запишите в определенную строку|столбец в файл CSV, а затем откройте его в excelю

    my blog: http://shserg.ru/

    29 ноября 2019 г. 8:12
  •  а затем откройте его в excel

    Ещё раз повторю - я хочу писать сразу в Excel, чтобы потом не форматировать в нормальный вид. В интернете есть статьи как это делать, но к сожалению, пока этого не осилил. Но давайте пока остановимся на CSV:

    запишите в определенную строку|столбец в файл CSV
    как мне записать мои переменные в строку\столбец в CSV-файл?
    $event.TimeCreated
    $event.Properties[5].Value
    $Description
    29 ноября 2019 г. 8:25
  • man export-csv -Full


    my blog: http://shserg.ru/

    2 декабря 2019 г. 8:39