该脚本应该从多个 OU 中获取用户并将用户分配给一个变量,然后从该变量中获取用户并根据超过 30 天的最后登录日期过滤每个用户。然后它会导出到包含一些我想要的信息的 CSV。
问题是,当我到达foreach部分时,它搜索整个目录并且不使用我提供的变量中的用户。
任何批评都非常感谢。
$30days = (get-date).adddays(-30)
$Users1 = Get-ADUser -SearchBase 'OU=Users,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com' -LdapFilter '(UserPrincipalName=*)(extensionAttribute9=*)'
$Users2 = Get-ADUser -SearchBase 'OU=Users-Remote,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com' -LdapFilter '(UserPrincipalName=*)(extensionAttribute9=*)'
$Users3 = Get-ADUser -SearchBase 'OU=Contractors,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com' -LdapFilter '(UserPrincipalName=*)(extensionAttribute9=*)'
$Users4 = Get-ADUser -SearchBase 'OU=Temps,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com' -LdapFilter '(UserPrincipalName=*)(extensionAttribute9=*)'
$Users5 = Get-ADUser -SearchBase 'OU=Users,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com' -LdapFilter '(UserPrincipalName=*)(extensionAttribute9=*)'
$Users6 = Get-ADUser -SearchBase 'OU=Users,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com' -LdapFilter '(UserPrincipalName=*)(extensionAttribute9=*)'
$Users = $Users1,$Users2,$Users3,$Users4,$Users5,$Users6
$useraccountsover30days = foreach ($user in $($Users)){Get-ADUser -filter {lastlogondate -le $30days} -Properties lastlogondate}
$lastlogonreadable = $useraccountsover30days | Select-Object SamAccountName,lastlogondate
$lastlogonreadable | Export-Csv C:/Users/myname/Desktop/Usersover30days.csv
我会对您当前的脚本提出一些建议。
首先,单个大型查询几乎总是比许多小型查询执行得更好。因此
get-aduser
,我不会为每个目标 OU 单独运行,而是将它们组合成一个调用,使用更高级别的公共 OU 作为搜索库。显然,这最终可能会返回您不想包含的 OU 的结果。但是稍后过滤掉它们要快得多。您还
get-aduser
为第一组查询中的每个结果再次调用只是为了过滤 lastLogonDate。但是您可以将该过滤器与-ldapfilter
原始查询中的过滤器结合使用。只需将-filter
版本转换为等效-ldapfilter
版本即可。这样做的秘诀是知道 lastLogonDate 只是 lastLogonTimestamp 属性的 Powershell 转换版本。您可以将普通的 Powershell DateTime 值转换为 lastLogonTimestamp 与该ToFileTime()
方法一起使用的格式。最后让我感到困惑的是
(UserPrincipalName=*)
你的 ldapfilter 部分。在我接触过的每个域中,这个属性总是有一个值(就像 SamAccountName 或 DistinguishedName)。它可能与 的默认值不同<SamAccoutnName>@<DomainFQDN>
,但它永远不会为空。过滤器不一定会伤害任何东西。AD 在不需要时花费 CPU 周期进行评估只是一件额外的事情。但是,如果你有理由相信它在你的环境中可能是空的,那么一定要把它留在里面。因此,如果我正确理解您的意图,这就是我将如何修改您的脚本。
PS 请注意不要将
lastLogonTimestamp
(或lastLogonDate
)视为 100% 准确。根据设计,它可能会过期 9 到 14 天。我解决了对多个 OU 的类似请求,并在指定 OU 的情况下多次重复相同的集合,如下所示:
它获取所有已启用的帐户,包括属性名称、LastLogonDate、AccountExpirationDate、描述、部门、标题、用户主体名称,并将其附加到 csv 文件。如其他答案中所述,30 天可能不准确,因此最好确定 44 天。
如果“LastLogonDate”为空,则用户从未登录过,可能是新帐户。
您永远不会在 Get-ADUser 调用中使用 $user 值...尝试将 $UsersX 值更改为您需要发送给 Get-ADUser 的参数并将它们替换...并且由于您正在重用相同的 LdapFilter,不妨也让它成为一个变量。(另外,您重复使用“OU=Users,OU=US-Location”三次,我认为这只是为了举例?)