尝试在 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.)
您正在比较 string
和 DateTime
。
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
}
}
我目前正在编写一个 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.)
您正在比较 string
和 DateTime
。
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
}
}