Я пытаюсь использовать сценарий, чтобы определить, является ли список объектов компьютеров членом двух конкретных групп 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
Я в недоумении, почему этот код работает в одном скрипте, а не в другом. Пожалуйста, помогите мне узнать, как это исправить.
Есть несколько проблем.
Во-первых, для объектов, возвращаемых 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, когда игрался с кодом (для меня это был долгий день). Спасибо, что нашли время, чтобы помочь мне, я очень ценю это! Я надеюсь, что у вас есть большой праздник! еще раз спасибо