在 PowerShell 中获取分发组属性并打印到文件
Get-Distribution Group Attributes in PowerShell and Print to File
因此,在 Stack 周围优秀人士的帮助下,我构建了一个脚本,该脚本轮询 AD 以获取分发组并创建一个 CSV 填充
- 显示名称
- SAM 帐户名称
- 组的主 SMTP 地址
- 已接受发件人的 SMTP 地址,
- 主持人的 SMTP 地址
- 管理人的 SMTP 地址
前 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
因此,在 Stack 周围优秀人士的帮助下,我构建了一个脚本,该脚本轮询 AD 以获取分发组并创建一个 CSV 填充
- 显示名称
- SAM 帐户名称
- 组的主 SMTP 地址
- 已接受发件人的 SMTP 地址,
- 主持人的 SMTP 地址
- 管理人的 SMTP 地址
前 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