Public/New-AdUserFromSyncHr.ps1

function New-AdUserFromSyncHr
{
    [CmdletBinding(PositionalBinding = $true)]
    param
    (
        [Parameter(Mandatory = $true)][object]$SyncHrNewHire
    )

    Write-Log "Starting function" -EmployeeId $SyncHrNewHire.empNo

    $returnObj = New-Object -TypeName psobject -Property @{
        Result = ''
    }

    $username = $SyncHrNewHire.fName + "." + $SyncHrNewHire.lname
    $name = $SyncHrNewHire.fName + " " + $SyncHrNewHire.lname

    $newEmpNumber = Convert-SyncHrEmpNo -SyncHrEmpNo $SyncHrNewHire.empNo

    $password = $($SyncHrNewHire.fName).SubString(0, 1) + $($SyncHrNewHire.lname).SubString(0, 1) + "#" + $newEmpNumber
    $password_ss = ConvertTo-SecureString $password -AsPlainText -Force

    $newEmail = "$username@$($SyncHrNewHire.defaultDomain)"
    
    $manager = $null
    if ($SyncHrNewHire.manager_empNo.Length -gt 3)
    {
        $managerEmployeeNumber = Convert-SyncHrEmpNo -SyncHrEmpNo $SyncHrNewHire.manager_empNo
        try
        {
            $managerFilter = "EmployeeNumber -eq ""$managerEmployeeNumber"""
            $manager = Get-ADUser -Filter $managerFilter -Properties manager -ErrorAction: Stop | Select-Object -First 1
        }
        catch
        {

        }
    }

    try
    {
        $newUserHash = @{
            EmployeeNumber        = $newEmpNumber
            SamAccountName        = $username
            UserPrincipalName     = $newEmail
            Email                 = $newEmail
            Name                  = $name
            DisplayName           = $name
            GivenName             = $SyncHrNewHire.fname
            Surname               = $SyncHrNewHire.lname
            Enabled               = $True
            ChangePasswordAtLogon = $True
            Title                 = $SyncHrNewHire.positionTitle
            Path                  = $SyncHrNewHire.defaultOu
            Manager               = $manager.DistinguishedName
            Office                = $SyncHrNewHire.location_name
            StreetAddress         = $SyncHrNewHire.location_street
            City                  = $SyncHrNewHire.location_city
            State                 = $SyncHrNewHire.location_state
            PostalCode            = $SyncHrNewHire.location_zip
            Company               = $SyncHrNewHire.companyName
            AccountPassword       = $password_ss
            Homedrive             = "H"
            Homedirectory         = "\\svrfp01\Home\$username"
            ErrorAction           = 'Stop'
        }

        Write-Log -LogText "Creating new user: $($newUserHash | ConvertTo-Json -Compress)" -EmployeeId $SyncHrNewHire.empNo

        New-ADUser @newUserHash

        Start-Sleep -Seconds 3
        $newUser = Get-AdUser $username -Properties Office, EmployeeNumber -ErrorAction Stop

        $returnObj | Add-Member -MemberType: NoteProperty -Name SamAccountName -Value $newUser.SamAccountName
        $returnObj | Add-Member -MemberType: NoteProperty -Name Office -Value $newUser.Office
        $returnObj | Add-Member -MemberType: NoteProperty -Name EmployeeNumber -Value $newUser.EmployeeNumber
        $returnObj | Add-Member -MemberType: NoteProperty -Name newPassword -Value $password
        $returnObj | Add-Member -MemberType: NoteProperty -Name managerName -Value $manager.Name

        $returnObj.Result = 'OK'

    }
    catch
    {
        Write-Log "Error with New-AdUser. SynrHr user: $name ($($SyncHrNewHire.empNo))" -LogType: error -ErrorObject $_ -EmployeeId $SyncHrNewHire.empNo
        $returnObj.Result = "Error: $($_.Exception.Message)"
    }

    $proxyAddresses = @(
        "SMTP:$newEmail"
    )

    foreach ($proxy in $SyncHrNewHire.domainProxyList)
    {
        $proxyAddresses += "smtp:$username@$proxy"
    }

    try
    {
        foreach ($proxy in $proxyAddresses)
        {
            Set-ADUser -Identity $username -Add @{ ProxyAddresses = $proxy }
        }
        
    }
    catch
    {
        Write-Log "Error with Set-AdUser. SynrHr user: $name ($($SyncHrNewHire.empNo)). Command: ""Set-ADUser -Identity $username -Add @{ProxyAddresses = $proxy}""" -LogType: error -ErrorObject $_ -EmployeeId $SyncHrNewHire.empNo
    }

    try
    {
        Add-ADGroupMember -Identity $SyncHrNewHire.positionTitle -Members $username
    }
    catch
    {
        Write-Log "Error with Add-ADGroupMember. SynrHr user: $name ($($SyncHrNewHire.empNo)). Command: ""Add-ADGroupMember -Identity $($SyncHrNewHire.positionTitle) -Members $username""" -LogType: error -ErrorObject $_ -EmployeeId $SyncHrNewHire.empNo
    }

    if ($SyncHrNewHire.homeFolder.Length -gt 3)
    {
        try
        {
            $homeFolder = Join-Path $SyncHrNewHire.homeFolder $username
            #Create Home Folder if one does not exist, make a new one and set the correct permissions.
            if ( (Test-Path $homeFolder) -eq $false)
            {
                $acl = Get-Acl (New-Item -Path $SyncHrNewHire.homeFolder -Name $username -ItemType Directory -Verbose)

                # Make sure access rules inherited from parent folders.
                $acl.SetAccessRuleProtection($false, $true)

                $ace = $username, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
                $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($ace)
                $acl.AddAccessRule($objACE)
                Set-ACL -Path $homeFolder -AclObject $acl -Verbose

                Write-Log "Home folder added successfully: ""$homeFolder""" -EmployeeId $SyncHrNewHire.empNo
            
            }
            else
            {
                Write-Log "Home folder ""$homeFolder"" already exists. Skipping home folder creation" -LogType: warning -EmployeeId $SyncHrNewHire.empNo
            }
        }
        catch
        {
            Write-Log "An error occurred in adding the home directory:" -LogType error -ErrorObject $_ -EmployeeId $SyncHrNewHire.empNo
        }
    }
    else
    {
        Write-Log "Skipping home folder creation. SyncHrNewHire.homeFolder value ""$($SyncHrNewHire.homeFolder)""" -LogType: warning -EmployeeId $SyncHrNewHire.empNo
    }


    Write-Log "Completing function" -EmployeeId $SyncHrNewHire.empNo

    return $returnObj



}