Группировка / добавление похожих объектов - PullRequest
0 голосов
/ 24 мая 2019

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

То, что у меня есть, работает отлично, однако данных много, и я хотел бы сгруппировать их все вместе.Например, вот вывод для одного компьютера:

enter image description here

Это все входы одного и того же пользователя (скажем, JohnDoe123).Я хочу вместо 30 записей для Джона, 20 записей для Джейн и т. Д. Мне нужно общее количество каждого пользователя.Например:

Computer1 - JohnDoe123 - FullName - Latest time for LastConsoleUse - 500 (total number of console logons) - Latest TimeStamp - 50 000 (total minutes)

Вы понимаете, что я имею в виду?

Очевидно, что я не могу суммировать значения LastConsoleUse и TimeStamp, поэтому в идеале я хотел бы иметь только последнее значение.

Я пытаюсь ... | Group-Object -property SystemConsoleUser, но он возвращает хеш-таблицу, которая не соответствует формату, который мне нужен:

enter image description here

IЯ очень запутался, когда дело доходит до манипулирования объектами внутри такого объекта, поэтому спасибо за вашу помощь!

#Hist Users SCCM
$ConnexionsUsagers  = $null

$poste = "X"

$SiteCode = "X"
$SiteServer = "X"

$ResourceID_Name = (Get-WmiObject -namespace root\sms\site_$SiteCode -computer $SiteServer -query "select ResourceId,Name from SMS_R_SYSTEM where SMS_R_SYSTEM.Name LIKE '%$poste%'")

$ConnexionsUsagers += foreach ($item in $ResourceID_Name) {
    $query = @"
SELECT *
FROM SMS_GH_System_SYSTEM_CONSOLE_USER
WHERE SMS_GH_System_SYSTEM_CONSOLE_USER.ResourceID
LIKE '%$($item.ResourceId)%'
"@

    Get-WmiObject -Namespace root\sms\site_$SiteCode -Computer $SiteServer -Query $query |
        Where-Object {$_.SystemConsoleUser -ne $null} |
        Select-Object @{name='Poste';expression={$item.Name}}, SystemConsoleUser,
            @{name='Nom complet';expression={Get-ADUser -Properties userprincipalname ($_.SystemConsoleUser -replace "X\\") | Select-Object -ExpandProperty userPrincipalName}},
            @{name='LastConsoleUse';expression={[DateTime]::ParseExact(($_.LastConsoleUse).Split('.')[0], "yyyyMMddHHmmss", [System.Globalization.CultureInfo]::InvariantCulture)}},
            NumberofConsoleLogons,
            @{name='TimeStamp';expression={[DateTime]::ParseExact(($_.TimeStamp).Split('.')[0], "yyyyMMddHHmmss", [System.Globalization.CultureInfo]::InvariantCulture)}},
            TotalUserConsoleMinutes
}

$ConnexionsUsagers |
    Sort-Object @{expression="Poste"; Ascending=$true}, @{expression="TimeStamp"; Descending=$true} |
    Out-GridView

1 Ответ

1 голос
/ 24 мая 2019

Вы можете достичь желаемого результата, используя Group-Object и Measure-Object.

$ConnexionsUsagers | Group-Object -Property SystemConsoleUser |
   Select-Object @{n='SystemConsoleUser';e={$_.Name}},
   @{n='Poste';e={($_.group | Group-Object -Property Poste -NoElement).Name -join ';'}},
   @{n='Nom Complet';e={($_.group | Group-Object -Property "Nom Complet" -NoElement).Name}},
   @{n='NumberOfConsoleLogons';e={($_.group.NumberOfConsoleLogons | Measure-Object -Sum).Sum}},
   @{n='TotalUserConsoleMinutes';e={($_.group.TotalUserConsoleMinutes | Measure-Object -Sum).Sum}},
   @{n='LastConsoleUse';e={$_.group.LastConsoleUse | Sort-Object -Descending | Select-Object -First 1}}

Group-Object -Property PropertyName, группирующих массив объектов по PropertyName.Каждое уникальное значение PropertyName будет сгруппировано в одну строку или элемент в результирующей коллекции.Значения PropertyName теперь будут перечислены в свойстве Name, а все остальные свойства будут перечислены в виде массива объектов в свойстве Group.Затем вы можете получить доступ к свойству Group, чтобы получить доступ к остальным разгруппированным свойствам и значениям.Переключатель -NoElement отключает свойство Group.Это просто способ минимизировать возвращаемые данные, когда они не нужны.Оператор

-join используется на тот случай, если пользователь использует несколько компьютеров.-join ';' объединяет массив значений в одну строку, разделенную точкой с запятой.

...