我正在尝试组合两个命令行开关的输出。我需要列出所有使用特定许可证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
答案 0 :(得分:0)
好的,现在你基本上得到$ userList中的用户列表,然后获取在过去30天内没有登录的用户的所有上次登录时间的列表,并将其添加到数组,然后尝试对不存在的数据进行一些选择,因为您只选择了lastlogontime,这实际上并不存在于AD中。您需要做的是循环遍历它们并检查它们的 lastlogondate 以查看它们是否在过去30天内已登录,然后将它们的信息添加到阵列中(如果它们没有)(您也可以这通过收集两个数组然后使用group-object进行处理,但这更棘手)。您还必须记住,如果您选择的属性不是您在管道中使用的对象的一部分,则需要在select中使用表达式将其填充到对象中
所以你的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以获取循环内部所需的数据,同时尽量避免将文件放在C:\的根目录下,任何具有UAC的机器在尝试执行此操作时,enabled将抛出权限错误,除非您以管理员身份运行,此脚本不需要。希望这有帮助,如果您有任何问题,请告诉我。