Создание пользователей в AD - PullRequest
1 голос
/ 20 июня 2020

У меня есть CSV-файл со сведениями о сотрудниках, и я хочу выполнить действия по созданию, изменению и отключению в зависимости от статуса сотрудника. В соответствии с CSV.

EmployeeCode,EmployeeID,EmployeName,Firstname,Lastname,Email,Designation,Department,State,ReportingManagerCode,Status
XA0001,1256,Srihari T,Srihari,T,srihari.t@contosso.com,Executive,Finance,Kerala,1258,New
XA0002,1257,Adam Varghese,Adam,Varghese,adam.varghese@contosso.com,TL,CC,Tamil Nadu,1210,Disabled
XA0003,1258,Shakti Velu,Shakti,Velu,shakti.velu@contosso.com,Manager,Finance,Kerala,1205,Existing

В соответствии со структурой подразделения.

contosso.com
    Finance(OU=Finance,DC=contosso,DC=com)
    CC(OU=CC,DC=contosso,DC=com)
    Left(OU=Left,DC=contosso,DC=com)

Ожидаемое решение: если статус пользователя - «Новый», то пользователь создается в своем подразделении подразделения вместе с другими атрибутами . Статус «Отключено» Пользователи отключаются и переходят в левое подразделение. И статус «Существующий» пользователь обновляет свои атрибуты.

Для каждого действия у меня работает отдельный скрипт PowerShell, но я не могу объединить их в один скрипт, проверяя поле статуса.

  1. Может создавать пользователей, но не может найти статус «Новый», чтобы создать его.
Import-Module activedirectory
$ADUsers = Import-csv 'C:\IT\EmployeeDetails.csv'

