Давайте красиво разберем это:
LastLogon
не реплицируется между контроллерами домена — это уникальная отметка времени для каждого контроллера домена для этой учетной записи. Если компьютер никогда не входил в контроллер домена, к которому обращается ваш запрос, это свойство не будет заполнено. Если он в основном зарегистрирован на разных контроллерах домена, дата может быть неточной. Вместо этого, если вы просто хотите узнать, входили ли компьютеры в систему «недавно», запросите LastLogonTimeStamp
или же LastLogonDate
- см. примечание ниже.
Если вы хотите понять, что делает запрос, не просто пропускайте его через конвейер и выводите в CSV. Если вам не нравится не понимать, что происходит, и открывать пустой CSV-файл, сначала запустите простые команды, чтобы понять вывод и убедиться, что вы получите правильные результаты, прежде чем выводить их в файл. См. примеры ниже.
Если все, что вам нужно, это LastLogon
или же LastLogonDate
и имя компьютера, пожалуйста не использовать -Характеристики *
. Ваш запрос займет гораздо больше времени, потому что вы буквально перетаскиваете все данные в учетной записи компьютера. Если у вас есть сертификаты, хранящиеся в объектах компьютеров в AD, это могут быть КБ данных для каждого объекта. Если вам нужны только два свойства, просто выберите их: Get-ADComputer -filter '*' -properties Name,LastlogonDate
. Пример размеров данных находится в конце.
LastLogonTimeStamp против LastLogonDate
в отличие LastLogon
, LastLogonTimeStamp
является реплицируется среди всех контроллеров домена, но является точным только до 14 дней назад. LastLogonDate
такой же как LastLogonTimeStamp
, но это расчет [ДатаВремя]
свойство (оно не хранится в LDAP, а вычисляется при запросе). Так как это [ДатаВремя]
, Легче сортировать и фильтровать.
Если LastLogonTimeStamp
14 дней или меньше, может быть более новый LastLogon
для этой машины на одном или нескольких контроллерах домена. Если вам нужно более точное время, вам нужно запросить все контроллеры домена для LastLogon
на всех учетных записях компьютеров, а затем сравните, какая из них имеет самую последнюю дату. Но для типичных целей отчетности, например, если вы проверяете учетные записи компьютеров, которые могут быть «устаревшими», LastLogonDate
в целом нормально.
Ссылаться на эта статья для получения дополнительной информации.
Понимание результатов запросов AD/LDAP
Если вы не уверены, как выглядят ваши результаты, не выводите их в файл. Чтобы понять, что делают ваши команды, попробуйте простой фильтр и дайте ему вывод на консоль. Затем уточните запрос по мере необходимости. Если вам нужно обработать данные после получения результата, выполняйте один шаг за раз и проверяйте результаты, прежде чем добавлять новые. Я работаю с Powershell уже 15 лет и до сих пор начинаю так: проверяю, что выходит первым, прежде чем делать следующий шаг по фильтрации и обработке данных.
Попробуйте выполнить следующие примеры, явно заменив имена OU и компьютеров на правильные из вашей среды (кстати, не раскрывайте настоящие имена в своих вопросах).
# Список всех компьютеров в OU со свойствами по умолчанию, которые выводит Get-AdComputer - это не включает LastLogonDate и т. д.
# например имя, отличительное имя, включено, объектный тип и т.д...
Get-ADComputer -Filter * -Searchbase "OU=MyOUPath,DC=example,DC=net"
# Показать -все- свойства компьютера с именем "MyComputer"
Get-ADComputer -Filter 'name -eq "Mycomputer"' -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties *
# Показать только определенные свойства с того же компьютера
Get-ADComputer -Filter 'name -eq "Mycomputer"' -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties Name,LastLogonDate
# Список всех компьютеров в OU с именами и только LastLogonDate
Get-ADComputer -Filter * -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties Name,LastLogonDate
# Как и выше, использование выражения для преобразования нереплицированного свойства LastLogon в [datetime] вместо
# Обратите внимание, что необходима дальнейшая обработка, если вам нужно сравнить эту дату между несколькими контроллерами домена.
Get-ADComputer -Filter * -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties Name,LastLogon | Выберите Имя, LogonDate, @{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}}
# Если ваши результаты в предыдущей команде выглядят хорошо, теперь вы можете сортировать и выводить в CSV
Get-ADComputer -Filter * -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties Name,LastLogonDate | Сортировать LastLogonDate | выберите Name, LastLogonDate | export-csv -path c:\Temp\ADComputer.csv -NoTypeInformation
Для последнего примера, Выберите Имя, LastLogonDate
заключается в том, чтобы исключить свойства по умолчанию, такие как Выдающееся имя
и объектный класс
из экспорта CSV. Кроме того, если вам не нравится, как LastLogonDate
отформатирован, вам может понадобиться включить выражение для его форматирования и там (аналогично преобразованию Дата входа в систему
время файла).
Размер данных запроса LDAP
В приведенном ниже списке файлов показана разница в размере данных, если я верну только имя
и LastLogonDate
одного компьютера в "comp1.txt" против ВСЕХ свойств одного и того же компьютера в "comp2.txt". Умножьте на количество опрашиваемых машин — очень легко понять, почему запрос будет выполняться намного дольше, когда он перетаскивает ненужные данные из AD и по сети.
Режим LastWriteTime Длина Имя
---- ------------- ------ ----
-a---- 2022-02-14 18:41 894 comp1.txt
-a---- 14-02-2022 18:42 69736 comp2.txt