我试图为我的公司创建一个工具,在用户帐户到期时向我们的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"
}
}
2条答案
按热度按时间9wbgstp71#
您可以使用
[Datetime]::ParseExact
将字符串转换为日期时间:例如,如果字符串日期格式为:
13.11.2022 00:00:00
您可以这样解析它:
根据需要更改格式,请参阅更多信息:Date Format和DateTime.ParseExact
x8diyxa72#
由于
AccountExpirationDate
已经是一个DateTime对象(LDAP属性accountExpires
,转换为本地时间),您可以直接将其与另一个DateTime对象进行比较。因此,将
$TodaysDate
设置为实际的DateTime对象:然后,您的代码只需要使用展开属性AcCountExpirationDate
或
在那之后,
应该会工作得很好。