Вызов-выражение Powershell не работает с переключателем фильтра - PullRequest
0 голосов
/ 24 мая 2019

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

1 Ответ

1 голос
/ 24 мая 2019

Глупо отвечать на мой собственный вопрос, но я думаю, что нашел ответ. Размещение escape-символа до того, как переменная сделала свое дело.

$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
$expr = Invoke-Expression $out
$expr

Возвращает

Felhasználónév Utolsó bejelentkezés  
-------------- --------------------  
Administrator  2019. 05. 24. 18:18:28
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...