From d446e4386ffee4fea5c60e7eb95340107d4ff1fa Mon Sep 17 00:00:00 2001 From: AdminDroid <49208841+admindroid-community@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:45:56 +0530 Subject: [PATCH] Configure Email Signature in Outlook --- .../SetupEmailSignatureInOutlook.ps1 | 712 ++++++++++++++++++ 1 file changed, 712 insertions(+) create mode 100644 Configure Email Signature in Outlook/SetupEmailSignatureInOutlook.ps1 diff --git a/Configure Email Signature in Outlook/SetupEmailSignatureInOutlook.ps1 b/Configure Email Signature in Outlook/SetupEmailSignatureInOutlook.ps1 new file mode 100644 index 0000000..57d611e --- /dev/null +++ b/Configure Email Signature in Outlook/SetupEmailSignatureInOutlook.ps1 @@ -0,0 +1,712 @@ +<#----------------------------------------------------------------------------------------------------------- +Name : How to Set Up an Email Signature in Outlook Using PowerShell +Version : 1.0 +Website : o365reports.com + +Script Highlights: +~~~~~~~~~~~~~~~~~ + +1. The script automatically verifies and installs the Exchange PowerShell module (if not installed already) upon your confirmation.  +2. Provides the option to create text signature.  +3. Provides the option to create email signatures using HTML templates.  +4. Provides the option to use default or customized fields and templates.  +5. Allows to create an email signature for all mailboxes.  +6. Allows to filter and set up email signatures for user mailboxes alone.  +7. Allow to set up an email signature for bulk users.  +8. Exports signature deployment status to a CSV file.  +9. Supports certificate-based authentication (CBA) too. + +For detailed script execution: https://o365reports.com/2024/06/18/how-to-set-up-an-email-signature-in-outlook-using-powershell/ + +----------------------------------------------------------------------------------------------------------#> + +#Block for passing params + +[CmdletBinding(DefaultParameterSetName = 'NoParams')] +param +( + [Parameter()] + [string]$Organization, + [Parameter()] + [string]$ClientId, + [Parameter()] + [string]$CertificateThumbprint, + [Parameter()] + [string]$UserPrincipalName, + [Parameter()] + [string]$Password, + [Parameter(ParameterSetName = 'TextSignature_WithDefaultFields')] + [switch]$AssignDefault_TextSignature, + [Parameter(ParameterSetName = 'HTMLSignature_WithInbuiltHTML')] + [switch]$AssignDefault_HTMLSignature, + [Parameter(ParameterSetName = 'GetTextTemplatefromUser')] + [switch]$AssignCustom_TextSignature, + [Parameter(ParameterSetName = 'GetHTMLTemplateFromUser')] + [switch]$AssignCustom_HTMLSignature, + [Parameter()] + [switch]$Enable_PostponeRoamingSignatureUntilLater, + [Parameter()] + [string]$UserListCsvPath, + [Parameter()] + [switch]$AllUsers, + [Parameter()] + [switch]$UserMailboxOnly, + [Parameter(ParameterSetName = 'GetHTMLTemplateFromUser')] + [string]$HTML_FilePath +) + +#--------------------------------------Block For Module Availability Verification and Installation-------------------------------------------- + +$Module = (Get-Module ExchangeOnlineManagement -ListAvailable) +if ($Module.count -eq 0) +{ + Write-Host `n`Exchange Online PowerShell module is not available + $Confirm = Read-Host `n`Are you sure you want to install module? [Y] Yes [N] No + if ($Confirm -match "[yY]") + { + Write-Host "`n`Installing Exchange Online PowerShell module" -ForegroundColor Red + Install-Module ExchangeOnlineManagement -Repository PSGallery -AllowClobber -Force + Import-Module ExchangeOnlineManagement + } + else + { + Write-Host `n`EXO module is required to connect Exchange Online. Please install module using Install-Module ExchangeOnlineManagement cmdlet. -ForegroundColor Yellow + exit + } +} + +#Block For Connecting to Exchangeonline +Write-Host `n`Connecting to Exchange Online... -ForegroundColor Green +if ($UserPrincipalName -ne "" -and $Password -ne "") +{ + $SecurePassword = ConvertTo-SecureString -String $Password -AsPlainText -Force + $UserCredential = New-Object System.Management.Automation.PSCredential ($UserPrincipalName,$SecurePassword) + Connect-ExchangeOnline -Credential $UserCredential +} +elseif ($Organization -ne "" -and $ClientId -ne "" -and $CertificateThumbprint -ne "") +{ + Connect-ExchangeOnline -AppId $ClientId -CertificateThumbprint $CertificateThumbprint -Organization $Organization +} +else +{ + Connect-ExchangeOnline +} + +#------------------------Block for getting the Confirmation from user to enable the PostponeRoamingSignaturesUntilLater parameter if not already enabled------------------------------------ + +if (-not (Get-OrganizationConfig).PostponeRoamingSignaturesUntilLater) +{ + if (-not $Enable_PostponeRoamingSignatureUntilLater) + { + Write-Host "`n`To add a signature for users, first enable 'PostponeRoamingSignatureUntilLater' in the organization's settings." -ForegroundColor Yellow + Write-Host "`n`1. Enable it." -ForegroundColor Cyan + Write-Host "`n`2. Continue without enabling." -ForegroundColor Cyan + $UserConfirmation = Read-Host "`n`Enter Your choice" + } + while ($true) + { + if ($Enable_PostponeRoamingSignatureUntilLater -or $UserConfirmation -eq 1) + { + Set-OrganizationConfig -PostponeRoamingSignaturesUntilLater $true + Write-Host "`n`PostponeRoamingSignatureUntilLater parameter enabled" -ForegroundColor Green + break; + } + elseif ($UserConfirmation -eq 2) + { + Write-Host "`n`Without Enabling it, Signature can be added but not deployed to the Mailboxes" -ForegroundColor Yellow + break; + } + else + { + Write-Host "`n`Enter the correct input" -ForegroundColor Red + $UserConfirmation = Read-Host + continue; + } + } +} +else +{ + Write-Host "`n`PostponeRoamingSignatureUntilLater parameter already enabled" -ForegroundColor Green + $UserConfirmation = 1 +} + +#--------------------------------------------Function to preview the HTML Signature in your browser and get conformation to use that HTML template-------------------------------------------- + +function Preview-Signature ($FilePath) +{ + $FileExtension = [System.IO.Path]::GetExtension($FilePath) + if ($FileExtension -eq ".html" -or $FileExtension -eq ".htm") + { + $HTMLFilePath = $FilePath + } + else + { + Write-Host "`n`The script will terminate as the file isn't in HTML format" -ForegroundColor Red + Disconnect-ExchangeOnline -Confirm:$false + exit + } + $Title = "Confirmation" + $Question = "Do you want to preview the HTML Signature?" + $Choices = "&Yes","&No" + $Decision = $Host.UI.PromptForChoice($Title,$Question,$Choices,1) + if ($Decision -eq 0) { + Start-Process $HTMLFilePath + } + Write-Host @" +`n`Are you sure to deploy the signature with this template? [Y] Yes [N] No +"@ -ForegroundColor Cyan + $UserChoice = Read-Host "`n`Enter your choice" + while ($true) + { + if ($UserChoice -match "[Y]") + { + break + } + elseif ($UserChoice -match "[N]") + { + Write-Host "`n`Exiting the script..." + Disconnect-ExchangeOnline + exit + } + else + { + Write-Host "`n`Enter the correct input" -ForegroundColor Red + $UserChoice = Read-Host + } + } + return +} + +#---------------------------------------------function to get the users to assign an signature------------------------------------------------ + +function Get-UsersForAssignSignature +{ + if ($AllUsers) + { + $ImportUsersType = 1; + } + elseif ($UserListCsvPath) + { + $ImportUsersType = 2; + } + elseif ($UserMailboxOnly) + { + $ImportUsersType = 3; + } + else + { + Write-Host "`n`User-Based Email Signature Deployment:" -ForegroundColor Yellow + Write-Host @" + `n`1. Assign signature to all mailboxes. + `n`2. Assign signature to specific mailboxes (Import CSV). + `n`3. Assign signature to user mailboxes. +"@ -ForegroundColor Cyan + $ImportUsersType = Read-Host "`n`Enter your choice" + } + while ($true) + { + if ($ImportUsersType -eq 1) + { + $UsersCollection = Get-EXOMailbox -ResultSize Unlimited | Select-Object UserPrincipalName | Sort-Object -Property UserPrincipalName -Unique -ErrorAction Stop + $Output = $Output + "to $($UsersCollection.count) Users in the tenant..." + Write-Host $Output + } + elseif ($ImportUsersType -eq 2) + { + if ($UserListCsvPath) + { + $Path = $UserListCsvPath + } + else + { + Write-Host "`n`Enter the csv file Path without quotation (Eg: C:\UsersCollection.csv)" -ForegroundColor Cyan + $Path = Read-Host + } + while ($true) + { + try + { + $Headers = (Import-Csv -Path $Path | Get-Member -MemberType NoteProperty).Name + $UsersCollection = Import-Csv -Path $Path | Select-Object -Property UserPrincipalName | Sort-Object -Property UserPrincipalName -Unique -ErrorAction Stop + if ('UserPrincipalName' -in $Headers -and $UsersCollection.count -gt 1) + { + $Output = $Output + "to $($UsersCollection.count) users in the CSV file..." + Write-Host $Output + break; + } + else + { + Write-Host "`n`The file is empty or does not contain the UserPrincipalName column." -ForegroundColor Red + $Path = Read-Host "`n`Enter correct file path" + continue + } + } + catch + { + Write-Host "`n`You have entered an invalid Path. Enter the correct Path (Eg: C:\UsersCollection.csv)" -ForegroundColor Red + $Path = Read-Host + } + } + } + elseif($ImportUsersType -eq 3) + { + $UsersCollection = Get-EXOMailbox -RecipientTypeDetails UserMailBox -ResultSize Unlimited | Select-Object UserPrincipalName | Sort-Object -Property UserPrincipalName -Unique -ErrorAction Stop + $Output = $Output + "to $($UsersCollection.count) Users in the tenant..." + Write-Host $Output + } + else + { + Write-Host "`n`Enter the correct input : " -ForegroundColor Red + $ImportUsersType = Read-Host + continue; + } + return $UsersCollection + } + +} + +#-------------------------------------------------------------Function to get the content of the HTML with the specified Path---------------------------------------------------------- + +function Get-HTMLContent +{ + if (-not $HTML_FilePath) + { + Write-Host "`n`Enter the HTML file Path without quotation (eg: C:\HTMLfile.html)" -ForegroundColor Cyan + $Path = Read-Host + } + else + { + $Path = $HTML_FilePath + } + while ($true) + { + try + { + $HTMLcontent = Get-Content -Path $Path -Raw -ErrorAction Stop + if ($HTMLcontent.Length -eq 0) + { + Write-Host '`n`You have Provided an empty file' -ForegroundColor Red + $Path = Read-Host '`n`Enter the valid HTML file Path' + continue + } + break; + } + catch + { + Write-Host "`n`You have entered an invalid Path. Enter the correct Path (eg: C:\HTMLfile.html)" -ForegroundColor Red + $Path = Read-Host + } + } + Preview-Signature ($Path) + return [string]$HTMLcontent +} + +#-------------------------------------------------------------Function to get the user required fields for custom template---------------------------------------------------------- + +function Get-RequiredFieldsFromUser +{ + Write-Host @" + `n`You can set up signature using the below fields. + `n`1. Display Name + `n`2. Email Address + `n`3. Mobile Phone + `n`4. Business Phone + `n`5. Fax + `n`6. Department + `n`7. Title + `n`8. Office + `n`9. Address (Street Address, City, State or Province, Zip Code, Country or Region) + `n`10. StreetAddress + `n`11. City + `n`12. StateOrProvince + `n`13. PostalCode + `n`14. CountryOrRegion +"@ -ForegroundColor Yellow + if ($UserChoice -eq 3) + { + $UserChoice = 0 + Write-Host "`n`Enter the field numbers from the list above that you would like to include in the text signature.(Eg: 1,5,6,14)" -ForegroundColor Cyan + } + else + { + Write-Host "`n`Provide the field numbers that need to be change in your HTML signature with users information present in admin center (Eg: 1,5,6,14)" -ForegroundColor Cyan + } + $FieldNumbers = Read-Host "`n`Enter Your choice" + $Numbers = $FieldNumbers -split ',' + return $Numbers +} + +#-----------------------------------------------------------------Function to get the user address ---------------------------------------------------------------------- + +function Generate-UserAddress ($UserDetails) +{ + if ($UserDetails.StreetAddress) + { + $Address += $UserDetails.StreetAddress + ", " + } + if ($UserDetails.City) + { + $Address += $UserDetails.City + ", " + } + if ($UserDetails.StateOrProvince) + { + $Address += $UserDetails.StateOrProvince + ",
" + } + if ($UserDetails.PostalCode) + { + $Address += $UserDetails.PostalCode + ", " + } + if ($UserDetails.CountryOrRegion) + { + $Address += $UserDetails.CountryOrRegion + "." + } + return $Address +} + +#---------------------------------------------------------------Function to generate and Assign default text Signature to the users------------------------------------------------------------------- + +function Deploy-DefaultTextSignature +{ + $UsersCollection = Get-UsersForAssignSignature + $Count = 1 + $TotalCount = $UsersCollection.count + $CurrentTime = Get-Date -Format "yyyyMMdd_HHmmss" + $SignatureLog_FilePath = Join-Path $PSScriptRoot -ChildPath "$CurrentTime-SignatureDeployment_Details.csv" + foreach ($User in $UsersCollection) + { + try { + $UserDetails = Get-User -Identity $User.UserPrincipalName -ErrorAction Stop + if ($UserDetails.DisplayName -ne "") + { + $UserTextSignature += "$($UserDetails.DisplayName)
" + } + if ($UserDetails.UserPrincipalName -ne "") + { + $UserTextSignature += "$($UserDetails.UserPrincipalName)
" + } + if ($UserDetails.Title -ne "") + { + $UserTextSignature += "$($UserDetails.Title)
" + } + if ($UserDetails.MobilePhone -ne "") + { + $UserTextSignature += "$($UserDetails.MobilePhone)
" + } + if ($UserDetails.Phone) + { + $UserTextSignature += "$($UserDetails.Phone)
" + } + $UserTextSignature += Generate-UserAddress ($UserDetails) + Set-MailboxMessageConfiguration -Identity $UserDetails.UserPrincipalName -SignatureHTML $UserTextSignature -AutoAddSignature $true -AutoAddSignatureOnMobile $true -AutoAddSignatureOnReply $true -ErrorAction Stop + $DeploymentStatus = "Successful" + } + catch + { + $ErrorMessage = $_.Exception.Message + $DeploymentStatus = "Unsuccessful : $ErrorMessage " + Write-Host "`n`Signature deployment for $($User.UserPrincipalName) is Unsucessful -Error Occured" -ForegroundColor Red + } + $AuditData = [pscustomobject]@{ UserPrincipalName = $User.UserPrincipalName; DeploymentStatus = $DeploymentStatus } + $AuditData | Export-Csv -Path $SignatureLog_FilePath -NoTypeInformation -Append + Write-Progress -Activity "Deploying Signature : $($Count) of $($TotalCount) | Current User : $($User.UserPrincipalName)" + $Count++ + $UserTextSignature = "" + } + Disconnect_ExchangeOnline_Safely +} + +#---------------------------------------------------------------Function to generate and Assign inbuild HTML Signature to the users------------------------------------------------------------------- + +function Deploy-InbuiltHTMLSignature +{ + $Filepath = Join-Path $PSScriptRoot "Build-InTemplate.html" + try + { + $DefaultHTML = Get-Content $Filepath -ErrorAction Stop + } + catch + { + Write-Host "`n`Inbuilt HTMLFile is not available in the current directory" -ForegroundColor Red + Write-Host "`n`Exiting the Script..." + Disconnect-ExchangeOnline + exit + } + Preview-Signature $Filepath + Write-Host "`n`You can include upcoming fields in the signature by entering a value or simply pressing Enter to skip." -ForegroundColor Yellow + $LogoLink = Read-Host "`n`Enter your company's logo link ( https:// )" + if ($LogoLink -eq "") + { + $DefaultHTML = $DefaultHTML.Replace('','') + } + else + { + $DefaultHTML = $DefaultHTML.Replace('https://cdn0.iconfinder.com/data/icons/logos-microsoft-office-365/128/Microsoft_Office-07-1024.png',$LogoLink) + } + $WebLink = Read-Host "`n`Enter your company's website link ( https:// )" + if ($WebLink -eq "") + { + $DefaultHTML = $DefaultHTML.Replace('%%WebLink%%','') + } + else + { + $DefaultHTML = $DefaultHTML.Replace('%%WebLink%%',$WebLink) + } + $FaceBook = Read-Host "`n`Enter your company's FaceBook link ( https:// )" + if ($FaceBook -eq "") + { + $DefaultHTML = $DefaultHTML.Replace('','') + } + else + { + $DefaultHTML = $DefaultHTML.Replace('%%FaceBook%%',$FaceBook) + } + $Twitter = Read-Host "`n`Enter your company's Twitter link ( https:// )" + if ($Twitter -eq "") + { + $DefaultHTML = $DefaultHTML.Replace('','') + } + else + { + $DefaultHTML = $DefaultHTML.Replace('%%Twitter%%',$Twitter) + } + $YouTube = Read-Host "`n`Enter your company's YouTube link ( https:// )" + if ($YouTube -eq "") + { + $DefaultHTML = $DefaultHTML.Replace('','') + } + else + { + $DefaultHTML = $DefaultHTML.Replace('%%YouTube%%',$YouTube) + } + $LinkedIN = Read-Host "`n`Enter your company's LinkedIn link ( https:// )" + if ($LinkedIN -eq "") + { + $DefaultHTML = $DefaultHTML.Replace('','') + } + else + { + $DefaultHTML = $DefaultHTML.Replace('%%LinkedIN%%',$LinkedIN) + } + $DisCord = Read-Host "`n`Enter your company's DisCord link ( https:// )" + if ($DisCord -eq "") + { + $DefaultHTML = $DefaultHTML.Replace('','') + } + else + { + $DefaultHTML = $DefaultHTML.Replace('%%DisCord%%',$DisCord) + } + $DefaultHTML = [string]$DefaultHTML + $UsersCollection = Get-UsersForAssignSignature + $Count = 1 + $TotalCount = $UsersCollection.count + $CurrentTime = Get-Date -Format "yyyyMMdd_HHmmss" + $SignatureLog_FilePath = Join-Path $PSScriptRoot -ChildPath "$CurrentTime-SignatureDeployment_Details.csv" + foreach ($User in $UsersCollection) + { + try + { + $UserDetails = Get-User -Identity $User.UserPrincipalName -ErrorAction Stop + $Address = Generate-UserAddress ($UserDetails) + $UserHTMLSignature = $DefaultHTML -replace "%%DisplayName%%",$UserDetails.DisplayName -replace "%%Title%%",$UserDetails.Title -replace "%%Email%%",$UserDetails.UserPrincipalName -replace "%%MobilePhone%%",$UserDetails.MobilePhone -replace "%%BusinessPhone%%",$UserDetails.Phone -replace "%%CompanyName%%",$UserDetails.Office -replace "%%Address%%",$Address + Set-MailboxMessageConfiguration -Identity $UserDetails.UserPrincipalName -SignatureHTML $UserHTMLSignature -AutoAddSignature $true -AutoAddSignatureOnMobile $true -AutoAddSignatureOnReply $true -ErrorAction Stop + $DeploymentStatus = "Successful" + } + catch + { + $ErrorMessage = $_.Exception.Message + $DeploymentStatus = "Unsuccessful : $ErrorMessage " + Write-Host "`n`Signature deployment for $($User.UserPrincipalName) is Unsucessful -Error Occured" -ForegroundColor Red + } + $AuditData = [pscustomobject]@{ UserPrincipalName = $User.UserPrincipalName; DeploymentStatus = $DeploymentStatus } + $AuditData | Export-Csv -Path $SignatureLog_FilePath -NoTypeInformation -Append + Write-Progress -Activity "Deploying Signature : $($Count) of $($TotalCount) | Current User : $($User.UserPrincipalName)" + $Count++ + } + Disconnect_ExchangeOnline_Safely +} + +#---------------------------------------------------------------Function to generate and Assign custom text Signature to the users------------------------------------------------------------------- + +function Deploy-CustomTextSignature +{ + $Numbers = Get-RequiredFieldsFromUser + $UsersCollection = Get-UsersForAssignSignature + $Count = 1 + $TotalCount = $UsersCollection.count + $CurrentTime = Get-Date -Format "yyyyMMdd_HHmmss" + $SignatureLog_FilePath = Join-Path $PSScriptRoot -ChildPath "$CurrentTime-SignatureDeployment_Details.csv" + $UsersFields = @{ '1' = 'DisplayName'; '2' = 'UserPrincipalName'; '3' = 'MobilePhone'; '4' = 'Phone'; '5' = 'Fax'; '6' = 'Department'; '7' = 'Title'; '8' = 'Office'; '9' = 'Address'; '10' = 'StreetAddress'; '11' = 'City'; '12' = 'StateOrProvince'; '13' = 'PostalCode'; '14' = 'CountryOrRegion' } + foreach ($User in $UsersCollection) + { + try + { + $UserDetails = Get-User -Identity $User.UserPrincipalName -ErrorAction Stop + $UserTextSignature = "" + foreach ($Number in $Numbers) { + if ($UsersFields[$Number]) { + if ($Number -eq "9") { + $Address = Generate-UserAddress ($UserDetails) + if ($Address -ne "") { + $UserTextSignature += "$($Address)
" + } + } + elseif ($UserDetails.($UsersFields[$Number]) -ne "") { + $UserTextSignature += "$($UserDetails.($UsersFields[$Number]))
" + } + } + } + Set-MailboxMessageConfiguration -Identity $UserDetails.UserPrincipalName -SignatureHTML $UserTextSignature -AutoAddSignature $true -AutoAddSignatureOnMobile $true -AutoAddSignatureOnReply $true -ErrorAction Stop + $DeploymentStatus = "Successful" + } + catch + { + $ErrorMessage = $_.Exception.Message + $DeploymentStatus = "Unsuccessful : $ErrorMessage " + Write-Host "`n`Signature deployment for $($User.UserPrincipalName) is Unsucessful -Error Occured" -ForegroundColor Red + } + $AuditData = [pscustomobject]@{ UserPrincipalName = $User.UserPrincipalName; DeploymentStatus = $DeploymentStatus } + $AuditData | Export-Csv -Path $SignatureLog_FilePath -NoTypeInformation -Append + Write-Progress -Activity "Deploying Signature : $($Count) of $($TotalCount) | Current User : $($User.UserPrincipalName)" + $Count++ + } + Disconnect_ExchangeOnline_Safely + +} + +#---------------------------------------------------------------Function to generate and Assign custom HTML Signature to the users------------------------------------------------------------------- + +function Deploy-CustomHTMLSignature +{ + $HTMLSignature = Get-HTMLContent + $Numbers = Get-RequiredFieldsFromUser + $AddressUsed = $false + $UsersFields = @{ '1' = 'DisplayName'; '2' = 'EmailAddress'; '3' = 'MobilePhone'; '4' = 'BussinessPhone'; '5' = 'FaxNumber'; '6' = 'Department'; '7' = 'Title'; '8' = 'Office'; '9' = 'Address'; '10' = 'StreetAddress'; '11' = 'City'; '12' = 'StateOrProvince'; '13' = 'PostalCode'; '14' = 'CountryOrRegion' } + Write-Host "`n`We need the current values of the following fields to update them with user-specific details." -ForegroundColor Yellow + foreach ($Number in $Numbers) { + if ($UsersFields[$Number]) + { + Write-Host "`n`Enter the $($UsersFields[$Number]) as it appears in the provided HTML:" -ForegroundColor Cyan + while ($true) + { + $ValueInHTML = Read-Host + if ($ValueInHTML -ne "") + { + break + } + else + { + Write-Host "`n`Enter the valid information" -ForegroundColor Red + } + } + if ($Number -eq '9') + { + $AddressUsed = $true + } + if ($ValueInHTML -match "(&|&)") + { + $ValueInHTML = $ValueInHTML -replace "(&|&)","&" + } + $HTMLSignature = $HTMLSignature -replace [regex]::Escape($ValueInHTML),"%%$($UsersFields[$Number])%%" + } + } + $UsersCollection = Get-UsersForAssignSignature + $Count = 1 + $TotalCount = $UsersCollection.count + $CurrentTime = Get-Date -Format "yyyyMMdd_HHmmss" + $SignatureLog_FilePath = Join-Path $PSScriptRoot -ChildPath "$CurrentTime-SignatureDeployment_Details.csv" + foreach ($User in $UsersCollection) + { + try + { + $UserDetails = Get-User -Identity $User.UserPrincipalName -ErrorAction Stop + if ($AddressUsed) { + $Address = Generate-UserAddress ($UserDetails) + } + $UserSignature = $HTMLSignature.Replace('%%DisplayName%%',$UserDetails.DisplayName).Replace('%%EmailAddress%%',$UserDetails.UserPrincipalName).Replace('%%MobilePhone%%',$UserDetails.MobilePhone).Replace('%%BussinessPhone%%',$UserDetails.Phone).Replace('%%FaxNumber%%',$UserDetails.Fax).Replace('%%Department%%',$UserDetails.Department).Replace('%%Title%%',$UserDetails.Title).Replace('%%Office%%',$UserDetails.Office).Replace('%%Address%%',$Address).Replace('%%StreetAddress%%',$UserDetails.StreetAddress).Replace('%%City%%',$UserDetails.City).Replace('%%StateOrProvince%%',$UserDetails.StateOrProvince).Replace('%%PostalCode%%',$UserDetails.PostalCode).Replace('%%CountryOrRegion%%',$UserDetails.CountryOrRegion) + Set-MailboxMessageConfiguration -Identity $UserDetails.UserPrincipalName -SignatureHTML $UserSignature -AutoAddSignature $true -AutoAddSignatureOnMobile $true -AutoAddSignatureOnReply $true -ErrorAction Stop + $DeploymentStatus = "Successful" + } + catch + { + $ErrorMessage = $_.Exception.Message + $DeploymentStatus = "Unsuccessful : $ErrorMessage " + Write-Host "`n`Signature deployment for $($User.UserPrincipalName) is Unsucessful -Error Occured" -ForegroundColor Red + } + $AuditData = [pscustomobject]@{ UserPrincipalName = $User.UserPrincipalName; DeploymentStatus = $DeploymentStatus } + $AuditData | Export-Csv -Path $SignatureLog_FilePath -NoTypeInformation -Append + Write-Progress -Activity "Deploying Signature : $($Count) of $($TotalCount) | Current User : $($User.UserPrincipalName)" + $Count++ + } + Disconnect_ExchangeOnline_Safely +} + +#-------------------function to verify the status of Signature Assign to user and process the auditlog csv file and disconnect the exchangeonline module------------------------- + +function Disconnect_ExchangeOnline_Safely +{ + if (-not ($UserConfirmation -eq 1)) + { + Write-Host "`n`The signature has been added and can be deployed later by enabling 'PostponeRoamingSignatureUntilLater'." + } + Write-Host "`n`Script Execution Completed" + Disconnect-ExchangeOnline -Confirm:$false + Write-Host "`n`The Signature Deployment Status Report available in:" -NoNewline -ForegroundColor Yellow + Write-Host $SignatureLog_FilePath + $Title = "Confirmation" + $Question = "Do you want to View the Signature Deployment Status Report?" + $Choices = "&Yes","&No" + $Decision = $Host.UI.PromptForChoice($Title,$Question,$Choices,1) + if ($Decision -eq 0) { + Start-Process $SignatureLog_FilePath + } + exit +} + +#---------------------------------------Block to call the function as per the user Choice---------------------------- + +$Output = "" +if (-not ($AssignDefault_TextSignature -or $AssignDefault_HTMLSignature -or $AssignCustom_TextSignature -or $AssignCustom_HTMLSignature)) +{ + Write-Host "`n`Signature configuration choices:" -ForegroundColor Yellow + Write-Host @" + `n`1. Create a Text Signature using Default Fields + `n`2. Create an HTML Signature using an In-built HTML Template + `n`3. Create a Text Signature with custom Fields + `n`4. Create an HTML Signature with a user-defined Template +"@ -ForegroundColor Cyan + $UserChoice = Read-Host "`n`Enter Your choice" +} +while ($true) +{ + if ($AssignDefault_TextSignature -or ($UserChoice -eq 1)) + { + $UserChoice = 0 + $Output = "`n`Adding Default Text Signature " + Deploy-DefaultTextSignature + } + elseif ($AssignDefault_HTMLSignature -or $UserChoice -eq 2) + { + $UserChoice = 0 + $Output = "`n`Adding In-build HTML Signature " + Deploy-InbuiltHTMLSignature + } + elseif ($AssignCustom_TextSignature -or $UserChoice -eq 3) + { + $UserChoice = 3 + $Output = "`n`Adding Custom Text Signature " + Deploy-CustomTextSignature + } + elseif ($AssignCustom_HTMLSignature -or $UserChoice -eq 4) + { + $UserChoice = 0 + $Output = "`n`Adding Custom HTML Signature " + Deploy-CustomHTMLSignature + } + else + { + Write-Host "`n`Enter the correct input" -ForegroundColor Red + $UserChoice = Read-Host + continue; + } +}