У меня проблемы с проверкой членства компьютеров в группе AD в пакетном сценарии, пустой вывод

Я пытаюсь использовать сценарий, чтобы определить, является ли список объектов компьютеров членом двух конкретных групп AD (среди прочего), представленных GroupA и GroupB в коде, но он возвращает пустые результаты в электронной таблице (пример ниже). У меня нет формального обучения работе с Powershell, но я старался изо всех сил, пытаясь изучить его в течение последнего года или около того. Обычно я не прошу о помощи, но я действительно не могу понять это, чтобы спасти свою жизнь, и был бы вечно благодарен за любую помощь.

Это код, с которым у меня возникли проблемы:

$comp = Import-CSV .\PCList.csv
$Results = 
$comp | foreach {
<#
Pulls information from each computer in the list
#>
    if ($true) {

        $IPv4Address = Get-ADComputer -identity $_.computer -properties * | select-object IPv4Address
        $Enabled = Get-ADComputer -identity $_.computer -properties * | select-object Enabled
        $CanonicalName = Get-ADComputer -identity $_.computer -properties * | select-object CanonicalName
        $LastLogonDate = Get-ADComputer -identity $_.computer -properties * | select-object LastLogonDate
        $groupA = Get-ADPrincipalGroupMembership (Get-ADComputer $_.computer) | select-object MemberOf |where-object {$_.SamAccountName -ccontains "GroupA"}
        $groupB = Get-ADPrincipalGroupMembership (Get-ADComputer $_.computer) | select-object MemberOf |where-object {$_.SamAccountName -ccontains "GroupB"}
        }
<#
Converts data to a formal name for the Output file
#>
        [PSCustomObject]@{
            'ComputerName'      = $_.computer
            'IPv4Address'       = $IPv4Address.IPv4Address
            'Enabled?'          = $Enabled.Enabled
            'OU'                = $CanonicalName.CanonicalName
            'Last Logon Date'   = $LastLogonDate.LastLogonDate
            'GroupA Membership?'= $groupA
            'GroupB Membership?'= $groupB
        }
        }
$Results | Export-Csv -Path .\Data.csv -NoTypeInformation

Когда я запускаю этот код, я получаю пустые результаты там, где должны быть группы AD: Пример

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

$comp = Import-CSV .\PCList.csv
$Results = 
$comp | foreach {
<#
Pulls information from each computer in the list
#>
    if ($true) {
        $cn = Get-ADComputer -identity $_.computer -properties * | Select-Object -ExpandProperty DNSHostName
        $mo = Get-ADPrincipalGroupMembership (Get-ADComputer $_.computer) | select-object SamAccountName |where-object {$_.SamAccountName -ccontains "GroupA"}
        

<#
Converts data to a formal name for the Output file
#>
        [PSCustomObject]@{
            'ComputerName'         = $cn 
            'MemberOf'             = $mo.SamAccountName
            
            
        }
    }
<#
Error handling for systems that cannnot be reached or where data cannot be pulled, enters N/A for vaules in the output file
#>
    else {
        [PSCustomObject]@{
            'ComputerName'         = 'Unknown'
            'MemberOf'             = 'Unknown'

        } 
    }
  
}
$Results | Export-Csv -Path .\Data.csv -NoTypeInformation

Я в недоумении, почему этот код работает в одном скрипте, а не в другом. Пожалуйста, помогите мне узнать, как это исправить.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть несколько проблем.

Во-первых, для объектов, возвращаемых Get-ADPrincipalGroupMembership, нет свойства memberof.

Далее, если это свойство существует, когда вы Select-Object SomeProperty возвращаете объект только с этим свойством. Следовательно, вы не сможете проверить SamAccountName, потому что оно не существует в передаваемом объекте.

Кроме того, вы выбираете -Properties *, когда вам действительно нужно всего несколько — это увеличивает нагрузку на ваши контроллеры домена и замедляет весь скрипт.

Наконец, вы делаете 6 одинаковых вызовов Get-Adcomputer и 2 вызова Get-ADPrincipalGroupMembership.

Вот один из способов сделать только необходимые вызовы с желаемыми свойствами.

$props = 'IPv4Address','Enabled','CanonicalName','LastLogonDate'

$computerlist = Import-CSV .\PCList.csv

$Results = foreach($computer in $computerlist)
{
    Get-ADComputer $computer.computer -Properties $props | Foreach-Object {
        $grps = Get-ADPrincipalGroupMembership $_ |
                Select-Object -ExpandProperty SamAccountName

        [PSCustomObject]@{
            ComputerName        = $computer.computer
            IPv4Address         = $_.IPv4Address
            'Enabled?'          = $_.Enabled
            'OU'                = $_.CanonicalName
            'Last Logon Date'   = $_.LastLogonDate
            'GroupA Membership?'= $grps -contains 'GroupA'
            'GroupB Membership?'= $grps -contains 'GroupB'
        }
    }
}

$Results | Export-Csv -Path .\Data.csv -NoTypeInformation

Спасибо Дуг! Я все еще очень новичок в powershell и еще не вышел из «сырой» фазы кодирования, лол. Я думаю, что случайно оставил там функцию memberof, когда игрался с кодом (для меня это был долгий день). Спасибо, что нашли время, чтобы помочь мне, я очень ценю это! Я надеюсь, что у вас есть большой праздник! еще раз спасибо

Reckless 10.12.2020 15:14

Рад, что это помогло. Спасибо, с праздником.

Doug Maurer 10.12.2020 15:40

Другие вопросы по теме