public/Import-UcmCsOnPremTools.ps1

#PerformScriptSigning
Function Import-UcmCsOnPremTools {
    <#
        .SYNOPSIS
        Function to check for and import both Skype4B and AD Management tools
 
        .DESCRIPTION
        Checks for and loads the approprate modules for Skype4B and Active Directory
        Will throw an error and abort script if they arent found
 
        .INPUTS
        This function does not accept pipelined input
 
        .OUTPUTS
        This function does not create pipelined output
        This Cmdet returns a PSCustomObject with multiple keys to indicate status
        $Return.Status
        $Return.Message
 
        Return.Status can return one of four values
        "OK" : Imported All Modules successfully
        "Warning" : Modules are already loaded
        "Error" : Something happend when attempting to import the modules, check $return.message for more information
        "Unknown" : Cmdlet reached the end of the function without returning anything, this shouldnt happen, if it does please log an issue on Github
 
        Return.Message returns descriptive text for error messages.
 
        .LINK
        https://www.UcMadScientist.com
        https://github.com/Atreidae/UcmPSTools
 
        .NOTES
        Version: 1.0
        Date: 18/11/2021
 
        .VERSION HISTORY
        1.0: Initial Public Release
 
        .ACKNOWLEDGEMENTS
    #>

    [CmdletBinding()]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Scope='Function')] #stop PSScriptAnalyzer complaining that we refer to the onpremtools as tools instead of a tool
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseProcessBlockForPipelineCommand', '', Scope='Function')] #todo, https://github.com/Atreidae/UcmPSTools/issues/23

    PARAM
    (
        #No Parameters
    )

    #region FunctionSetup, Set Default Variables for HTML Reporting and Write Log
    $function = 'Import-CsOnPremTools'
    [hashtable]$Return = @{}
    $return.Function = $function
    $return.Status = "Unknown"
    $return.Message = "Function did not return a status message"

    # Log why we were called
    Write-UcmLog -Message "$($MyInvocation.InvocationName) called with $($MyInvocation.Line)" -Severity 1 -Component $function
    Write-UcmLog -Message "Parameters" -Severity 1 -Component $function -LogOnly
    Write-UcmLog -Message "$($PsBoundParameters.Keys)" -Severity 1 -Component $function -LogOnly
    Write-UcmLog -Message "Parameters Values" -Severity 1 -Component $function -LogOnly
    Write-UcmLog -Message "$($PsBoundParameters.Values)" -Severity 1 -Component $function -LogOnly
    Write-UcmLog -Message "Optional Arguments" -Severity 1 -Component $function -LogOnly
    Write-UcmLog -Message "$Args" -Severity 1 -Component $function -LogOnly


    #endregion FunctionSetup

    #region FunctionWork

    #Check to see if the modules are already loaded
    Write-UcmLog -Message 'Checking for Lync/Skype management tools' -Severity 1 -Component $function
    $CsManagementTools = $false
    $ADManagementTools = $false
    if(Get-Module -Name 'SkypeForBusiness') {$CSManagementTools = $true}
    if(Get-Module -Name 'Lync') {$CSManagementTools = $true}
    if(Get-Module -Name 'ActiveDirectory') {$ADManagementTools = $true}

    #If both modules are loaded, return a warning and exit
    If (($CSManagementTools -eq $true) -and ($ADManagementTools -eq $true))
    {
        Write-UcmLog -Message "Management moduled already loaded" -Severity 1 -Component $function
        $Return.Status = "Warning"
        $Return.Message = "Management moduled already loaded"
        Return $Return
    }

    #Now, check the modules are installed.
    $CsManagementTools = $false
    $ADManagementTools = $false
    if(Get-Module -Name 'SkypeForBusiness' -ListAvailable) {$CSManagementTools = $true}
    if(Get-Module -Name 'Lync'-ListAvailable) {$CSManagementTools = $true}
    if(Get-Module -Name 'ActiveDirectory' -ListAvailable) {$ADManagementTools = $true}

    #Return an error if we cant find Lync/Skype
    If ($CSManagementTools -ne $true)
    {
        Write-UcmLog -Message "Unable to locate Lync or Skype PowerShell modules" -Severity 3 -Component $function
        Write-UcmLog -Message "Have you installed the Management tools on this host?" -Severity 3 -Component $function
        $Return.Status = "Error"
        $Return.Message = "Lync/Skype PS Module Missing"
        Return $Return
    }

    #Return an error if we cant find Active Directory
    If ($ADManagementTools -ne $true)
    {
        Write-UcmLog -Message "Unable to locate Active Directory PowerShell modules" -Severity 3 -Component $function
        Write-UcmLog -Message "Have you installed the AD RSAT Management tools on this host?" -Severity 3 -Component $function
        $Return.Status = "Error"
        $Return.Message = "ActiveDirectory PS Module Missing"
        Return $Return
    }


    #Okay, we got this far, import everything
    Try
    {
        if(!(Get-Module -Name 'SkypeForBusiness')) {Import-Module -Name SkypeForBusiness -Verbose:$false}
        if(!(Get-Module -Name 'Lync')) {Import-Module -Name Lync -Verbose:$false}
        if(!(Get-Module -Name 'ActiveDirectory')) {Import-Module -Name Lync -Verbose:$false}
        if(Get-Module -Name 'SkypeForBusiness') {$CsManagementTools = $true}
        if(Get-Module -Name 'Lync') {$CsManagementTools = $true}
        if(Get-Module -Name 'ActiveDirectory') {$AdManagementTools = $true}

    }
    Catch
    {
        Write-UcmLog -Message "Something went wrong attempting to import modules" -Severity 3 -Component $function
        Write-UcmLog -Message "$Error[0]" -Severity 3 -Component $function
        $Return.Status = "Error"
        $Return.Message = "Import Failure, Try/Catch block : $error[0]"
        Return $Return
    }

    #Cmdlets ran, but did the modules import?
    If (($CSManagementTools -eq $true) -and ($ADManagementTools -eq $true))
    {
      Write-UcmLog -Message 'Import-Module sucseeded' -Severity 1 -Component $Function
      $Return.Status = "OK"
      $Return.Message = "Modules Loaded"
      Return $Return
    }
    Else
    {
      Write-UcmLog -Message 'Import-Module sucseeded, but modules not resident' -Severity 5 -Component $Function
      Write-UcmLog -Message "$Error[0]" -Severity 3 -Component $function
      $Return.Status = "Error"
      $Return.Message = "Import Failure, Checking Import : $error[0]"
      Return $Return
    }


    #Default Return Variable for UcmPsTools HTML Reporting Fucntion, this should never run!
    Write-UcmLog -Message "Reached end of $function without a Return Statement" -Severity 3 -Component $function
    $return.Status = "Unknown"
    $return.Message = "Function did not encounter return statement"
    Return $Return
    #endregion FunctionReturn
  }

