有人可以帮我使用新的powershell密码exp脚本吗?

时间:2018-01-16 19:59:29

标签: powershell

$dates = 30, 10, 3, 2, 1 | ForEach-Object {
(Get-Date).Date.AddDays( - $_)
}
Get-ADUser -Filter { Enabled -eq $true} -Properties Description, 'msDS-UserPasswordExpiryTimeComputed' |
Select-Object SamAccountName, UserPrincipalName, Description,
@{n='PasswordExpires';e={
    [DateTime]::FromFileTime($_.'msDS-UserPasswordExpiryTimeComputed')
}}|
    Where-Object { $_.PasswordExpires.Date -in $dates } |
    ForEach-Object { 
    $daysToExpiry = [Math]::Floor(($_.PasswordExpires - (Get-Date)).TotalDays)

    $mailParams = @{
        To         = $_.UserPrincipalName
        From       = 'blah@blah.com
        Body       = "Your password will expire in $daysToExpiry"
        Subject    = "Password expires in $daysToExpiry"
        SmtpServer = 'blah.smtp.com'
    }
    Send-MailMessage @params
    $_
} | Export-Csv output.csv -NoTypeInformation

有人看到任何突出的东西吗?我在我的测试域中运行此操作,用户设置在30天后过期,他们没有收到任何内容。 csv也是空白的。

1 个答案:

答案 0 :(得分:0)

正如我在评论中所提到的,比较像你这样的日期可能不会很好。我建议的是计算到期前的天数,并将其作为财产添加。然后,您可以查看该数字是否在一系列内容中,以查看其密码是否在X天内过期。

$dates = 30, 10, 3, 2, 1
Get-ADUser -Filter { Enabled -eq $true} -Properties Description, 'msDS-UserPasswordExpiryTimeComputed' |
Select-Object SamAccountName, UserPrincipalName, Description,
@{n='PasswordExpires';e={
    [DateTime]::FromFileTime($_.'msDS-UserPasswordExpiryTimeComputed')
}},
@{n='DaysToExpiry';e={[Math]::Floor(([DateTime]::FromFileTime($_.'msDS-UserPasswordExpiryTimeComputed') - [datetime]::Now).TotalDays)}}|
    Where-Object { $_.DaysToExpiry -in $dates } |
    ForEach-Object { 
    $daysToExpiry = $_.DaysToExpiry

    $mailParams = @{
        To         = $_.UserPrincipalName
        From       = 'blah@blah.com'
        Body       = "Your password will expire in $daysToExpiry"
        Subject    = "Password expires in $daysToExpiry"
        SmtpServer = 'blah.smtp.com'
    }
    Send-MailMessage @params
    $_
} | Export-Csv output.csv -NoTypeInformation

分解:

首先,我将$dates变量更改为数组。具体是您希望通知人们的未来天数。然后,我向每个对象添加了第二个名为“DaysToExpiry”的计算属性,该属性计算密码到期之前的天数(您稍后在脚本中执行此操作)。然后我评估他们的密码是否在$dates变量中定义的一天内到期。在ForEach-Object循环内部,我根据之前定义的属性定义$daysToExpiry,因为不需要两次进行计算。这就是我对剧本所做的所有改变。

编辑:我今天才意识到我在原始声明中对于遇到特定时间未对齐问题的说法不正确。 .Date属性为您提供[DateTime]对象,仅保留日,月和年,其他所有内容都设置为零,因此您不会遇到特定时间问题。现在,那说,我的答案仍然可以正常工作,即使有我新发现的知识,我仍然会采用这种方法,如果是我,但公平地说,我觉得我应该编辑我的答案,包括这些信息。最后,您可能只是删除了原始代码第2行的减号,并让您的代码按预期工作。