public/Import-Users.ps1

Function Import-Users {

<#
.<help keyword>
<help content>
#>



#Requires -RunAsAdministrator
    
    [cmdletbinding(SupportsShouldProcess=$True)]

    Param(
        [Parameter(Mandatory=$true)]
        [string]$csv,
        
        [Parameter(Mandatory=$true)]
        [ValidateSet('johnd','john.d','jdoe','j.doe','john.doe')]
        [string]$UsernameFormat,
        
        [Parameter(Mandatory=$true)]
        [ValidateSet('Staff','Office','Students')]
        [string]$UserType,
        
        [Parameter(Mandatory=$true)]
        [string]$HomeShare,
        
        [Parameter(Mandatory=$true)]
        [string]$ProfileShare,
        
        [string]$Password,
        
        [string]$LogPath = "$env:USERPROFILE\Desktop"
    )


# Setup logging

# Set Variables
$Date = Get-Date -UFormat "%Y-%m-%d"
$LogFolder = "User Import Logs"
$LogFile = "$Date Import Log.csv"
$Log = "$LogPath\$LogFolder\$LogFile"

# Create Log
New-Item $Log -Force

# Store the data from the CSV in the $Users variable
$Users = Import-csv $csv

# Defines what the CSV headers should be

$CorrectHeaders = @(
    'firstname'
    'lastname'
    'description'
    )

# Assigns the actual headers to a variable

$ImportHeaders = (($Users[0].psobject.properties.name))

# Counts the differencnes

$HeaderDiffs = (Compare-Object $CorrectHeaders $ImportHeaders).count

# Throws an error if the differences are not 0

if ($HeaderDiffs -ne '0') {

    Throw "Check your CSV Headers! Should be 'firstname,lastname,description'"

}

# Set some Variables

$Domain = (Get-ADDomain).name
$FullDomain = (Get-ADDomain).dnsroot
$DomainRoot = (Get-ADDomain).DistinguishedName
$HomePath = "$HomeShare\$UserType"
$ProfilePath = "$ProfileShare\$UserType"
$bar = "*" * 125

# Tests for an "Imported Users" OU at root of domain and if it does not exist then it creates it

$ImportOU = "OU=Imported Users,$DomainRoot"

try {
    Get-ADOrganizationalUnit -Identity $ImportOU | Out-Null
    } catch {
    New-ADOrganizationalUnit -Name "Imported Users" -Path $DomainRoot
    }

# Check Home & Profile paths exist

if (!(Test-Path $HomePath)) {
    Throw "Could not find $HomePath!"
}
    
if (!(Test-Path $ProfilePath)) {
    Throw "Could not find $ProfilePath!"
}

# Loop through each row containing user details in the CSV file

foreach ($User in $Users) {

    # Read user data from each field in each row and assign the data to a variable as below
        
    $Firstname      = $User.firstname 
    $Lastname      = $User.lastname
    $FullName    = "$Firstname $Lastname"
    $Description = $User.description

    # Select username format

    if ($UsernameFormat -eq "johnd") {
        $Username = $Firstname + $Lastname.substring(0,1)
        
    }

    if ($UsernameFormat -eq "john.d") {
        $Username = $Firstname + "." + $Lastname.substring(0,1)
    }

    if ($UsernameFormat -eq "jdoe") {
        $Username = $Firstname.substring(0,1) + $Lastname
    }

    if ($UsernameFormat -eq "j.doe") {
        $Username = $Firstname.substring(0,1) + "." + $Lastname
    }

    if ($UsernameFormat -eq "john.doe") {
        $Username = $Firstname + "." + $Lastname
    }
    
    # change to lower case and remove - and '

    $Username    = $Username.ToLower()
    $Username    = $Username.Replace('-','').replace("'",'')

    # Generate a random password and make the first letter a capital

    if ($Password -eq $null) {
        
        $Password = (Get-Culture).TextInfo.ToTitleCase((Invoke-WebRequest "http://www.dinopass.com/password/simple" -Verbose:$False | Select-Object Content -ExpandProperty Content))

        }

    $PasswordSecure = $Password | ConvertTo-SecureString -AsPlainText -Force

    # Create splat of user params
        
    $UserParams = @{
        SamAccountName = $Username
        UserPrincipalName  = "$Username@$FullDomain"
        Name = $FullName
        GivenName = $Firstname
        Surname = $Lastname
        Enabled = $True
        DisplayName = $FullName
        Path = $ImportOU
        ProfilePath = "$ProfilePath\$Username"
        HomeDrive = "H:"
        HomeDirectory = "$HomePath\$Username"
        Description = $Description
        AccountPassword = $PasswordSecure
        ChangePasswordAtLogon = $true
        }

    # Create an object to make reporting later easier
       
    $UserObject = [PSCustomObject]@{

        FirstName       = $Firstname
        LastName        = $Lastname
        UserName        = $Username
        Description     = $Description
        Password        = $Password

        }

    # Export users to CSV File

    if (!(Test-Path $LogFile)) {

        $UserObject | ConvertTo-Csv -NoTypeInformation | Out-File -FilePath $LogFile -Append -Force
    
        }else{

        # Skip CSV headers if file already exists

        $UserObject | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File -FilePath $LogFile -Append -Force
        
        }

    Write-Verbose "Attempting to create $FullName with username $Username and Password $Password"
        
    New-ADUser @UserParams

    Write-Verbose "Creating home directory: $HomePath\$Username"
    # Create users home folder and give them full rights
    New-Item -Name $Username -Path $HomePath -ItemType Directory | Out-Null
        
    Write-Verbose "Setting access rights..."
    $Acl = Get-Acl "$HomePath\$Username"
    $Ar = New-Object  System.Security.AccessControl.FileSystemAccessRule("$Domain\$Username","FullControl","ContainerInherit,ObjectInherit","None","Allow")
    $Acl.SetAccessRule($Ar)
    Set-Acl "$HomePath\$Username" $Acl

    Write-Verbose "Assigning to groups..."
    # Add them to AD groups
    Add-ADGroupMember -Identity $UserType -Members $Username

    # Set password and enable account after group membership (fine grained password policy)
    Write-Verbose "Setting password..."
    Set-ADAccountPassword -Identity $Username -Reset -NewPassword $PasswordSecure
    Set-ADUser -Identity $Username -Enabled $true
    if ($($UserType) -eq "Students") {
        Set-ADUser -Identity $Username -CannotChangePassword $true -ChangePasswordAtLogon $false -PasswordNeverExpires $true
        }

    Write-Verbose "Moving on to next user..."
    Write-Verbose $bar

    }

}