[PS,AD] Удаление старых компов из домена
- Написал скриптик такой
$date=(Get-date).AddYears(-1)
Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 0 | where {$_.lastlogon -le $date}
Работает неправильно т.к. выдает что lastlogon пустой, если делаю так
$date=(Get-date).AddYears(-1)
Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 0 -Identity "COMP$" | where {$_.lastlogon -le $date}
то все прокатывает отрабатывает как надо!
В чем прикол вообще понять не могу.
Ответы
когда смотришь все свойства у всех компов сразу, то там даже нету такой строчки lastlogon
можно делать так
Code SnippetPS:22 > get-qadcomputer zo* | foreach-object {get-qadcomputer $_.name} | format-table name, lastlogon
Name lastLogon
---- ---------
ZOM 2008-04-07 6:03:40
zorion 2008-04-08 0:33:16Alb@ написано: Написал скриптик такой
$date=(Get-date).AddYears(-1)
Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 0 | where {$_.lastlogon -le $date}
Работает неправильно т.к. выдает что lastlogon пустой, если делаю так
$date=(Get-date).AddYears(-1)
Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 0 -Identity "COMP$" | where {$_.lastlogon -le $date}
то все прокатывает отрабатывает как надо!
В чем прикол вообще понять не могу.Я тоже сначала никак не врубался в подобную фишку

Дело в том что Get-QAD* при запросе одного объекта и нескольких, возвращает разные наборы свойств. При запросе нескольких элементов - получаются только "основные", самые популярные, свойства. Если необходимо получить какие то конкретные, их необходимо указать с помощью ключа -IncludedProperties, например:
Code SnippetGet-QADComputer -IncludedProperties "LastLogon" | ft name, lastlogon
Все ответы
- Вот примеры скриптов
Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 6| Format-table name, lastlogon
Вывод:
Name lastlogon
---- ---------
JURBURO
DMITRIY
BUCH
ROMAN
SERG
RASHID
Такой скрипт
Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 0 -Identity "RASHID"|Format-table name, lastlogon
Вывод:
Name lastLogon
---- ---------
RASHID 09.07.2007 8:57:20 когда смотришь все свойства у всех компов сразу, то там даже нету такой строчки lastlogon
можно делать так
Code SnippetPS:22 > get-qadcomputer zo* | foreach-object {get-qadcomputer $_.name} | format-table name, lastlogon
Name lastLogon
---- ---------
ZOM 2008-04-07 6:03:40
zorion 2008-04-08 0:33:16Alb@ написано: Написал скриптик такой
$date=(Get-date).AddYears(-1)
Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 0 | where {$_.lastlogon -le $date}
Работает неправильно т.к. выдает что lastlogon пустой, если делаю так
$date=(Get-date).AddYears(-1)
Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 0 -Identity "COMP$" | where {$_.lastlogon -le $date}
то все прокатывает отрабатывает как надо!
В чем прикол вообще понять не могу.Я тоже сначала никак не врубался в подобную фишку

