Я наткнулся на странную ошибку в сценарии PowerShell, который возвращает мне компьютеры в Active Directory в определенной OU (и sub OU), которые включены и вошли в систему в течение определенной даты.
Следующий фрагмент действительно работает:
$date = (get-date).AddDays(-100)
Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt $date)} -Properties lastLogonTimestamp -SearchBase "CN=Computers,DC=some,DC=domain,DC=com"
... однако я сначала попытался сделать это одной строкой:
Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt $((get-date).AddDays(-100)))} -Properties lastLogonTimestamp -SearchBase "CN=Computers,DC=some,DC=domain,DC=com"
... но я неоднократно получал ошибку ниже (которая заставила меня попробовать приведенный выше двухстрочный пример):
Get-ADComputer : Cannot process argument because the value of argument "path" is not valid. Change the value of the "path" argument and run the operation again.
At line:1 char:1
+ Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt $((ge ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-ADComputer], PSArgumentException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.Management.Automation.PSArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
Я запускал сценарий как в Windows 8, так и в Windows Server 2008 R2 - оба с PowerShell v3. Я предполагаю, что модуль Active Directory, установленный инструментами RSAT в обеих ОС, также может иметь несколько разные версии.
Что касается данных, у меня есть то, что мне нужно, но я не понимаю, почему однострочный не работает. Аргумент «путь» не требуется ни для командлетов Get-Date, ни для Get-AdComputer, но в качестве примера я также убедился, что моим рабочим каталогом является C :.
Мне интересно, сможет ли кто-нибудь дать некоторое представление о том, почему это может быть - я использовал этот тип синтаксиса раньше в командлетах модуля, отличного от ActiveDirectory, поэтому я склонен предположить, что, поскольку запрос находится в Параметр "filter", возможно, неправильно передается самому командлету Get-AdComputer (и это то, с чем нам всем приходится мириться).