Powershell:lastLogonTimestamp对于某些用户是空白的

我正在开发一个脚本来报告6个月没有login到域的用户。 我在14天内使用lastLogonTimestamp对我来说是足够精确的,我不想查询每个DC。

问题是,当我运行该脚本时, lastLogonTimestamp会回来,为近600个用户。 但是,这里有点奇怪,然后我可以在同一个提示符下为这些用户之一执行Get-ADUser (这是脚本中用来检索这些信息的东西),它给了我一个值。

什么可能导致这个?

更新:只是提供一些澄清。 是DFL是2003年。另外,澄清。 我只是指的是lastLogonTimestamp属性,而不是任何其他属性。

脚本首先创build一个包含每个用户的对象:

 $userlist = Get-ADUser -Filter * -properties lastLogonTimestamp 

除了一些其他逻辑,我通过使用foreach ($user in $userlist)循环将每个用户写出到一个文本文件。 有效

 $name = $user.Name $llts = $user.lastLogonTimestamp 

当我查看文本文件时,lastLogonTimestamp对于将近600个用户是空白的。 其中的一些,我select一个testing主题,例如我最近login的人,比如说user-x。 User-x将在文本文件中使用lastLogonTimestamp空白。 如果,然而,我然后运行

 Get-ADUser user-x -properties lastLogonTimestamp 

在脚本为user-x完成之后在相同的命令行上,它返回lastLogonTimestamp的值。

更新2:这是没有意义的! 我更改了脚本,以便在循环中取出lastLogonTimestamp属性,而不是在创builduserlist对象时:

 foreach ($user in $userlist) { $SamAccountName = $user.SamAccountName $thisUser = Get-ADUser $SamAccountName -properties lastLogonTimeStamp ... } 

我认为这会更接近地复制我在命令行中使用的东西,但是它仍然不起作用。 可能值得指出的是,每次都是一样的用户。

问题是在更新2中的这个语句

 $SamAccountName = $user.SamAccountName 

是这样做之后,$ SamAccountName的对象types是System.String,因此您已经失去了AD用户上下文。
尝试这个:

 get-aduser -filter * -properties lastLogonTimestamp | select name, lastLogonTimestamp |export-csv "output.csv" 

对于您以前的代码,问题似乎与其他variables处理。 更重要的片段将帮助我们给出更好的答案

你是通过所有的域控制器循环获取真正的最后login时间? 这个属性和值在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 if($userResult.LastLogon -gt $time) { $time = $userResult.LastLogon } } $dt = [DateTime]::FromFileTime($time) return $dt } 

在你的情况,为了避免不必要的重复,我把Get-ADDomainController放在函数之外,但是把DC数组和函数一起传递给函数。 你甚至可以修改$ username参数来接受一个数组….

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