如何解决尝试在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。)
您正在比较string
和DateTime
。
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
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。