<#----------------------------------------------------------------------------------------------------------- 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; } }