Public/Set-Company.ps1


Function Set-Company {
    [cmdletBinding()] 
    Param(
        [Parameter(Mandatory=$true)] 
        [string]$Company,

        # AD Set
        [Parameter(
            ParameterSetName='AD',
            Mandatory=$true
        )] 
        [string]$ADDriveName,

        [Parameter(
            ParameterSetName='AD',
            Mandatory=$true
        )] 
        [string]$ADFQDN,

        [Parameter(
            ParameterSetName='AD',
            Mandatory=$false
        )] 
        [string]$ADPreferedDomainController,

        [Parameter(
            ParameterSetName='AD',
            Mandatory=$false
        )] 
        [switch]$ADNoAutoConnect,

        [Parameter(
            ParameterSetName='AD',
            Mandatory=$false
        )] 
        [pscredential]$ADCredential,


        # OnPrem Set
        [Parameter(
            ParameterSetName='OnPrem',
            Mandatory=$false
        )] 
        [string]$OnPremExchangeHost,

        [Parameter(
            ParameterSetName='OnPrem',
            Mandatory=$false
        )] 
        [string]$OnPremExchangeURI,

        [Parameter(
            ParameterSetName='OnPrem',
            Mandatory=$false
        )] 
        [string]$OnPremSkypeHost,

        [Parameter(
            ParameterSetName='OnPrem',
            Mandatory=$false
        )] 
        [string]$OnPremSkypeURI,

        [Parameter(
            ParameterSetName='OnPrem',
            Mandatory=$false
        )] 
        [pscredential]$OnPremCredential,


        # Online Set
        [Parameter(
            ParameterSetName='Online',
            Mandatory=$false
        )] 
        [switch]$OnlineNoMFA,

        [Parameter(
            ParameterSetName='Online',
            Mandatory=$false
        )] 
        [string]$OnlineExchangeURI,

        [Parameter(
            ParameterSetName='Online',
            Mandatory=$false
        )] 
        [string]$OnlineSkypeURI,

        [Parameter(
            ParameterSetName='Online',
            Mandatory=$false
        )] 
        [string]$OnlineSharePointURI,

        [Parameter(
            ParameterSetName='Online',
            Mandatory=$true
        )] 
        [pscredential]$OnlineCredential,

        [Parameter(
            ParameterSetName='Online',
            Mandatory=$false
        )] 
        [string]$OnlineAzureUsageLocation,

        [Parameter(
            ParameterSetName='Online',
            Mandatory=$false
        )] 
        [string]$OnlineRemoteRoutingSuffix,

        [Parameter(
            ParameterSetName='Online',
            Mandatory=$false
        )] 
        [string]$OnlineDirSyncHost,

        [Parameter(
            ParameterSetName='Online',
            Mandatory=$false
        )] 
        [string]$OnlineDirSyncDC,


        # Removal Set
        [Parameter(Mandatory=$false)]
        [Switch]$RemoveADCredential,

        [Parameter(Mandatory=$false)]
        [switch]$RemoveOnPremCredential,

        [Parameter(Mandatory=$false)]
        [switch]$RemoveOnlineCredential
    )

    if(!$script:Config.Companies.ContainsKey($Company)) {
        Throw "Company not found. Please create one with New-Company"
    }

    $CompanyObj = $Script:Config.Companies.$Company

    ## AD Settings
    if($PSCmdlet.ParameterSetName -eq 'AD') {
        # Inital Settings
        if(!$CompanyObj.Domain) {
            $CompanyObj.Domain = @{
                PSDriveLetter = ''
                FQDN = ''
                PreferedDomainController = $false
                AutoConnect = $true
                CredentialName = $false
            }
        }

        # Addition of Paramaters
        if($ADDriveName) {
            $CompanyObj.Domain.PSDriveLetter = $ADDriveName
        }

        if($ADFQDN) {
            $CompanyObj.Domain.FQDN = $ADFQDN
        }

        if($ADPreferedDomainController) {
            $CompanyObj.Domain.PreferedDomainController = $ADPreferedDomainController
        }

        if($ADNoAutoConnect) {
            $CompanyObj.Domain.AutoConnect = $false
        }
        else {
            $CompanyObj.Domain.AutoConnect = $true
        }

        if($ADCredential) {
            $Param = @{
                Target = "AD_$Company" 
                Persist = 'Enterprise' 
                Credentials = $ADCredential
            }
            $null = New-StoredCredential @Param
            $CompanyObj.Domain.CredentialName = "AD_$Company"
        }
    }

    ## On-Prem Services Settings
    if($PSCmdlet.ParameterSetName -eq 'OnPrem') {
        # OnPrem does not have inital settings as these are set
        # by New-Company

        # Addition of Paramaters
        if($OnPremExchangeHost) {
            $Uri = "http://$OnPremExchangeHost/PowerShell/"
            $CompanyObj.OnPremServices.ExchangeURI = $Uri
        }

        if($OnPremExchangeURI) {
            $CompanyObj.OnPremServices.ExchangeURI = $OnPremExchangeURI
        }

        if($OnPremSkypeHost) {
            $Uri = "http://$OnPremSkypeHost/PowerShell/"
            $CompanyObj.OnPremServices.SkypeURI = $Uri
        }

        if($OnPremSkypeURI) {
            $CompanyObj.OnPremServices.SkpyeURI = $OnPremSkypeURI
        }

        if($OnPremCredential) {
            $Param = @{
                Target = "OnPrem_$Company" 
                Persist = 'Enterprise' 
                Credentials = $OnPremCredential
            }
            $null = New-StoredCredential @Param
            $CompanyObj.OnPremServices.CredentialName = "OnPrem_$Company"
        }
    }

    ## Office365 Configuration
    if($PSCmdlet.ParameterSetName -eq 'Online') {
        # Initial Settings
        if(!$CompanyObj.O365) {
            $CompanyObj.O365 = @{
                Mfa = $false
                ExchangeOnlineUri = $false
                SkypeOnlineUri = $false
                CredentialName = $false
                AzureUsageLocation = $false
                RemoteRoutingSuffix = $false
                DirSyncHost = $false
                DirSyncDC = $false
            }
        }

        # Addition of Paramaters
        if($OnlineNoMFA -eq $true) {
            $CompanyObj.O365.Mfa = $false
        }
        else {
            $CompanyObj.O365.Mfa = $true
        }

        if($OnlineExchangeURI) {
            $CompanyObj.O365.ExchangeOnlineUri = $OnlineExchangeURI
        }
        else {
            $CompanyObj.O365.ExchangeOnlineUri = 'https://outlook.office365.com/powershell-liveid'
        }

        if($OnlineSkypeURI) {
            $CompanyObj.O365.SkypeOnlineUri = $OnlineSkypeURI
        }
        else {
            # This default is not used due to New-CSOnlineSession
            $CompanyObj.O365.SkypeOnlineUri = 'https://online.lync.com'
        }

        if($OnlineSharePointURI) {
            $CompanyObj.O365.SharePointOnlineUri = $OnlineSharePointURI
        }
        else {
            # This tells Connect-SharePointOnline to use the logon name instead
            $CompanyObj.O365.SharePointOnlineUri = $false
        }

        if($OnlineCredential) {
            $Param = @{
                Target = "O365_$Company" 
                Persist = 'Enterprise' 
                Credentials = $OnlineCredential
            }
            $null = New-StoredCredential @Param
            $CompanyObj.O365.CredentialName = "O365_$Company"
        }

        if($OnlineAzureUsageLocation) {
            $CompanyObj.O365.AzureUsageLocation = $OnlineAzureUsageLocation
        }

        if($OnlineRemoteRoutingSuffix) {
            $CompanyObj.O365.RemoteRoutingSuffix = $OnlineRemoteRoutingSuffix
        }

        if($OnlineDirSyncHost) {
            $CompanyObj.O365.DirSyncHost = $OnlineDirSyncHost
        }

        if($OnlineDirSyncDC) {
            $CompanyObj.O365.DirSyncDC = $OnlineDirSyncDC
        }
    }

    ## Credential removal
    if($RemoveADCredential) {
        Remove-StoredCredential -Target "AD_$Company"
        $CompanyObj.Domain.CredentialName = $false
    }

    if($RemoveOnPremCredential) {
        Remove-StoredCredential -Target "OnPrem_$Company"
        $CompanyObj.OnPremServices.CredentialName = $false
    }

    if($RemoveOnlineCredential) {
        Remove-StoredCredential -Target "O365_$Company"
        $CompanyObj.O365.CredentialName = $false
    }

    $script:Config.Companies.$Company = $CompanyObj
    Write-SPMTConfiguration
}