Дело в том что Get-QAD* при запросе одного объекта и нескольких, возвращает разные наборы свойств. При запросе нескольких элементов - получаются только "основные", самые популярные, свойства. Если необходимо получить какие то конкретные, их необходимо указать с помощью ключа -IncludedProperties, например:
Code SnippetGet-QADComputer -IncludedProperties "LastLogon" | ft name, lastlogon
- спасибо все работает
теперь хочу сравнить lastlogon с get-date -1 год
Code Snippet$date
=(Get-date).AddYears(-1).Date Get-QADComputer -ErrorAction SilentlyContinue -IncludedProperties "Lastlogon" -SizeLimit 10 | Format-table name, lastlogon | where {$_.lastlogon -lt $date}выдает следующее:
Name lastlogon
---- ---------
JURBURO
DMITRIY
BUCH
ROMAN 07.04.2008 12:23:53
SERG 28.08.2006 7:28:43
RASHID 09.07.2007 8:57:20
Я знаю что lt это меньше, т.е 3 < 4 = true
У меня же не получается
понял свою ошибку скрипт такой
Code Snippet$date
=(Get-date).AddYears(-1).DateGet-QADComputer
-ErrorAction SilentlyContinue -IncludedProperties "Lastlogon" -SizeLimit 10 | where {$_.lastlogon -lt $date} | Format-table name, lastlogonЧего с трудом продвигаюсь теперь застрял тут
Code Snippet$date
=(Get-date).AddYears(-1).DateGet-QADComputer
-ErrorAction SilentlyContinue -IncludedProperties "lastlogon" -SizeLimit 100 -Identity 'pvd-10' |where
{($_.lastlogon -lt $date) -and ($_.lastlogon -match " ")} |Format-list
name, lastlogon, CanonicalName |Move-QADObject
"$_.CanonicalName" -NewParentContainer "ds.local/Computers_old"Шлет такой привет
Move-QADObject : The input object cannot be bound to any parameters for the command either because the command does not
take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.
At line:4 char:15
+ Move-QADObject <<<< "$_.CanonicalName" -NewParentContainer "ds.local/Computers_old"Если делаю так то все работает
Code Snippet$date
=(Get-date).AddYears(-1).Date$can
=Get-QADComputer -ErrorAction SilentlyContinue -IncludedProperties "lastlogon" -SizeLimit 100 -Identity 'pvd-10' |where
{($_.lastlogon -lt $date) -and ($_.lastlogon -match " ")}$can
=$can.CanonicalNameMove-QADObject
"$Can" -NewParentContainer "ds.local/Computers_old"разглядишь?
Code SnippetPS:14 > Get-QADComputer -ErrorAction silentlycontinue -IncludedProperties "lastlogon" -sizelimit 100 | where {($_.lastlogon -lt $date) -and ($_.lastlogon -match " ")} | foreach-object {Move-QADObject -identity "$_" -NewParentContainer 'lutekad.ru/computers' -WhatIf}
What if: Moving computer named 'tech3' from OU=SITiS,OU=Lutek,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
What if: Moving computer named 'SHGT' from OU=SITiS,OU=Lutek,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
What if: Moving computer named 'TSSSERVER' from OU=Prohodnaya,OU=SITiS,OU=Lutek,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
What if: Moving computer named 'FAGDF' from OU=DF,OU=Lutek,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
What if: Moving computer named 'GGI-PRP' from OU=urist,OU=Prp,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
What if: Moving computer named 'GEGLUR' from OU=PEO_Lur,OU=Lur,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
What if: Moving computer named 'VAVLURPEO' from OU=PEO_Lur,OU=Lur,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
What if: Moving computer named 'KVVLUR' from OU=PEO_Lur,OU=Lur,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
What if: Moving computer named 'FNGOPPR' from OU=oppr_lur,OU=Lur,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
What if: Moving computer named 'kibteplo' from OU=Teplo,OU=Lutek,OU=AllUsers,DC=lutekAD,DC=ru to CN=Computers,DC=lutekAD,DC=ru.
WARNING: Only first 100 search results were displayed. To display more, increase size limit using -SizeLimit parameter (use 0 as the value of size limit to
display all search results).Делать так уж красиво в одну строку :-)
Code SnippetPS:17 > Get-QADComputer -ErrorAction silentlycontinue -IncludedProperties "lastlogon" -sizelimit 100 | where {($_.lastlogon -lt (get-date).addyears(-1).date) -and ($_.lastlogon -match " ")} | foreach-object {Move-QADObject -identity "$_" -NewParentContainer 'lutekad.ru/computers' -WhatIf}
Alb@ написано: Чего с трудом продвигаюсь теперь застрял тут
На будущее: Format-* командлеты выдают не оригинальные объекты, а "изуродованные форматированием"
Точнее Microsoft.PowerShell.Commands.Internal.Format.*Data. Следовательно любая дальнейшая обработка этих объектов невозможна. Поэтому Format-* командлеты должны стоять в самом конце конвейера (а больше они вобщем то и не нужны нигде
).- все спасибо огросное свою ошибку понял
zorion написано: Делать так уж красиво в одну строку :-)
Code SnippetPS:17 > Get-QADComputer -ErrorAction silentlycontinue -IncludedProperties "lastlogon" -sizelimit 100 | where {($_.lastlogon -lt (get-date).addyears(-1).date) -and ($_.lastlogon -match " ")} | foreach-object {Move-QADObject -identity "$_" -NewParentContainer 'lutekad.ru/computers' -WhatIf}
Я тут не вижу учет того, что домен контроллеров несколько. А lastlogon не реплицируется, т.о. "улетят" и нормальные компы
Про домен контроллеров несколько не могу точно сказать и ни кто не смог до сих пор
Естественно удалять ни чего не нужно, только отключать или переносить.
zorion написано: Про домен контроллеров несколько не могу точно сказать и ни кто не смог до сих пор
Естественно удалять ни чего не нужно, только отключать или переносить.
Я алгоритм сказать могу, просто в power shell пока не силен.
Нужно получить список домен контроллеров, потом с каждого из них получить список компов с атрибутом last logon, затем объединить массивы, затем отбросить n-1 записи для каждого из имен оставив только ту, у которой этот атрибут максимален. Ну а затем уже проводить фильтрацию.
Там сразу два варианта решения поставленной задачи (дада, готовые скрипты!
). Первый с LastLogon (который не реплицируется, но зато сообщает точное время), и второй с LastLogonTimestamp (который реплицируется, но обновляется не при каждом логине, а только если прошло "около недели" с момента последнего логина)- Не хотел создавать новую тему - так как мой вопрос по данной теме, только с вопросом по преобразованию "думаю машинного времени в нормальную дату и время"
Get-QADComputer -SearchRoot 'домен/Domain Computers' -IncludedProperties 'lastlogontimestamp'| Select-Object Computername, lastlogontimestamp
В итоге получаем
ComputerName lastlogontimestamp
------------
PC-PHOTO08$ 128780579119965552
Где-то помню читал про все выполняемые деления для преобразования данного значения 128780579119965552 в нормальный вид.
Может кто-то поможет решить данную проблемму : хотя б по преобразованию этого значения в приемлимый вид (алгоритм)
Спасибо
- Уже разобрался, спасибо за ссылку - её я тоже нашел

