Public/Get-Company.ps1

<#
.SYNOPSIS
Returns a list of company's from the SPMTools config file
 
.DESCRIPTION
Returns the list of entered companies in the Service Provider Management Tools config file.
Additional companies can be added with New-Company
 
.PARAMETER Name
If Specified, returns all configuration information for the company's profile
Otherwise returns a list of companies.
 
.EXAMPLE
Get-Company
 
.EXAMPLE
Get-Company -Name AtlanticAviation
 
.NOTES
 
 
#>


Function Get-Company {
    [cmdletBinding(DefaultParameterSetName='All')]
    Param()
    DynamicParam {
        $ParameterName = 'Name'
        $RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
        $ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute

        $ParameterAttribute.Mandatory = $false
        $ParameterAttribute.Position = 1
        $ParameterAttribute.ParameterSetName = 'Specific'
        $ParameterAttribute.ValueFromPipeline = $true

        $AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
        $AttributeCollection.Add($ParameterAttribute)

        $ValidateSet = $Script:Config.Companies.Keys
        if($ValidateSet.length -gt 0) {
            $ValidateSetAttribute = New-Object System.Management.Automation.ValidateSetAttribute($ValidateSet)
            $AttributeCollection.Add($ValidateSetAttribute)
        }
 
        $RuntimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string], $AttributeCollection)
        $RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)
        return $RuntimeParameterDictionary
    }
    Begin {
        if($PSCmdlet.ParameterSetName -eq 'All') {
            #List all companies and if their setting are set
            $Companies = $Script:Config.Companies

            ForEach ($Company in $Companies.Keys) {
                $CompanyObj = $Companies[$Company]

                $OutputObj = [pscustomobject]@{
                    Name = $Company
                    ActiveDirectory = 'UNSET'
                    OnPremServices  = 'UNSET'
                    Office365       = 'UNSET'
                }

                if($CompanyObj.Domain) {
                    $OutputObj.ActiveDirectory = 'SET'
                }
                
                $OnPremObj = $CompanyObj.OnPremServices
                if($OnPremObj.ExchangeUri -or $OnPremObj.SkypeURI) {
                    $OutputObj.OnPremServices = 'SET'
                }

                if($CompanyObj.O365) {
                    $OutputObj.Office365 = 'SET'
                }
                $OutputObj
            }
        }
    }
    Process {
        if($PSCmdlet.ParameterSetName -eq 'Specific') {
            $Name = $PSBoundParameters.Name

            #Validation Error handling
            if(!$Script:Config.Companies.ContainsKey($Name)) {
                $message = "No companies have been set up. Please use the New-Company command to create one."
                $Param = @{
                    ExceptionName = "System.ArgumentException"
                    ExceptionMessage = $message
                    ErrorId = "GetCompanyNoCompaniesAvailable" 
                    CallerPSCmdlet = $PSCmdlet
                    ErrorCategory = 'InvalidArgument'
                }
                ThrowError @Param
            }

            $CompanyObj = $Script:Config.Companies.$Name
            $Output = [ordered]@{
                Name = $Name
            }

            #Domain Settings
            if($CompanyObj.Domain) {
                $DomainObj = $CompanyObj.Domain
                $Output.Add('DriveLetter',$DomainObj.PSDriveLetter)
                $Output.Add('DomainFQDN',$DomainObj.FQDN)

                if($DomainObj.PreferedDomainController) {
                    $Output.Add('PreferedDC',$DomainObj.PreferedDomainController)
                }
                else {
                    $Output.Add('PreferedDC','')
                }

                $Output.Add('FavoriteDrive',$DomainObj.Favorite)
                
                if($DomainObj.CredentialName) {
                    $Output.Add('DomainAuthType','Stored')
                }
                else {
                    $Output.Add('DomainAuthType','Integrated')
                }
            }

            #OnPremise Settings
            $OnPremObj = $CompanyObj.OnPremServices
            if(
                $OnPremObj.ExchangeURI -or
                $OnPremObj.SkypeURI
            ) {
                if($OnPremObj.ExchangeURI) {
                    $Output.Add('ExchangeURI',$OnPremObj.ExchangeURI)
                }
                if($OnPremObj.SkypeURI) {
                    $Output.Add('SkypeURI',$OnPremObj.SkypeURI)
                }
                if($OnPremObj.CredentialName) {
                    $Output.Add('OnPremAuthType','Stored')
                }
                else {
                    $Output.Add('OnPremAuthType','Integrated')
                }
            }

            #O365 Settings
            if($CompanyObj.O365) {
                $O365Obj = $CompanyObj.O365
                $Output.Add('MFAEnabled',$O365Obj.Mfa)
                $Output.Add('ExchangeOnlineUri',$O365Obj.ExchangeOnlineUri)
                $Output.Add('SkypeOnlineUri',$O365Obj.SkypeOnlineUri)

                if($O365Obj.SharePointOnlineUri) {
                    $Output.Add('SharePointOnlineUri',$O365Obj.SharePointOnlineUri)
                }

                $Output.Add('ComplianceCenterUri',$O365Obj.ComplianceCenterUri)
                $Output.Add('AzureADAuthorizationEndpointUri',$O365Obj.AzureADAuthorizationEndpointUri)
                
                if($O365Obj.CredentialName) {
                    $Output.Add('O365AuthType','Stored')
                }
                else {
                    $Output.Add('O365AuthType','Integrated')
                }

                if($O365Obj.DirSync) {
                    $Output.Add('DirSyncHost',$O365Obj.DirSync.Host)
                    $Output.Add('DirSyncConfigurationName',$O365Obj.DirSync.ConfigurationName)
                    $Output.Add('DirSyncPolicyType',$O365Obj.DirSync.PolicyType)
                }
            }

            [pscustomobject]$Output
        }
    }
}