Powershell:某些用户的 lastLogonTimestamp 为空

Powershell:某些用户的 lastLogonTimestamp 为空

我正在开发一个脚本来报告 6 个月内未登录域的用户。我使用lastLogonTimestamp14 天内的记录,因为这对于我的目的来说已经足够精确,而且我不想查询每个 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

我遇到了同样的问题,我发现有帮助的是以管理员身份运行它。这没有任何意义,因为该信息应该对任何经过身份验证的用户可用,但它就在那里。

相关内容