首页 > 解决方案 > Powershell - Active Directory - 将用户移动到基于 CSV 文件的员工 ID 和日期的 OU

问题描述

我正在尝试制作一个脚本,该脚本将根据 CSV 文件中的日期和员工 ID 将 Active Directory 用户帐户从 1 个 OU 移动到另一个 OU。CSV 文件具有以下列:

“员工编号”、“开始日期”、“结束日期”。示例一:员工编号:123456,开始日期:10/07/2020 结束日期:20/07/2020

该脚本需要在 Active Directory 中搜索员工编号,然后如果“开始日期”与“今天日期”匹配,则将其移至 OU X。如果“结束日期”与“今天日期”匹配,则将其移至 OU Y。

我想通过顶部的变量来做到这一点,如下所示:

$Importcsv = Import-Csv -Path "C:\Temp\Accounts.csv" | select "Employee Number", "Start Date", "End Date"
$xOU =  "OU=Start,OU=Test,DC=MyDomain,DC=local"
$yOU = "OU=End,OU=Test,DC=MyDomain,DC=local"
$CurrentDate = Get-Date -Format dd/MM/yyyy

然后我知道我需要使用“ForEach 代码,然后将所有变量嵌套在其中,但是让它匹配日期然后将其移动到 OU?这就是我卡住的地方!

标签: powershellactive-directory

解决方案


比较日期时最好的做法是将它们作为[DateTime]对象进行比较,而不是它们的字符串表示形式。

此外,您的问题标题EmployeeID显示,但在 CSV 中您似乎使用了EmployeeNumber..
这些是 AD 中的两个不同用户属性,因此您需要确保使用正确的用户属性。

现在,我假设你确实想要属性EmployeeID

$xOU = "OU=Start,OU=Test,DC=MyDomain,DC=local"
$yOU = "OU=End,OU=Test,DC=MyDomain,DC=local"
$CurrentDate = (Get-Date).Date

Import-Csv -Path "C:\Temp\Accounts.csv" | ForEach-Object {
    $id = $_.'Employee Number'
    $user = Get-ADUser -Filter "EmployeeID -eq '$id'" -Properties EmployeeID -ErrorAction SilentlyContinue
    if ($user) {
        # convert the string dates from the CSV into real DateTime objects
        $startDate = [DateTime]::ParseExact($_.'Start Date', 'dd/MM/yyyy', $null)
        $endDate   = [DateTime]::ParseExact($_.'Finish Date', 'dd/MM/yyyy', $null)
        switch ($CurrentDate) {
            $startDate {
                Write-Host "Moving user $($user.Name) to $xOU"
                $user | Move-ADObject -TargetPath $xOu
                break
            }
            $endDate {
                Write-Host "Moving user $($user.Name) to $yOU"
                $user | Move-ADObject -TargetPath $yOu
            }
        }
    }
    else {
        Write-Warning "No user with EmployeeID '$id' found."
    }
}

推荐阅读