【问题标题】:get primary SMTP from Proxyaddresses powershell从 Proxyaddresses powershell 获取主 SMTP
【发布时间】:2020-06-22 14:12:46
【问题描述】:

我正在编写下面的脚本,发布的脚本有效;不幸的是,我需要从proxyaddresses PrimarySMTP 中提取地址(从脚本中的电子邮件字段中提取地址)。我已经疯狂地尝试了这个过程,但无法让它提取和输出信息。希望有人能指出我正确的方向。

$CountA = 1

$CountB = 0

 

Function PasswordExpiration

{

        While ($CountB -ne 5)

    {

        $CountA = $CountA + 1

        $CountB = $CountB + 1

        $FinalPath = "c:\support\PasswordExpiration\PasswordExpiration"+$CountB+"Days.csv"

        $FilterEndDate = (Get-Date).AddDays($CountA).Date

        $FilterStartDate = (Get-Date).AddDays($CountB).Date

        Get-ADUser -Filter * -Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" , 
        EmailAddress, DisplayName, PasswordNeverExpires | 
        where EmailAddress -ne $null |
        where { $_.passwordNeverExpires -eq $false } | 
        where {$_.enabled -eq $true}|

            Select-Object -Property "Displayname", GivenName , EmailAddress,@{Name="Expiration Date";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, PasswordNeverExpires, enabled |

            Where-Object { $_.'Expiration Date' -lt $FilterEndDate} |

            Where-Object { $_.'Expiration Date' -gt $FilterStartDate} |

            Export-Csv -Path $FinalPath -Encoding ascii -NoTypeInformation

    }

}

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    显然我无法对此进行测试,但我注意到了一些事情,所以我在下面清理了一下:

    1. EmailAddress 不是您要查找“邮件”的 AD 属性
    2. 邮件有时与 ProxyAddesses 属性上的主 SMTP 地址不同。该属性作为字符串数组返回。要隔离主节点,您需要查找以首字母“SMTP:”开头的主节点。下面我使用了字符串.StartsWith() 方法来隔离它。该方法区分大小写,因此应该可以使用。

    我还删除了很多到 Where-Object 的管道,因为您可以使用 -and 运算符。

    如果您没有理由相信邮件属性会偏离 ProxyAddresses 属性上的主地址,请像这样使用它:

    Function PasswordExpiration
    {
        $ExpirationDate = @{Name = "Expiration Date"; Expression = { [DateTime]::FromFileTime( $_."msDS-UserPasswordExpiryTimeComputed" ) } }
        While ($CountB -ne 5)
        {
            $CountA = $CountA + 1
            $CountB = $CountB + 1
    
            $FinalPath  = "c:\support\PasswordExpiration\PasswordExpiration"+$CountB+"Days.csv"
            $Properties = "DisplayName", "msDS-UserPasswordExpiryTimeComputed", "mail","ProxyAddresses", "PasswordNeverExpires"
            
            $FilterEndDate   = (Get-Date).AddDays($CountA).Date
            $FilterStartDate = (Get-Date).AddDays($CountB).Date
    
            Get-ADUser -Filter * -Properties $Properties | 
            Where-Object{$_.mail -and !$_.passwordNeverExpires -and $_.enabled } |
            Select-Object -Property Displayname, GivenName, mail, $ExpirationDate, PasswordNeverExpires, Enabled | 
            Where-Object { $_.'Expiration Date' -lt $FilterEndDate -and $_.'Expiration Date' -gt $FilterStartDate } | 
            Export-Csv -Path $FinalPath -Encoding ascii -NoTypeInformation 
        }
    } # End Function PasswordExpiration
    

    否则你可以像这样解析ProxyAddresses:

    Function PasswordExpiration
    {
        While ($CountB -ne 5)
        {    
            $CountA = $CountA + 1
            $CountB = $CountB + 1
    
            $FinalPath  = "c:\support\PasswordExpiration\PasswordExpiration"+$CountB+"Days.csv"
            $Properties = "DisplayName", "msDS-UserPasswordExpiryTimeComputed", "mail", "ProxyAddresses", "PasswordNeverExpires"
    
            #Calculated Property Expressions:
            $EmailAddress   = @{Name = "EmailAddress"; Expression = { ( ( $_.ProxyAddresses.Where( { $_.StartsWith( 'SMTP:' ) } ) ) -replace 'SMTP:' )  } }
            $ExpirationDate = @{Name = "Expiration Date"; Expression = { [DateTime]::FromFileTime( $_."msDS-UserPasswordExpiryTimeComputed" ) } }
                    
            $FilterEndDate   = (Get-Date).AddDays($CountA).Date
            $FilterStartDate = (Get-Date).AddDays($CountB).Date
    
            Get-ADUser -Filter * -Properties $Properties | 
            Where-Object{$_.mail -and !$_.passwordNeverExpires -and $_.enabled } |
            Select-Object Displayname, GivenName, $EmailAddress, $ExpirationDate, PasswordNeverExpires, Enabled  |
            Where-Object { $_.'Expiration Date' -lt $FilterEndDate -and $_.'Expiration Date' -gt $FilterStartDate } |
            Export-Csv -Path $FinalPath -Encoding ascii -NoTypeInformation
        }
    } # End Function PasswordExpiration
    

    考虑到我不在你的情况下,显然这是非常粗略的,但应该给你足够的时间来度过它。

    【讨论】:

    • 工作得很好,虽然替换方法破坏了搜索,除了那个高手!!!任何线索我将如何解决这个问题,表达式是这样的。但我仍然留下那个讨厌的 SMTP:@{Name = "PrimaryEmail";表达式 = { $_.ProxyAddresses.Where( { $_.StartsWith( 'SMTP:') } ) } }
    • 我编辑了答案。我不确定 oyu 中断搜索是什么意思,但我错过了键入的 SMTP,并且还必须将部分计算属性包装在子表达式中。我还将表达式哈希移动到变量中,以使下部更具可读性。再说一次,我不是你的情况,所以我的大部分注意力都集中在纠正那个表达上。希望它足以将它折叠到您的项目中。让我知道事情的后续。如果您同意,请不要忘记标记为已回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2012-07-24
    相关资源
    最近更新 更多