我正在查询SCCM数据库以检查登录计算机的用户的历史记录。
到目前为止,我的工作正常,但是有很多数据,我想将它们组合在一起。例如,以下是一台计算机的输出:
这些都是同一用户的所有登录名(假设为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
,但是它返回的哈希表不是我想要的格式:
在处理像这样的对象中的对象时,我很困惑,所以谢谢您的帮助!
#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
答案 0 :(得分:1)
您可以使用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属性下。然后,您可以访问“组”属性以访问其余的未分组的属性和值。 -NoElement
开关保留Group属性。这只是在不需要时将返回的数据最小化的一种方法。
-join
运算符仅在用户使用多台计算机的情况下使用。 -join ';'
将值数组连接到以分号分隔的单个字符串中。