EOLLicenseCompliancegroupbased.ps1
<#PSScriptInfo
.VERSION 1.0 .GUID fcba9d8a-0507-4349-9201-406707c5cd02 .AUTHOR Vikas Sukhija .COMPANYNAME http://SysCloudPro.com .COPYRIGHT http://SysCloudPro.com .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES https://syscloudpro.com/2019/05/28/add-to-exchange-online-license-group-based-on-user-status/ Required modules: Activedirectory Module .PRIVATEDATA #> <# .DESCRIPTION This script will check the members of the E3 group and check if Exchnage license group is added or not, if not than it will add the users to EOL License group. Documentation: https://syscloudpro.com/2019/05/28/add-to-exchange-online-license-group-based-on-user-status/ #> ####################Load All Functions############################## param ( [string]$Group1 = $(Read-Host "Enter AD group for E3 License"), [string]$smtpserver = $(Read-Host "Enter SMTP Server"), [string]$from = $(Read-Host "Enter From Address"), [string]$erroremail = $(Read-Host "Enter Address for Report and Errors"), [string]$Group2 = $(Read-Host "Enter AD group for E3 EOL License"), $count = $(Read-Host "Enter threshold for addition and removal") ) function Write-Log { [CmdletBinding()] param ( [Parameter(Mandatory = $true,ParameterSetName = 'Create')] [array]$Name, [Parameter(Mandatory = $true,ParameterSetName = 'Create')] [string]$Ext, [Parameter(Mandatory = $true,ParameterSetName = 'Create')] [string]$folder, [Parameter(ParameterSetName = 'Create',Position = 0)][switch]$Create, [Parameter(Mandatory = $true,ParameterSetName = 'Message')] [String]$Message, [Parameter(Mandatory = $true,ParameterSetName = 'Message')] [String]$path, [Parameter(Mandatory = $false,ParameterSetName = 'Message')] [ValidateSet('Information','Warning','Error')] [string]$Severity = 'Information', [Parameter(ParameterSetName = 'Message',Position = 0)][Switch]$MSG ) switch ($PsCmdlet.ParameterSetName) { "Create" { $log = @() $date1 = Get-Date -Format d $date1 = $date1.ToString().Replace("/", "-") $time = Get-Date -Format t $time = $time.ToString().Replace(":", "-") $time = $time.ToString().Replace(" ", "") foreach ($n in $Name) {$log += (Get-Location).Path + "\" + $folder + "\" + $n + "_" + $date1 + "_" + $time + "_.$Ext"} return $log } "Message" { $date = Get-Date $concatmessage = "|$date" + "| |" + $Message +"| |" + "$Severity|" switch($Severity){ "Information"{Write-Host -Object $concatmessage -ForegroundColor Green} "Warning"{Write-Host -Object $concatmessage -ForegroundColor Yellow} "Error"{Write-Host -Object $concatmessage -ForegroundColor Red} } Add-Content -Path $path -Value $concatmessage } } } function ProgressBar { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] $Title, [Parameter(Mandatory = $true)] [int]$Timer ) For ($i = 1; $i -le $Timer; $i++) { Start-Sleep -Seconds 1; Write-Progress -Activity $Title -Status "$i" -PercentComplete ($i /10 * 100) } } #################Check if logs folder is created################## $logpath = (Get-Location).path + "\logs" $testlogpath = Test-Path -Path $logpath if($testlogpath -eq $false) { ProgressBar -Title "Creating logs folder" -Timer 10 New-Item -Path (Get-Location).path -Name Logs -Type directory } ##########################Load variables & Logs#################### $log = Write-Log -Name "log_EOLE32ADgroup" -folder logs -Ext log ########################mainScript################################ Write-Log -Message "Start Script" -path $log Write-Log -Message "E3 O365 group name: $Group1" -path $log Write-Log -Message "E3 EOL group name: $Group2" -path $log Write-Log -Message "SMTP server: $smtpserver" -path $log Write-Log -Message "From Address: $from" -path $log Write-Log -Message "Alert Email: $erroremail" -path $log Write-Log -Message "Threshhold: $count" -path $log try { Import-Module -Name activedirectory Write-Log -Message "AD Module Loaded" -path $log } catch { $exception = $_.Exception Write-Log -Message "Error loading AD Module Loaded" -path $log -Severity Error Write-Log -Message $exception -path $log -Severity error Send-MailMessage -SmtpServer $smtpserver -To $erroremail -From $from -Subject "Error has occured loading AD Module - EOLLicenseCompliancegroupbased" -Body $($_.Exception.Message) Exit } Write-Log -Message "Start fetching all users from o365 AD E3 $Group1" -path $log $allo365E3users = Get-ADGroup $Group1 -Properties Member | Select-Object -Expand Member | Get-ADUser -Properties msExchRecipientTypeDetails | where{$_.msExchRecipientTypeDetails -eq "2147483648"} | select -ExpandProperty UserPrincipalName Write-Log -Message "Fetched all users from o365 AD E3 $Group1" -path $log Write-Log -Message "Start fetching all users from o365 EOL $Group2" -path $log $allo365CurrentEOLLicusers = Get-ADGroup $Group2 -Properties Member | Select-Object -Expand Member | Get-ADUser -Properties msExchRecipientTypeDetails | where{$_.msExchRecipientTypeDetails -eq "2147483648"} | select -ExpandProperty UserPrincipalName Write-Log -Message "Fetched all users from o365 EOL $Group2" -path $log ###############Comaore to get adds####################################### $change = Compare-Object -ReferenceObject $allo365E3users -DifferenceObject $allo365CurrentEOLLicusers $Addition = $change | Where-Object -FilterScript {$_.SideIndicator -eq "<="} | Select-Object -ExpandProperty InputObject $additioncount = $Addition.count Write-Log -Message "Count of Addition is $additioncount" -path $log if($Addition.count -gt $count) { Write-Log -Message "Count of is greater than $count" -path $log -Severity Warning Write-Log -Message "Script Terminated" -path $log -Severity error Send-MailMessage -SmtpServer $smtpserver -From $from -To $erroremail -Subject "Count of is greater than $count - EOLLicenseCompliancegroupbased" -Body "Count of is greater than $count - EOLLicenseCompliancegroupbased" Exit } else { Write-Log -Message "Processing ---------------- Additions" -path $log $colladditions = @() $Addition | ForEach-Object -Process { $upn = $_ Write-Log -Message "Adding $upn to $Group2" -path $log $getuser = Get-ADUser -Filter {UserPrincipalName -eq $upn} $colladditions += $getuser.samaccountname } Write-Log -Message "Collected all Additions" -path $log $val = 0 $colladditionscoll = @() for($i = 0;$i -lt $colladditions.count) { While($val -ne "100") { $colladditionscoll += $colladditions[$val + $i] $val++ } if($val -eq "100") { $val = 0 $i = $i+100 $colladditionscoll = $colladditionscoll | where{$_} Write-Log -Message "ADD Members ....$colladditionscoll" -path $log ADD-ADGroupMember -identity $Group2 -Members $colladditionscoll -Confirm:$false $colladditionscoll = @() } } } ########################Recycle reports & logs############## $path1 = $logpath $limit = (Get-Date).AddDays(-60) #for report recycling Get-ChildItem -Path $path1 | Where-Object -FilterScript {$_.CreationTime -lt $limit} | Remove-Item -Recurse -Force Write-Log -Message "Script Finished" -path $log Send-MailMessage -SmtpServer $smtpserver -From $from -To $erroremail -Subject "Transcript Log - EOLLicenseCompliancegroupbased" -Body "Transcript Log - EOLLicenseCompliancegroupbased" -Attachments $log ############################################################## |