尝试在PowerShell中将extensionAttributestring与DateTime进行比较

问题描述

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

今天的情况是,当HR招聘新员工时,他会自动将其开始日期添加到广告中,其开始日期的扩展名格式为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

-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,$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
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...