尝试在 PowerShell 中将 extensionAttribute(字符串)与 DateTime 进行比较

Trying to compare extensionAttribute (string) to DateTime in PowerShell

我目前正在编写一个 PowerShell 脚本,可以自动 Enable/Disable 我公司的新员工。

今天的情况是,当 HR 招聘新员工时,他会自动在 AD 中添加他的开始日期,格式为这种格式 - dd/MM/yyyy。 我需要每天 运行 的脚本,如果开始日期等于今天,则启用此用户,如果不是,则用户可以以某种方式启用将其更改回禁用(有时 IT 人员启用新用户以便执行为他们进行一些设置而忘记禁用它)。

这是我的非工作脚本,知道哪里出了问题吗?

Import-Module ActiveDirectory 

$currentDate = Get-Date -Format "dd/MM/yyyy"
$startingDate = [datetime]::parseexact($startingDate, 'dd/MM/yyyy', $null)
$startingDate = ([datetime]$user.extensionAttribute2)
$SearchBase = "DC=DC,DC=DC"
$NewHires = Get-ADUser -SearchBase $SearchBase -Properties extensionAttribute2 -Filter {(extensionAttribute2 -like '*')}

foreach ($User in $NewHires) {
try {
if ($startingDate -eq $currentDate) {
  Set-ADUser -Identity $User.SamAccountName -Enabled $true
}
else {
if($startingDate -gt $currentDate) {
  Set-ADUser -Identity $User.SamAccountName -Enabled $false
}}
} catch { Write-Output Out-File $User.SamAccountName has bad value in attribute | -Filepath $logpath -Append
}} 

"$startingDate = ([datetime]$user.extensionAttribute2)" 必须在 foreach 循环内(在 if 语句之前)。

当它在外部时,它永远不会设置为实际用户的数据。

Import-Module ActiveDirectory 

$currentDate = Get-Date
$SearchBase = "DC=DC,DC=DC"
$NewHires = Get-ADUser -SearchBase $SearchBase -Properties extensionAttribute2 -Filter {(extensionAttribute2 -like '*')}

foreach ($User in $NewHires) {
    $startingDate = [datetime]::parseexact($User.extensionAttribute2, 'dd/MM/yyyy', $null)
try {
if ($startingDate -eq $currentDate) {
  Set-ADUser -Identity $User.SamAccountName -Enabled $true
}
else {
if($startingDate -gt $currentDate) {
  Set-ADUser -Identity $User.SamAccountName -Enabled $false
}}
} catch { Write-Output Out-File $User.SamAccountName has bad value in attribute | -Filepath $logpath -Append
}} 

您的脚本存在一些问题。

1.)

您正在比较 stringDateTime

Get-Date returns 如果指定 -Format 则为字符串。省略那个开关,只使用 Get-Date,所以 $currentData$startingDate 都是 DateTime。此外,使用 Date 属性 仅获取日期组件。

2.)

你的循环似乎在错误的地方。将日期时间解析 放入 循环中。

3.)

您的文件输出方式不正确。查看我的更新版本。

另外,一些改进建议:

  • 最好不要依赖 try/catch 来检查值是否有效。您可以使用 TryParseExact.
  • 使用管道和 ForEach-Object 来简化您的脚本

更新的脚本:

Import-Module ActiveDirectory 
$currentDate = (Get-Date).Date
[dateTime]$startingDate = 0
$SearchBase = "DC=DC,DC=DC"
Get-ADUser -SearchBase $SearchBase -Properties extensionAttribute2 -Filter {(extensionAttribute2 -like '*')} | ForEach-Object {
    if ([datetime]::TryParseExact($_.extensionAttribute2, 'dd/MM/yyyy', $null, 'None', [ref]$startingDate)) {
        if ($startingDate -eq $currentDate) {
          Set-ADUser -Identity $_.SamAccountName -Enabled $true
        }
        elseif($startingDate -gt $currentDate) {
          Set-ADUser -Identity $_.SamAccountName -Enabled $false
        }
    }
    else {
        "$($_.SamAccountName) has bad value in attribute" | Out-File $logpath -Append
    }
}