foreach ($User in $ADUsers)
{       
    $Username   = ($User.Firstname + '.' + $User.Lastname).ToLower()
    $Firstname  = $User.Firstname
    $Lastname   = $User.Lastname
    $OU         = 'OU=Finance,DC=contosso,DC=com'
    $Email      = $User.Email
    $EmployeeID = $User.EmployeeID
    $State      = $User.State
    $Designation   = $User.Designation
    $Department = $User.Department
    $Password = (Get-RandomCharacters -characters AbcDeFgHiJkLmNoPqRsTuVwXyZ!@#*123456789 -length 8)

    #Check to see if the user already exists in AD
    if (Get-ADUser -F {SamAccountName -eq $Username})
    {
         Write-Warning "A user account with username $Username already exist in Active Directory."
    }
    else
    {
        New-ADUser `
            -SamAccountName $Username `
            -UserPrincipalName "$Username@contosso.com" `
            -Name "$Firstname $Lastname" `
            -GivenName $Firstname `
            -Surname $Lastname `
            -Enabled $True `
            -DisplayName "$Firstname $Lastname" `
            -Path $OU `
            -EmployeeID $EmployeeID `
            -State $State `
            -EmailAddress $Email `
            -Title $Designation `
            -Department $Department `
            -AccountPassword (convertto-securestring $Password -AsPlainText -Force) -ChangePasswordAtLogon $True

    }
}
Отключает пользователя, но не может искать в статусе «Отключено», чтобы отключить и перейти в левое подразделение.
Import-Module activedirectory

$ADUsers = Import-csv C:\IT\EmployeeDetails.csv

foreach ($User in $ADUsers)
{
    Get-ADUser -Filter "EmployeeID -eq '$($User.EmployeeID)'" | 
    Move-ADObject -TargetPath "OU=Left,DC=contosso,DC=com" -PassThru | 
    Disable-ADAccount
}
Изменить детали, но невозможно найти Статус как «Существующий», чтобы изменить его.
Import-Module activedirectory

$ADUsers = Import-Csv C:\IT\EmployeeDetails.csv

foreach ($User in $ADUsers)
{
Get-ADUser -Filter "EmployeeID -eq '$($User.EmployeeID)'" | 
Set-ADUser -EmailAddress $User.Email -Title $User.Designation -Department $User.Department -State $User.State
}

1 Ответ

0 голосов
/ 20 июня 2020

Чтобы создать один сценарий из этих частей, я бы предложил создать три функции для

  1. Создать нового пользователя
  2. Переместить и отключить существующего пользователя и
  3. Обновите существующего пользователя

и вызовите любой из них в основном l oop в зависимости от того, какое значение Status в CSV.

Примерно так:

Import-Module ActiveDirectory

function New-User ($record) {
    $AccountName = ($record.Firstname + '.' + $record.Lastname).ToLower()

    #Check to see if the user already exists in AD
    if (Get-ADUser -Filter "SamAccountName -eq '$AccountName'" -ErrorAction SilentlyContinue) {
         $msg = "New-User: a user account with username $AccountName already exist in Active Directory."
         Write-Warning $msg
    }
    else {
        $FullName = ('{0} {1}' -f $record.Firstname, $record.Lastname).Trim()
        $OU       = 'OU={0},DC=contosso,DC=com' -f $record.Department
        $Password = (Get-RandomCharacters -characters AbcDeFgHiJkLmNoPqRsTuVwXyZ!@#*123456789 -length 8)

        $userParams = @{
            SamAccountName        = $AccountName
            UserPrincipalName     = "$AccountName@contosso.com"
            Name                  = $FullName
            GivenName             = $record.Firstname
            Surname               = $record.Lastname
            Enabled               = $true
            DisplayName           = $FullName
            Path                  = $OU
            EmployeeID            = $record.EmployeeID
            State                 = $record.State
            EmailAddress          = $record.Email
            Title                 = $record.Designation
            Department            = $record.Department
            AccountPassword       = (ConvertTo-SecureString $Password -AsPlainText -Force)
            ChangePasswordAtLogon = $true
        }
        # create the user and report back
        New-ADUser @userParams

        # don't forget to output the initial password, the user needs this for the first-time login.
        $msg = "New-User: created user $AccountName. Initial password: $Password"
    }
    # report back
    $msg
}

function Move-User ($record) {
    # check if the user object exists
    $user = Get-ADUser -Filter "EmployeeID -eq '$($record.EmployeeID)'" -ErrorAction SilentlyContinue
    if (!$user) {
        $msg = "Move-User: a user account with EmployeeID $($record.EmployeeID) does not exist."
        Write-Warning $msg
    }
    else {
        $OU = "OU=Left,DC=contosso,DC=com"
        $user | Set-ADUser -Enabled $false
        $user | Move-ADObject -TargetPath "OU=Left,DC=contosso,DC=com"

        $msg = "Move-User: user $($user.SamAccountName) disabled and moved to $OU"
    }
    # report back
    $msg
}

function Update-User ($record) {
    # check if the user object exists
    $props = 'EmailAddress', 'Title', 'Department', 'State'
    $user = Get-ADUser -Filter "EmployeeID -eq '$($record.EmployeeID)'" -Properties $props -ErrorAction SilentlyContinue
    if (!$user) {
        $msg = "Update-User: a user account with EmployeeID $($record.EmployeeID) does not exist."
        Write-Warning $msg
    }
    else {
        $userParams = @{
            EmailAddress = $record.Email
            Title        = $record.Designation
            Department   = $record.Department
            State        = $record.State
        }
        $user | Set-ADUser @userParams

        $msg = "Update-User: user $($user.SamAccountName) updated"
    }
    # report back
    $msg
}

$result = Import-Csv 'C:\IT\EmployeeDetails.csv' | ForEach-Object {
    # perform the actions New, Move or Update
    switch ($_.Status) {
        'New'      { New-User $_ ; break}
        'Disabled' { Move-User $_ ; break}
        'Existing' { Update-User $_ ; break}
        default    { "ERROR: Unknown Status in CSV: $_" }
    }
}

# output the messages on screen
$result

# or write to file
$result | Set-Content -Path 'C:\IT\EmployeeResults.txt'

Обратите внимание, что я не могу проверить, что делает ваша функция Get-RandomCharacters, но предполагаю, что она работает нормально.

Не то, чтобы это важно в этом коде, но там опечатка в одном из заголовков вашего CSV: EmployeName должно быть EmployeeName

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...