我正在尝试合并来自两个命令小程序的输出。我需要列出所有具有特定许可证SKUID (CRMPLAN)的用户,他们已经超过30天没有登录。
沿着这些路线的一些东西甚至接近吗?
$UserList = get-MSOLUser -All | where {$_.isLicensed -eq "TRUE" -and $_.Licenses.AccountSKUID -eq "Domain:CRMPLAN"}
$MasterList = @()
foreach ($DisplayName in $UserList) {
$MyObject = New-Object PSObject -Property @{
LastLogonTime = (Search-ADAccount -AccountInactive -TimeSpan 30.00:00:00 | where {$_.ObjectClass -eq 'user'} | FT Name,ObjectClass –A}).LastLogonTime
}
$MasterList += $MyObject
}
$MasterList | select displayname,IsLicenced,LastLogonTime - export-CSV C:\LastLogonDate.csv发布于 2016-10-29 01:36:49
好的,现在您基本上获得了$userList中的用户列表,然后获得了每个用户在过去30天内未登录的所有上次登录时间的列表,并将其添加到一个数组中,然后尝试对不存在的数据进行一些选择,因为您只选择了最后登录时间,而这在AD中实际上并不存在。相反,您需要做的是遍历它们,检查它们的最后登录日期,看看它们是否在过去30天内登录过,如果没有,则将它们的信息添加到数组中(您也可以通过收集两个数组,然后使用group-object进行处理来完成此操作,但这要复杂得多)。您还必须记住,如果您选择的属性不是您在管道中使用的对象的一部分,则需要在选择中使用表达式将其填充到对象中
所以你的foreach循环看起来就像这样。
$masterList = @()
foreach($user in $userList){
$oldDate = (get-date).AddDays(-30)
$userObj = Get-ADUser -Identity $user.UserPrincipalName -Properties lastlogondate | Select-Object displayname,LastLogonDate,@{Name="IsLicensed"; Expression={$user.isLicensed}}
if($userObj.lastLogonDate -le $oldDate){
$masterList += $userObj
}
}最后,确保在导出时使用管道而不是减法符号。因此最后一行应该类似于$masterlist | export-csv c:\tmp\lastlogondate.csv
请注意,这里不需要执行select操作,因为我们已经执行了select操作来获取循环中所需的数据,还要尽量避免将文件放在C:\的根目录下,任何启用了UAC的计算机在尝试执行此操作时都会抛出权限错误,除非您是以管理员身份运行的,而这对于此脚本来说并不是必需的。希望这对你有所帮助,如果你有任何问题请告诉我。
https://stackoverflow.com/questions/40308065
复制相似问题