在 PowerShell 中获取分发组属性并打印到文件

Get-Distribution Group Attributes in PowerShell and Print to File

因此,在 Stack 周围优秀人士的帮助下,我构建了一个脚本,该脚本轮询 AD 以获取分发组并创建一个 CSV 填充

前 3 个很容易获得,因为它们是通讯组的标准属性。当我尝试将组成员身份中的显示名称转换为接受发件人、审核人和管理人的主要 SMTP 地址时,挑战就来了。当前脚本用于获取 SMTP 地址,但是我们用于过滤的显示名称偶尔也会用于二级和三级帐户,因此我们偶尔会 return 每个显示名称的多个结果。我需要从列表中过滤这些二级和三级电子邮件帐户。幸运的是,我们有一个辅助字段,一个 extensionAttribute,如果它是主要用户帐户,它总是填充 1。所以我试图用 -And "extensionAttribute8 -eq '1'" 修改 -Filter 并且它在我身上爆炸了。我还尝试添加一个附加的 -Properties 字段,该字段引用扩展属性,但也没有做任何事情。

它一直失败并显示

ActiveDirectlyCmdlet.Microsoft.ActiveDirectly.Management.AdfilterParsingException,Microsoft.adtiveDirectory.Management.Commands.GetADUser

下面是我尝试编写的脚本,希望 PowerShell 大师中的一位能帮我解决这个问题。

在此先感谢您的帮助!

瑞安

$props = @(
    "DisplayName"
    "SamAccountName"
    "PrimarySmtpAddress"
    @{n='Accepted Senders';e= {($_.acceptmessagesonlyfromsendersormembers | Foreach-Object {
    (Get-AdUser -Filter "DisplayName -eq '$($_.Split('/')[-1])'" -And "extensionAttribute8 -eq '1'" -Properties ('extensionattribute8', 'ProxyAddresses') |
        Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'}) -join ';'}}
    "ModerationEnabled"
    @{N="ModeratedBy";E= {($_.ModeratedBy | ForEach-Object {
    (Get-AdUser -Filter "DisplayName -eq '$($_.Split('/')[-1])'" -And "extensionAttribute8 -eq '1'" -Properties ('extensionattribute8', 'ProxyAddresses') |
        Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'}) -join ';'}}
    @{Name="Internal Senders Only";E={$_.RequireSenderAuthenticationEnabled}}
    @{N="ManagedBy";E= {($_.ManagedBy | ForEach-Object {
    (Get-AdUser -Filter "DisplayName -eq '$($_.Split('/')[-1])'" -And "extensionAttribute8 -eq '1'" -Properties ('extensionattribute8', 'ProxyAddresses') |
        Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'}) -join ';'}}
        )
Get-DistributionGroup -ResultSize Unlimited | Select-Object $props | export-Csv C:\temp\testforformat.csv -NoTypeInformation

作为参考,我尝试修改的脚本包含在下面。

$props = @(
    "DisplayName"
    "SamAccountName"
    "PrimarySmtpAddress"
    @{n='Accepted Senders';e= {($_.acceptmessagesonlyfromsendersormembers | Foreach-Object {
    (Get-AdUser -Filter "DisplayName -eq '$($_.Split('/')[-1])'" -Property ProxyAddresses |
        Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:*.*@*.com'}) -replace '^SMTP:*.*@*.com'}) -join ';'}}
    "ModerationEnabled"
    @{N="ModeratedBy";E= {($_.ModeratedBy | ForEach-Object {
    (Get-AdUser -Filter "DisplayName -eq '$($_.Split("/")[-1])'" -Property ProxyAddresses |
        Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'}) -join ';'}}
    @{Name="Internal Senders Only";E={$_.RequireSenderAuthenticationEnabled}}
    @{N="ManagedBy";E= {($_.ManagedBy | ForEach-Object {
    (Get-AdUser -Filter "DisplayName -eq '$($_.Split("/")[-1])'" -Property ProxyAddresses |
        Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'}) -join ';'}}
        )
Get-DistributionGroup -ResultSize Unlimited | Select-Object $props | export-Csv C:\temp\testforformat.csv -NoTypeInformation
``


对我来说,您似乎在重复相同的 Get-ADUser 代码,这使得 read/modify 变得非常困难。
我建议您创建一个小的辅助函数来获取主 SMTP 电子邮件地址。像这样:

function Get-SMTPAddress ([string]$DisplayName) {
    $filter = "DisplayName -eq '$DisplayName' -and extensionAttribute8 -eq '1'"
    ((Get-AdUser -Filter $filter -Properties DisplayName, ProxyAddresses, extensionAttribute8).ProxyAddresses |
      Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'
}

有了它,构建属性数组会变得更加清晰:

$props = 'DisplayName',
         'SamAccountName',
         'PrimarySmtpAddress',
         @{Name = 'Accepted Senders'
           Expression = {($_.acceptmessagesonlyfromsendersormembers | Foreach-Object { Get-SMTPAddress $_.Split('/')[-1] }) -join ';'}},
         'ModerationEnabled',
         @{Name = 'ModeratedBy'
           Expression = {($_.ModeratedBy | Foreach-Object { Get-SMTPAddress $_.Split('/')[-1] }) -join ';'}},
         @{Name = 'Internal Senders Only'; Expression = {$_.RequireSenderAuthenticationEnabled}},
         @{Name = 'ManagedBy'
           Expression = {($_.ManagedBy | Foreach-Object { Get-SMTPAddress $_.Split('/')[-1] }) -join ';'}}

显然未经测试,这应该会给你输出:

Get-DistributionGroup -ResultSize Unlimited | 
    Select-Object $props | 
    Export-Csv C:\temp\testforformat.csv -NoTypeInformation