Назад | Перейти на главную страницу

Powershell: lastLogonTimestamp пусто для некоторых пользователей

Я разрабатываю скрипт для отчета о пользователях, которые не входили в домен в течение 6 месяцев. я использую lastLogonTimestamp as в течение 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

Когда я просматриваю текстовый файл, lastLogonTimestamp остается пустым для почти 600 пользователей. Из некоторых из них я выбираю испытуемого, например, кого-то, кто, как я знаю, недавно вошел в систему, скажем, user-x. Пользователь-x будет иметь в текстовом файле пустую метку lastLogonTimestamp. Если, однако, я запустил

Get-ADUser user-x -properties lastLogonTimestamp

в той же командной строке после завершения сценария для user-x он возвращает значение для lastLogonTimestamp.

ОБНОВЛЕНИЕ 2: Это не имеет никакого смысла! Я изменил сценарий, чтобы вытащить свойство lastLogonTimestamp в цикле, а не при создании объекта userlist:

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

...
}

Я думал, что это будет более точно воспроизводить то, что я использую в командной строке, когда он успешно извлекает свойство, но это все еще не работает. Наверное, стоит отметить, что каждый раз это одни и те же пользователи.

Проблема в этом заявлении в вашем обновлении 2

$SamAccountName = $user.SamAccountName

заключается в том, что после этого тип объекта $ SamAccountName будет System.String, поэтому вы потеряли контекст пользователя AD.
Попробуй это:

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

Для вашего предыдущего кода проблема, похоже, связана с другой обработкой переменных. Более подробный фрагмент поможет нам дать лучший ответ

Вы просматриваете все контроллеры домена, чтобы узнать истинное время последнего входа в систему? Это свойство и значение не синхронизируются между контроллерами домена 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 вне функции, но передал бы в функцию массив контроллеров домена вместе с именем пользователя. Вы даже можете изменить параметр $ username, чтобы он принимал массив ....

Я столкнулся с той же проблемой, и то, что я обнаружил, помогло запустить ее от имени администратора. в этом нет никакого смысла, поскольку информация должна быть доступна любому аутентифицированному пользователю, но это так.