我需要获取特定组中的一个随机用户的姓名和 SamAccountname。
到目前为止,我已经让随机发生器按预期工作,但是当我尝试过滤 get-AdUser 时,我就解决了。
这就是我现在所拥有的:
$date = (Get-Date).AddDays(-14)
$randomUser = (Get-ADGroupMember GROUP) |Sort-Object{Get-random} | select -first 1 | Get-Aduser -Properties name,SamAccountName **#-filter {name -and SamaccountName -and LastLogonTimestamp -gt $date -and enabled -eq $true}**
一旦我取消注释粗体部分,它就停止工作。
任何想法和帮助将不胜感激。
我认为这是因为我无法过滤该输出,但我不知道如何做。 我使用lastlogontimestamp的原因是因为lastLogon没有被复制。
为了完成 Theo 的评论,您不能在此处使用
-Filter
参数,因为数据是管道化的(您使用 Get-ADGroupMember
获得的对象)
虽然将用户和计算机放入同一组中是一个非常糟糕的主意,但这是可能的(甚至其他组或 MSA/GMSA 等...)。因此,您需要两个过滤器,第一个过滤器仅让用户将其发送到
Get-ADUser
,另一个过滤器使用 LastlogonDate 和 Enabled 进行过滤:
lastLogonTimeStamp
不是DateTime类型,而是long类型,因此您需要转换日期ToFileTimeUtc()
或ToFileTime()
,具体取决于您想要UTC或本地时间:
$date = (Get-Date).AddDays(-14).ToFileTimeUtc()
Get-ADGroupMember "My Group" | Where-Object ObjectClass -eq "user" |
Get-ADUser -Properties lastLogonTimeStamp |
Where-Object { $_.lastLogonTimestamp -gt $date -and $_.Enabled } | Get-Random
Get-Random
将仅返回一个对象(如您所愿),如果您想要更多,请添加 -Count <Number>
我建议过滤任何 enabled 用户,该用户是
memberOf
目标组并且 lastLogonTimeStamp
大于 14 天前,而不是相反。个人觉得比较简单直接。
$groupDn = (Get-ADGroup theTargetGroup).DistinguishedName
$targetDate = [datetime]::UtcNow.AddDays(-14).ToFileTime()
$filter = -join @(
"(&" # AND, all clauses must be met
"(!userAccountControl:1.2.840.113556.1.4.803:=2)" # Enabled only
"(!lastLogonTimeStamp<=$targetDate)" # `lastLogonTimeStamp` "lower than or equal to" when negated means "greater than"
"(memberOf=$groupDn)" # Object must be a `memberOf` the specified `distinguishedName`
")" # Closes AND
)
Get-ADUser -LDAPFilter $filter | Get-Random
值得注意的是,
lastLogonTimeStamp
不是一个精确值,有 14 天的余量,请参阅了解 AD 帐户属性 - LastLogon、LastLogonTimeStamp 和 LastLogonDate。为了精确起见,您必须查询所有域控制器并按 lastLogon
进行过滤,例如:通过 PowerShell 导出非活动用户的上次登录日期