我在批处理脚本中验证计算机 AD 组成员身份时遇到问题,空白输出
Im having trouble validating a computers AD group membership in batch scripting, blank output
我正在尝试使用脚本来确定计算机对象列表是否是代码中由 GroupA 和 GroupB 表示的两个特定 AD 组(除其他外)的成员,但它在电子表格中返回空白结果(下面的例子)。我没有接受过任何关于 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 组应该是:
Example
更让我感到困惑的是,如果我 运行 在不同的脚本中使用这些命令,它们 运行 就可以正常工作并产生预期的结果:
$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
那个 returns 一个只有那个 属性 的对象时。因此,您将无法检查 SamAccountName,因为它不存在于传递的对象中。
此外,当您真的只需要几个时,您可以选择 -Properties *
- 这会给您的域控制器带来额外的开销,并减慢整个脚本的速度。
最后,您对 Get-Adcomputer
进行了 6 次相同的调用,对 Get-ADPrincipalGroupMembership
进行了 2 次相同的调用
这是一种仅使用所需属性进行所需调用的方法。
$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
我正在尝试使用脚本来确定计算机对象列表是否是代码中由 GroupA 和 GroupB 表示的两个特定 AD 组(除其他外)的成员,但它在电子表格中返回空白结果(下面的例子)。我没有接受过任何关于 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 组应该是: Example
更让我感到困惑的是,如果我 运行 在不同的脚本中使用这些命令,它们 运行 就可以正常工作并产生预期的结果:
$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
接下来,如果那个 属性 确实存在,当你 Select-Object SomeProperty
那个 returns 一个只有那个 属性 的对象时。因此,您将无法检查 SamAccountName,因为它不存在于传递的对象中。
此外,当您真的只需要几个时,您可以选择 -Properties *
- 这会给您的域控制器带来额外的开销,并减慢整个脚本的速度。
最后,您对 Get-Adcomputer
进行了 6 次相同的调用,对 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