Powershell - 使用尚未登录超过30天的CRM许可证创建用户CSV

时间:2016-10-28 15:10:53

标签: powershell office365

我正在尝试组合两个命令行开关的输出。我需要列出所有使用特定许可证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

1 个答案:

答案 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将抛出权限错误,除非您以管理员身份运行,此脚本不需要。希望这有帮助,如果您有任何问题,请告诉我。