Powershell:某些用户的 lastLogonTimestamp 空白

Mat*_*att 5 powershell active-directory

我正在开发一个脚本来报告 6 个月内未登录到域的用户。我使用lastLogonTimestampas in 14 days 对我的目的来说已经足够精确了,我不想查询每个 DC。

问题是,当我运行脚本时,lastLogonTimestamp将近 600 个用户返回空白。但是,这是奇怪的一点,然后我可以Get-ADUser在同一提示下为这些用户之一执行(这是脚本中用于检索此信息的操作),它为我提供了一个值。

什么可能导致这种情况?

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

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

$userlist = Get-ADUser -Filter * -properties lastLogonTimestamp
Run Code Online (Sandbox Code Playgroud)

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

$name = $user.Name
$llts = $user.lastLogonTimestamp
Run Code Online (Sandbox Code Playgroud)

当我查看文本文件时,对于近 600 个用户,lastLogonTimestamp 是空白的。其中一些,我选择一个测试对象,例如我认识的某个最近登录过的人,比如说 user-x。User-x 将在文本文件中将 lastLogonTimestamp 留空。但是,如果我然后运行

Get-ADUser user-x -properties lastLogonTimestamp
Run Code Online (Sandbox Code Playgroud)

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

更新 2:这毫无意义!我更改了脚本以在循环中提取 lastLogonTimestamp 属性,而不是在创建用户列表对象时:

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

...
}
Run Code Online (Sandbox Code Playgroud)

我认为当它成功提取属性时,这会更接近地复制我在命令行中使用的内容,但它仍然不起作用。可能值得指出的是,每次都是相同的用户。

uSl*_*ckr 4

问题出在更新 2 中的这条语句

$SamAccountName = $user.SamAccountName
Run Code Online (Sandbox Code Playgroud)

是在执行此操作后,$SamAccountName 的对象类型是 System.String,因此您丢失了 AD 用户上下文。
尝试这个:

get-aduser -filter * -properties lastLogonTimestamp | select name, lastLogonTimestamp |export-csv "output.csv"
Run Code Online (Sandbox Code Playgroud)

对于您之前的代码,问题似乎与其他变量处理有关。更实质性的片段将帮助我们给出更好的答案