# SIG # Begin signature block
# MIIRwgYJKoZIhvcNAQcCoIIRszCCEa8CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUK9wQNENE2OpoUj0L8JdX8L+/
# pEKggg4OMIIGsDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0B
# AQwFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVk
# IFJvb3QgRzQwHhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYD
# VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lD
# ZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEg
# Q0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5
# WRuxiEL1M4zrPYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJP
# DqFX/IiZwZHMgQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXz
# ENOLsvsI8IrgnQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bq
# HPNlaJGiTUyCEUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTC
# fMjqGzLmysL0p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaD
# G7dqZy3SvUQakhCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urO
# kfW+0/tvk2E0XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7AD
# K5GyNnm+960IHnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4
# R+Z1MI3sMJN2FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlN
# Wdt4z4FKPkBHX8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0I
# U0F8WD1Hs/q27IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYB
# Af8CAQAwHQYDVR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaA
# FOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAK
# BggrBgEFBQcDAzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v
# Y3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4
# oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJv
# b3RHNC5jcmwwHAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcN
# AQEMBQADggIBADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcT
# Ep6QRJ9L/Z6jfCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WT
# auPrINHVUHmImoqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9
# ntSZz0rdKOtfJqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np37
# 5SFTWsPK6Wrxoj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0
# HKKlS43Nb3Y3LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL
# 6TEa/y4ZXDlx4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+1
# 6oh7cGvmoLr9Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8
# M4+uKIw8y4+ICw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrF
# hsP2JjMMB0ug0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy
# 1lKQ/a+FSCH5Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIHVjCC
# BT6gAwIBAgIQDyLHeeRvkUFg5QtSFTT8FjANBgkqhkiG9w0BAQsFADBpMQswCQYD
# VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lD
# ZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEg
# Q0ExMB4XDTIzMDIyMzAwMDAwMFoXDTI2MDIyMzIzNTk1OVowXjELMAkGA1UEBhMC
# QVUxETAPBgNVBAgTCFZpY3RvcmlhMRAwDgYDVQQHEwdCZXJ3aWNrMRQwEgYDVQQK
# EwtKYW1lcyBBcmJlcjEUMBIGA1UEAxMLSmFtZXMgQXJiZXIwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQC47oExh25TrxvApIYdMRYvjOdZCb8WwgeTemm3
# ZY7BElIWu6+gzRGqQe8RFsN7oIgin5pvjTYIToxt1CCag2A5o8L0NtULmxJEegc+
# VaF24DZQqI4qGQGH/Qnglqys6+yPkwLnfeSxpeWe4u49HUUGDFIxHCh42MlCLp/f
# fHT49QhhpO+LyeLnDoUs6DmahyIb6NeE2cW5AYRXEesW7GRNfXzygBSlVWJOgvcy
# V5Y4IvAZVx2hKKMTjYFIz4/RYMg7fwYZEJ2LRJ/GnVazobKAvh6ZBet5KwVNI9EI
# 29DtWQyK/RoPOguTRcB5VuiZVlv0xjBYM7iJuH2Soa3StQYVxL/5gjZCC9WOs4NR
# EIGU3XmHoogFDvoT1vf1izMPFQzdZfgPvy/XXsbgTVo5ncesJ6WtZwqwCXG1K0XW
# IPZqTHolc1MyU6K1bEHO+7YWLpKgM9THl644G7PEhcKpNDsHlfvLVQdYhI55UJtc
# iyMrTw11CNECvk3GK1mrluvKsrxdaH6G3Sp9VVHRtef6OZ5SlzkM5ID4egB2bXRb
# R/69bEuZr5hhm+v2lBSWIbZj/Mva6i/a/TAvy4vvPLo3DRcASkYZDC4T8gDMzmpG
# Xs4jAc9sfTL9z+o5u1PLJHFGRjJ+Wa2CgSftCdbKLjn+AY9m8ipc8jmOBKNY9yGI
# pQWapQIDAQABo4ICAzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0
# TkIwHQYDVR0OBBYEFOBsg1xudlbXVSql8pWbiHoTyZS/MA4GA1UdDwEB/wQEAwIH
# gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw
# Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu
# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB
# Mzg0MjAyMUNBMS5jcmwwPgYDVR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEFBQcC
# ARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGUBggrBgEFBQcBAQSBhzCB
# hDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUF
# BzAChlBodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVk
# RzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAA
# MA0GCSqGSIb3DQEBCwUAA4ICAQBOh5vRXqTCQzv0T1F2EgDkq5VnljlHsa7Ov/d/
# lpOvr8NebBiatxbhfhPCnToY7BD2f7YVsUuQ+VDdcIYsskcU5spBHcFYidg2jGu4
# 59FGMaS765XStDwGGTN/360gEsNYSnKWYL4+8jYWHlzRO0jHloyWz+gF5dYWzdDJ
# u1dudLIJ0RgrEVJeLSgIBWygLL5EyIzOPlrxztsILMSbdPTQLeBIm7ipOk4EACx1
# hhBVUsUoCAlASH+yCKDU4v2HFd7SzrkRUrf7XJ2Na2YsiHjiTGqHIE86KyvxGDhT
# 3n2/jX23Nh/bkWHurHwTfaTCOQ44ZlAbnZQjBlmrFn5hPMXRpciiQFmrKTPD/nuo
# 9MVnCciHEpHJ63/JZNF/eno1122/wVkL7MuRlCVHN7L/wuNQxQk3ARdIju6OD/Gi
# Mwg0Qih6HVWJtkHK3ExoUKKKUZCOvIeHxzp+K6FWUupPZKUgWzn4AHMxm6zr+Sde
# laIAACqAkxYsDYKbM7WlNi3uIH2HeXqU9uSDt5tgPpImrog/ab4HrhpDfITRgT1c
# cxaWQezpJEPC+kqVD41T3wlEie1Qm4vYWg+oBVEMBxVLh6CYbeppCRTEXRGnAiCH
# /Ma1uwyWnNCWxrhd1uSi6sj4ISzgnFyGCvsI0gavKpS5AQhapJgk6/fULTFeS+Ee
# kRH9FDGCAx4wggMaAgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD
# ZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2ln
# bmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENBMQIQDyLHeeRvkUFg5QtSFTT8FjAJ
# BgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0B
# CQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAj
# BgkqhkiG9w0BCQQxFgQU5m27RG4QCgI5nfUFthveoYpATnUwDQYJKoZIhvcNAQEB
# BQAEggIAjNFB4sLS1yfyW8tXKf9/U7C0XuV21u30W9gi8YtUbkQWSstNR1TWrxkG
# N8JocT7bopFFzT+WTDley0yCdXsPRFUrUV7TyNrDOgx3Qll48x/MzCSEPWABAp88
# nkpPuslRZ5MIkBFHxc+U7lbMGQlFuxa/uZ1m3a0jxzMzKylRKjVvHxvDGgDDH0qS
# H/0ZusYb/PKQzaJCy9Naca6TDgTmRFH6j/26cUXDQ2tYe8ENXa3y7CjbQowWakFo
# /1q7aoEyqbHVqoQ8HALWFgnB38i10YdOiMwWz4+OkkeanH1b9uNjsUIZgiKXX1ph
# UHr9A71H/drChv/zOgCjeylnjY0zXcimCJlXFjDvzvem9LBoZBK93MuoEUJCAt9D
# urqGlyb+GvmF8Z432XotS/I6tCyyh5ctDAGcXn/wLV0PIYIbmDKEGnpkXBKhgCx3
# SuY9rl3TmkhBbgrU7FBcP2nQQh926wD1uZ2lZuEG3wYljpXXMXOuCmJCHW11eudO
# wCt/ex20vHsi4bPmDj8YowuBpBqvz2RLNZWVnOawV5VZPkemzt81zyJx2UmJQp9O
# vgkFwspCrHHTi214H+9PglO0m3EHr1OGI/OguQoxw93iZ7Ecb9YpoKou8vGBPtwy
# KkhQErSSmNRGXSpmnor9AGBFVZigjMol6hdzNlf1o6Wso99PMzY=
# SIG # End signature block