我正在开发一个脚本来报告 6 个月内未登录域的用户。我使用lastLogonTimestamp
14 天内的记录,因为这对于我的目的来说已经足够精确,而且我不想查询每个 DC。
问题是,当我运行脚本时,lastLogonTimestamp
近 600 个用户的结果为空白。但是,奇怪的是,我可以在Get-ADUser
同一提示下对其中一个用户执行此操作(这是脚本中用于检索此信息的操作),它会给我一个值。
这可能是什么原因造成的?
更新:只是为了提供一些说明。是的,DFL 是 2003 年。另外,澄清一下。我仅指 lastLogonTimestamp 属性,而不是任何其他属性。
该脚本首先创建一个包含每个用户的对象:
$userlist = Get-ADUser -Filter * -properties lastLogonTimestamp
除了其他一些逻辑之外,我使用循环将每个用户写入文本文件foreach ($user in $userlist)
。实际上
$name = $user.Name
$llts = $user.lastLogonTimestamp
当我查看文本文件时,近 600 个用户的 lastLogonTimestamp 为空白。从其中一些用户中,我挑选一个测试对象,例如我知道最近登录过的用户,假设是 user-x。User-x 在文本文件中的 lastLogonTimestamp 将为空白。但是,如果我运行
Get-ADUser user-x -properties lastLogonTimestamp
在同一命令行上,在为用户 x 完成脚本之后,它会返回 lastLogonTimestamp 的值。
更新2:这毫无意义!我修改了脚本,在循环中而不是在创建用户列表对象时提取 lastLogonTimestamp 属性:
foreach ($user in $userlist)
{
$SamAccountName = $user.SamAccountName
$thisUser = Get-ADUser $SamAccountName -properties lastLogonTimeStamp
...
}
我以为这会更接近地复制我在命令行上成功提取属性时使用的内容,但它仍然不起作用。可能值得指出的是每次都是相同的用户。
答案1
问题出在你的更新 2 中
$SamAccountName = $user.SamAccountName
执行此操作后,$SamAccountName 的对象类型为 System.String,因此您丢失了 AD 用户上下文。
尝试以下操作:
get-aduser -filter * -properties lastLogonTimestamp | select name, lastLogonTimestamp |export-csv "output.csv"
对于之前的代码,问题似乎出在其他变量处理上。更详细的代码片段将有助于我们给出更好的答案
答案2
您是否循环遍历所有域控制器以获取真实的上次登录时间?此属性和值未在 DC IIRC 之间同步。这是我们在环境中用来检索单个用户的正确值的函数:
function func_ad.getLastLogon
{
param(
[string]$username
)
$dcs = Get-ADDomainController -Filter {Name -like "*"}
$time = 0
foreach($dc in $dcs)
{
$hostname = $dc.HostName
$userResult = Get-ADUser -Identity $username -properties lastLogon -Server $hostname
if($userResult.LastLogon -gt $time)
{
$time = $userResult.LastLogon
}
}
$dt = [DateTime]::FromFileTime($time)
return $dt
}
就您而言,为了避免不必要的重复,我会将 Get-ADDomainController 放在函数外部,但将 DC 数组与用户名一起传递给函数。您甚至可以修改 $username 参数以接受数组....
答案3
我遇到了同样的问题,我发现有帮助的是以管理员身份运行它。这没有任何意义,因为该信息应该对任何经过身份验证的用户可用,但它就在那里。