Как использовать powershell для определения частоты объектов в коллекции на основе конкретного члена - PullRequest
1 голос
/ 03 мая 2019

Я запрашиваю журнал Security EventLog на нашем PDC, чтобы отслеживать тенденции, которые могут указывать на скомпрометированные хосты или имена пользователей.У меня есть код для сбора информации и ее очистки ...

$ TargetEvents заканчивается так: (я не могу понять, как отформатировать нормально выглядящую таблицу в моем сообщении)

Host  User
----  ----
host1 user1
host2 user2
host1 user3
host1 user4
host2 user4

$Events= Get-WinEvent -ComputerName MYPDC -FilterHashtable @{Logname='Security';id=4740} -MaxEvents 10
$TargetEvents=@()
foreach ($Event in $Events)
{

    $obj=[PSCustomObject]@{
        Host=$Event.Properties[1].value.ToString()
        User=$Event.Properties[0].value.ToString()
    }
    $TargetEvents+=$obj
}

Я бы хотел составить резюме, но я просто искренне застрял.Я не программирую профессионально, просто инструменты, чтобы помочь моей работе.

Вот что я пытаюсь создать:

Host  Frequency
----  ---------
host1 3
host2 2

User  Frequency
----  ---------
user1 1
user2 1
user3 1
user4 2

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Вы можете напрямую передать [PSCustomObject] в переменную, собирающую весь вывод foreach:

$Events= Get-WinEvent -ComputerName MYPDC -FilterHashtable @{Logname='Security';id=4740} -MaxEvents 10

$TargetEvents= foreach ($Event in $Events){
    [PSCustomObject]@{
        Host=$Event.Properties[1].value.ToString()
        User=$Event.Properties[0].value.ToString()
    }
}

Для получения ваших данных вы можете использовать Group-Object здесь с -NoElement в качестве значения только (Частота) и Host / User

> $TargetEvents | Group-Object Host -NoElement

Count Name
----- ----
    3 host1
    2 host2

Чтобы получить желаемый результат, используйте Select-Object для переименования Count to Frequency с вычисляемым свойством.

$TargetEvents | Group-Object Host -NoElement | Select-Object @{n='Host';e={$_.Name}},@{n='Frequency';e={$_.Count}}

Host  Frequency
----  ---------
host1         3
host2         2

$TargetEvents | Group-Object User -NoElement | Select-Object @{n='User';e={$_.Name}},@{n='Frequency';e={$_.Count}}

User  Frequency
----  ---------
user1         1
user2         1
user3         1
user4         2
1 голос
/ 03 мая 2019

Командлет Group-Object ваш друг здесь:

# rebuilding your example data

$items = @("host1 user1",
"host2 user2",
"host1 user3",
"host1 user4",
"host2 user4")

$arraylist = New-Object System.Collections.ArrayList

#loop over the objects, split at the space and assign variable values
foreach($item in $items) {
    $thehost = $item.split(' ')[0]
    $theuser = $item.split(' ')[1]

# including | Out-Null just keeps the Add() method from outputting the number of the item
# it does not nullify your data
    $arraylist.Add([PSCustomObject]@{Host=$thehost;User=$theuser}) | Out-null
}

# group by host property

$hostFrequency = $arraylist | Group-Object -Property Host

# group by user property

$userFrequency = $arraylist | Group-Object -Property User

# results arrays

$hostResults = New-Object System.Collections.ArrayList
$userResults = New-Object System.Collections.ArrayList

# group the count of hosts along with corresponding name
foreach($item in $hostFrequency)
{
    $hostResults.Add([PSCustomObject]@{Host = $item.Name; Frequency = $item.Count}) | Out-Null
}

# group the count of users along with corresponding name
foreach($item in $userFrequency)
{
    $userResults.Add([PSCustomObject]@{User = $item.Name; Frequency = $item.Count}) | Out-Null
}

# output all the things
$hostResults | Format-Table
$userResults | Format-Table

Вывод:

Host  Frequency
----  ---------
host1         3
host2         2



User  Frequency
----  ---------
user1         1
user2         1
user3         1
user4         2
...