powershell 将Account ExpirationDate转换为可比较的数据类型

mgdq6dx1  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(105)

我试图为我的公司创建一个工具,在用户帐户到期时向我们的IT发送电子邮件。
到目前为止,这一部分运行得很好。
但我们有个问题。有时我们会更改帐户的到期日。问题是,我将名字保存到了一个txt文件中,因为我们每天晚上都会运行该脚本来检查新的过期帐户。如果Txt不存在,我们每天都会收到数百封电子邮件。
我尝试了多个转换,如“[DateTime]$UserAcCountsExpiredDate-ge$TodaysDate”,但总是出现这样的错误消息:

"@{AccountExpirationDate=13.11.2022 00:00:00}" vom Typ "Selected.Microsoft.ActiveDirectory.Management.ADUser" kann nicht in den Typ "System.DateTime" konvertiert 
werden."
In C:\Scripte\AbgelaufeneUserSkript\Abfrage_abgelaufene_User_NicoTest_Teiltest.ps1:38 Zeichen:9
+      if(([Datetime] $userAccountExpiredDate -ge $TodaysDate))
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastConstructorException

我知道你们中的许多人不会说德语。AcCountExpirationDate无法转换为系统日期时间。
我找不到任何解决办法,所以我现在就在这里。我的原始代码如下:

$Users = Get-ADUser -Filter * -Properties Name, Enabled, AccountExpirationDate, LastLogonDate, department | ? {($_.AccountExpirationDate -NE $NULL -AND $_.AccountExpirationDate -LT (Get-Date)) }
$TxtPath = "C:\scripte\AbgelaufeneUserSkript\Abgelaufene_Benutzer.txt"
$UserDeactivated = Get-Content $TxtPath
$TodaysDate = (Get-Date).ToString()

if(Test-Path $TxtPath)
{

}
else
{
    New-Item $TxtPath
}

echo $TodaysDate

foreach($userintxt in Get-Content $TxtPath)
{
    Write-Host $userintxt
    $userAccountExpiredDate = (Get-ADUser $userintxt -Properties AccountExpirationDate) | Select-Object AccountExpirationDate

    Write-Host $userAccountExpiredDate
    echo $userintxt.Name
     if(($userAccountExpiredDate -ge $TodaysDate))
    {
        Write-Host $userintxt.Name "This account is no more expired"
    }
    else
    {
        Write-Host $userintxt.Name "This account is still expired"
    }   
}
9wbgstp7

9wbgstp71#

您可以使用[Datetime]::ParseExact将字符串转换为日期时间:
例如,如果字符串日期格式为:13.11.2022 00:00:00
您可以这样解析它:

$Date = [datetime]::ParseExact("13.11.2022 00:00:00","dd.MM.yyyy HH:mm:ss",$null)

根据需要更改格式,请参阅更多信息:Date FormatDateTime.ParseExact

x8diyxa7

x8diyxa72#

由于AccountExpirationDate已经是一个DateTime对象(LDAP属性accountExpires,转换为本地时间),您可以直接将其与另一个DateTime对象进行比较。
因此,将$TodaysDate设置为实际的DateTime对象:


# do not stringify it, but instead take the date as DateTime object set to midnight

$TodaysDate = (Get-Date).Date

然后,您的代码只需要使用展开属性AcCountExpirationDate

$userAccountExpiredDate = (Get-ADUser $userintxt -Properties AccountExpirationDate).AccountExpirationDate

$userAccountExpiredDate = Get-ADUser $userintxt -Properties AccountExpirationDate | Select-Object -ExpandProperty AccountExpirationDate

在那之后,

if ($userAccountExpiredDate -ge $TodaysDate) {..}

应该会工作得很好。

相关问题