Powershell - 用于更改 AD 用户到期日期的滚动脚本

Powershell - Rolling script to change AD user expiration dates

我正在寻找一个用于即时修改 AD 帐户到期日期的脚本。我在下面编写的脚本大部分都可以工作,但并不能完全按照我想要的方式工作(我是一个 Powershell 菜鸟)。

我制作了一个滚动脚本,要求输入用户名,然后是新的到期日期,然后显示已更改的日期,然后重新开始。问题是,如果我输入 05/07/2021,例如,它将 AD 中的到期日期设置为 04/07/2021 午夜,但脚本报告日期已更改为 05/07/2021。理想情况下,我希望将其更改为 2021 年 7 月 5 日午夜,但让脚本将更改日期报告为 2021 年 7 月 5 日,而不是 2021 年 7 月 6 日。

我想通过这样做将输入日期向前滚动 24 小时:

[datetime]$AD_User_date = Read-Host "Enter a new expiry date, in the format DD/MM/YYYY"
$AD_User_date_2 = $AD_User_date.AddHours(24)

Set-ADAccountExpiration -Identity $AD_User -DateTime $AD_User_date_2

但这会将日期格式更改为美国,因此输入 05/07/2021 会将帐户到期日期更改为 07/05/2021。真可惜。

我目前的代码是超级基础的,我可能遗漏了一个明显的方法,请看一下,让我知道哪里出错了:

Clear-Host

$continue = $true

while ($continue){

write-host "AD Account Date Changer"

$AD_User = Read-Host "Enter username"

$AD_User = $AD_User.Trim()

$AD_User_date = Read-Host "Enter a new expiry date, in the format DD/MM/YYYY"

Set-ADAccountExpiration -Identity $AD_User -DateTime $AD_User_date

$AD_User_date_collect = Get-ADUser -Identity $AD_User -Properties AccountExpirationDate | select -ExpandProperty AccountExpirationDate

$AD_User_date_collect_2 = $AD_User_date_collect.ToString("dd-MM-yyyy")

Write-Host "New account expiration date is $AD_User_date_collect_2"

Write-Host ""

}

提前致谢。

您可能没有您认为的问题。

如果你这样做:

Set-ADAccountExpiration -Identity $AD_User -DateTime '05/07/2021'

然后

Get-ADUser -Identity $AD_User -Properties AccountExpirationDate 

到期日期将显示为 05/07/2021 00:00:00,即 5 日的开始。如果您查看 AD 用户和计算机,它将显示 04/07/2021,但是标题清楚地显示 "End of:",使很明显该帐户将在 4 日全天活跃:

综上所述,这是您的脚本,其中包含一些日期验证:

Clear-Host
$continue = $true

while ($continue){
    write-host "AD Account Date Changer"
    $AD_User = Read-Host "Enter username"

    $AD_User = $AD_User.Trim()

    $AD_User_date = new-object datetime
    do{
     $Entered_Date= Read-Host "Enter a new expiry date, in the format DD/MM/YYYY"
     $result = [datetime]::tryparseexact($Entered_Date,'dd/MM/yyyy',[cultureinfo]("en-GB"), [globalization.datetimestyles]("None"),[ref]$AD_User_date)
     if(!$result){write-host 'Invalid date entered!'}
    }until($result)


    try{
        Set-ADAccountExpiration -Identity $AD_User -DateTime $AD_User_date.AddHours(24)
        Write-Host "New account expiration date is the end of $(($AD_User_date).toString('dd/MM/yyyy'))"
    }catch{
        Write-Host "Unable to set account expiry: $_"
    }
    Write-Host ""
}