Я пытаюсь написать программу, которая позволяет пользователям выполнять различные виды запросов в Active Directory. Я хочу сделать так, чтобы они могли выбирать, какие атрибуты они хотят показать в выводе, а также фильтровать вывод несколькими способами.
Поскольку во время написания кода я не знаю, сколько атрибутов они выберут, казалось, что это самый простой способ создать строку из списка атрибутов и вызвать строку с помощью invoke-expression. Этот способ отлично работает с атрибутами, но не работает с фильтрами.
Я нашел несколько видов синтаксисов фильтров, но ни один из них не работает, когда я помещаю их в строку и пытаюсь вызвать это с помощью "выражения-выражения"
Это:
$time = (Get-Date).Adddays(-(19))
Get-ADUser -Filter {LastLogonTimeStamp -gt $time} -SearchBase 'CN=Users,DC=home,DC=local' -Properties samAccountname, LastLogonDate | Select-Object @{n='Felhasználónév'; e='samAccountName'}, @{n='Utolsó bejelentkezés'; e='LastLogonDate'} | Out-String
Дает мне результат, который я хочу.
Пока это:
$time = (Get-Date).Adddays(-(19))
$out = "Get-ADUser -Filter {LastLogonTimeStamp -gt $time} -SearchBase 'CN=Users,DC=home,DC=local' -Properties samAccountname, LastLogonDate | Select-Object @{n='Felhasználónév'; e='samAccountName'}, @{n='Utolsó bejelentkezés'; e='LastLogonDate'} | Out-String"
Write-Host $out
Invoke-Expression $out
Дает мне следующий результат:
Get-ADUser -Filter {LastLogonTimeStamp -gt 05/05/2019 19:05:46} -SearchBase 'OU=Testing,DC=home,DC=local' -Properties samAccountname, LastLogonDate | Select-Object @{n='Username'; e='samAccountName'}, @{n='Last Logon'; e='LastLogonDat
e'}
Get-ADUser : Error parsing query: 'LastLogonTimeStamp -gt 05/05/2019 19:05:46' Error Message: 'Operator Not supported: ' at
position: '26'.
At line:1 char:1
+ Get-ADUser -Filter {LastLogonTimeStamp -gt 05/05/2019 19:05:46} -Sear ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ParserError: (:) [Get-ADUser], ADFilterParsingException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingException,Microsoft
.ActiveDirectory.Management.Commands.GetADUser
Почему любая другая команда отлично работает при вызове их из строки, но не этой? Есть ли другой способ отфильтровать результат? Сначала я хочу придерживаться фильтрации перед запросом, а не предложением where, но я тоже попробую, если фильтрация не сработает.