SKOBOnlineUsers2ADGroup.ps1


<#PSScriptInfo
 
.VERSION 1.0
 
.GUID fcba9d8a-0507-4349-9201-406707c5cdad
 
.AUTHOR Vikas Sukhija
 
.COMPANYNAME http://SysCloudPro.com
 
.COPYRIGHT http://SysCloudPro.com
 
.TAGS
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 https://syscloudpro.com/2019/04/23/add-all-skype-for-business-online-users-to-ad-group/
 
Required modules:
 
Skype Module
Activedirectory Module
 
.PRIVATEDATA
 
#>


<#
 
.DESCRIPTION
 This script will add all SKOB users to AD group
Documentation: https://syscloudpro.com/2019/04/23/add-all-skype-for-business-online-users-to-ad-group/
#>
 
param (
  [string]$Group = $(Read-host "Enter AD group"),
  [string]$smtpserver = $(Read-host "Enter SMTP Server"),
  [string]$from = $(Read-host "Enter From Address"),
  [string]$erroremail = $(Read-host "Enter Address for Report and Errors"),
  $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_SKOBONline2ADgroup" -folder logs -Ext log

$group 
$smtpserver
$from
$erroremail
$count

########################mainScript################################
Write-Log -Message "Start Script" -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 - SKOBOnlineUsers2ADGroup" -Body $($_.Exception.Message)
  Exit
}

$Allskobonlineusers = Get-CsUser -Filter {HostingProvider -eq "sipfed.online.lync.com"} | Select -ExpandProperty UserPrincipalName
Write-Log -Message "Fetched all SKOB users" -path $log 

  $allUPN = Get-ADGroup  $group -Properties Member | 
  Select-Object -ExpandProperty Member |
  Get-ADUser |
  Select-Object -ExpandProperty UserPrincipalName
  Write-Log -Message "Fetched all UPN from $group" -path $log

###############Comaore to get adds/removes########################
$change = Compare-Object -ReferenceObject $Allskobonlineusers -DifferenceObject $allUPN 

$Removal = $change |
Where-Object -FilterScript {$_.SideIndicator -eq "=>"} |
Select-Object -ExpandProperty InputObject

$Addition = $change |
Where-Object -FilterScript {$_.SideIndicator -eq "<="} |
Select-Object -ExpandProperty InputObject

$removalcount = $Removal.count
$additioncount = $Addition.count
Write-Log -Message "Count of removal is $removalcount" -path $log
Write-Log -Message "Count of Addition is $additioncount" -path $log

if(($Removal.count -gt $count) -or ($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 - SKOBOnlineUsers2ADGroup" -Body "Count of is greater than $count - SKOBOnlineUsers2ADGroup"
  break
}
else
{
  Write-Log -Message "Processing --------------- removals" -path $log
  $collremoves=@()
  $Removal | ForEach-Object -Process {
    $upn = $_
    Write-Log -Message "Removing $upn from $group" -path $log
    $getuser = Get-ADUser -Filter {UserPrincipalName -eq $upn} 
    $collremoves+=$getuser.samaccountname
    }
  Write-Log -Message "Collected all Removals" -path $log
  
  $val=0
  $collremovescoll = @()
  for($i=0;$i -lt $collremoves.count){
    While($val -ne "100"){
      $collremovescoll+=$collremoves[$val + $i]
      $val++
    }
    if($val -eq "100"){
      $val=0
      $i=$i+100
      $collremovescoll = $collremovescoll | where{$_}
      Write-Log -Message "Remove Members ....$collremovescoll" -path $log
        Remove-ADGroupMember -identity $group -Members $collremovescoll -Confirm:$false
        $collremovescoll=@()
    }
  }
  
  
  Write-Log -Message "Processing ---------------- Additions" -path $log
  $colladditions=@()
  $Addition | ForEach-Object -Process {
    $upn = $_
    Write-Log -Message "Adding $upn to $group" -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 $group -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 - SKOBOnlineUsers2ADGroup" -Body "Transcript Log - SKOBOnlineUsers2ADGroup" -Attachments $log

##############################################################