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