从特定组中获取随机 AD 用户,其中用户需要处于活动状态且上次登录时间戳大于 14 天

问题描述 投票:0回答:2

我需要获取特定组中的一个随机用户的姓名和 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没有被复制。

powershell random filter active-directory
2个回答
0
投票

为了完成 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>


0
投票

我建议过滤任何 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 导出非活动用户的上次登录日期

© www.soinside.com 2019 - 2024. All rights reserved.