分组/添加相似对象

时间:2019-05-24 11:57:37

标签: powershell sum grouping

我正在查询SCCM数据库以检查登录计算机的用户的历史记录。

到目前为止,我的工作正常,但是有很多数据,我想将它们组合在一起。例如,以下是一台计算机的输出:

enter image description here

这些都是同一用户的所有登录名(假设为JohnDoe123)。 我想要的是,而不是像John的30个条目,Jane的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

在处理像这样的对象中的对象时,我很困惑,所以谢谢您的帮助!

#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 个答案:

答案 0 :(得分:1)

您可以使用Group-ObjectMeasure-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 PropertyNamePropertyName对对象数组进行分组。 PropertyName的每个唯一值都将在结果集合中分组为单个行或项目。现在,PropertyName值将在Name属性下列出,而所有其他属性及其值将作为对象数组列在Group属性下。然后,您可以访问“组”属性以访问其余的未分组的属性和值。 -NoElement开关保留Group属性。这只是在不需要时将返回的数据最小化的一种方法。

-join运算符仅在用户使用多台计算机的情况下使用。 -join ';'将值数组连接到以分号分隔的单个字符串中。

相关问题