Good morning my fine powershell friends! I have a csv that I am using for a new-aduser creation. One of my headers is called Wdate, which holds a date that a user should be expired. I need to add 30 days to it then it will become disabled and moved to a specific OU. I have been reading about parseExact, and although I understand what it does I am not quite sure how to implement it within the script. Any help is greatly appreciated. Below is an example of the csv, and the script I am testing on my test lab.
| SamAccountName | LastName | FirstName | Middle | Pin | Adult | Wdate | Status |
| N417934 | Abbott | Breanna | K | 1234 | A | 2020-07-02 | W |
| S39306650 | Anderson | Ken | G | 1234 | 2020-08-14 | W |
# Import active directory module for running AD cmdlets
Import-Module activedirectory
#Store the data from ADUsers.csv in the $ADUsers variable
#$ADUsers = Import-csv "C:\Powershell\SAM_ACCT.csv"
$ADUsers = Import-csv "C:\Powershell\SAM_ACCT.csv" -header 'SAMACCOUNTNAME','LASTNAME','FIRSTNAME','MIDDLE INITIAL','PIN','ADULT STUDENT','WDATE','STATUS' | Select-Object -Property @{
Name='WDate';
Expression={
[datetime]::ParseExact($($_.wdate),'yyyyMMdd',$null)}
},SAMACCOUNTNAME,LASTNAME,FIRSTNAME,MIDDLE INITIAL,PIN,ADULT STUDENT,STATUS
$a=1; #Variable for Successful Users
$b=1; #Variable for Failed Users
$failedUsers = @()
$successUsers = @()
$VerbosePreference = "Continue"
$LogFolder = "C:\Temp\logs\Focus"
#Loop through each row containing user details in the CSV file
foreach ($User in $ADUsers)
{
#Read user data from each field in each row and assign the data to a variable as below
$Username = $User.SamAccountName
$Password = $User.pin
$Firstname = $User.firstname
$Lastname = $User.lastname
$DisplayName = "$LastName $FirstName"
$Name = "$LastName $Firstname $UserName"
$Status = $User.Status
$Disable = $User.Wdate
#$Disable = (Get-Date).AddDays(30)
$OU_Adult = "OU=S_Adult,OU=Enrolled_Students,DC=testlab,DC=local"
$OU_Student = "OU=N_Student,OU=Enrolled_Students,DC=testlab,DC=local"
$O365Base = "O365SCTIBase"
$O365Email = "O365SCTIEmail"
$O365Base = Get-ADGroup $O365Base
$O365Email = Get-ADGroup $O365Email
#Check if SamAccountName Starts with S or N
if ($Username -like 'S*') {
$OU = "$OU_Adult"
}
if ($Username -like 'N*') {
$OU = "$OU_Student"
}
Try {
if (!(get-aduser -Filter {samaccountname -eq "$UserName"})){
$NewUserParams = @{
'SamAccountName' = "$Username"
'UserPrincipalName' = "$Username@testlab.local"
'Name' = "$Name"
'GivenName' = "$Firstname"
'Surname' = "$Lastname"
'Enabled' = $True
'DisplayName' = "$DisplayName"
'Path' = $OU
'AccountPassword' = (convertto-securestring $Password -AsPlainText -Force)`
}
New-AdUser @NewUserParams
Write-Verbose "[PASS] Created $DisplayName"
$successUsers += $DisplayName + "," +$UserName
if ($Status -like 'W'){
Set-ADAccountExpiration -Identity $Username -DateTime $Disable
Write-Verbose "Account $UserName will expire on $Disable."
}
}
} Catch {
Write-Warning "[ERROR]Can't create user [$($DisplayName)] : $_"
$failedUsers += $DisplayName + "," +$UserName + "," +$_
}
if ( !(test-path $LogFolder)) {
Write-Verbose "Folder [$($LogFolder)] does not exist, creating"
new-item $LogFolder -type directory -Force
}
if ($Username -like 'S*') {
# Add users to O365 Groups
Add-ADGroupMember "$O365Base" -Members "$Username"
Add-ADGroupMember "$O365Email" -Members "$Username"
}
}
Write-verbose "Writing logs"
$failedUsers |ForEach-Object {"$($b).) $($_)"; $b++} | out-file -FilePath $LogFolder\FailedUsers.log -Force -Verbose
$successUsers | ForEach-Object {"$($a).) $($_)"; $a++} | out-file -FilePath $LogFolder\successUsers.log -Force -Verbose
$su=(Get-Content "$LogFolder\successUsers.log").count
$fu=(Get-Content "$LogFolder\FailedUsers.log").count
Write-Host "$fu Users Creation Failed and " -NoNewline -ForegroundColor red
Write-Host "$su Users Successfully Created " -NoNewline -ForegroundColor green
Write-Host "--> Emailing LogsFolder have a Look and review." -ForegroundColor Magenta