Невозможно получить результаты для списка групп AD, но работает для одной группы AD, используя windows powershell - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь подготовить скрипт, который будет отображать все группы AD из входного файла, имеющего одну указанную c учетную запись службы. Я имею в виду, если у меня есть несколько групп AD в файле Groups.txt, и я передаю это в качестве входных данных для скрипта, который проверяет, есть ли у какой-либо из этих групп служебная учетная запись (AB C), тогда мы получаем выходные данные только тех групп, которые иметь учетную запись AB C. Ниже приведен сценарий, который я пробовал, но он не работает

$groups = Get-Content C:\Groups.txt
$results = foreach ($group in $groups) {
    Get-ADPrincipalGroupMembership -Identity serviceaccountname |
       select -ExpandProperty Name | Where-object { $_ -like '*$group*'} | Sort}
$results

Однако этот сценарий работает, если я просто использую 1 группу путем жесткого кодирования имени группы, как показано ниже

$results = foreach ($group in $groups) {
    Get-ADPrincipalGroupMembership -Identity serviceaccountname |
       select -ExpandProperty Name | Where-object { $_ -like '*GroupName*'} | Sort}

быть какая-то синтаксическая ошибка, я не могу понять это. Было бы здорово, если бы кто-то мог помочь мне с этим.

Спасибо, Шон

1 Ответ

0 голосов
/ 23 марта 2020

Я бы сделал это по-другому, используя Compare-Object и запросив только AD один раз.

$groups = Get-Content C:\Groups.txt
$membership = Get-ADPrincipalGroupMembership -Identity serviceaccountname | Select -Expand Name
$results = $membership | Compare-Object $groups -IncludeEqual -ExcludeDifferent |
    Select -Expand InputObject | Sort

Вам нужна расширяемая строка, если вы хотите, чтобы переменная внутри была заменяется значением. Строки в одинарных кавычках являются литеральными строками. Строки в двойных кавычках позволяют выполнять интерполяцию внутри. Таким образом, '$groups' вернет текст $groups, а "$groups" вернет значение $groups. Однако в этом случае кавычки не нужны, если вы ищете точные совпадения. Для точных совпадений более эффективно использовать -eq в пользу -like. Следуя этим идеям, ваш код будет изменен на следующее:

$groups = Get-Content C:\Groups.txt
$results = foreach ($group in $groups) {
    Get-ADPrincipalGroupMembership -Identity serviceaccountname |
        select -ExpandProperty Name | Where-object { $_ -eq $group } | Sort
}

Вы можете сделать этот шаг дальше и повысить эффективность, устраняя необходимость в цикле. Это можно сделать с помощью операторов сдерживания .

$groups = Get-Content C:\Groups.txt
$results = Get-ADPrincipalGroupMembership -Identity serviceaccountname |
        Select -ExpandProperty Name | Where-object { $_ -in $groups } | Sort
}

Если вы будете следовать примерам, предоставленным О правилах цитирования , вы можете увидеть различия между строки в двойных и одинарных кавычках. Вот тривиальный пример:

PS> $str = "mystring"
PS> '$str' # Single quotes = No substitution
$str
PS> "$str" # Double quotes = Substitution
mystring
PS> $str # No quotes = substitution
mystring
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...