Server/Server.ps1

#region Copyright & License

# Copyright © 2012 - 2022 François Chabot
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#endregion

Set-StrictMode -Version Latest

<#
.SYNOPSIS
   Asserts the existence of a server being a member of the Microsoft BizTalk Server Group.
.DESCRIPTION
   This command will throw if the server of a given name is not a member of the Microsoft BizTalk Server Group, and
   will silently complete otherwise.
.PARAMETER Name
   The name of the server to assert membership to Microsoft BizTalk Server Group.
.OUTPUTS
   Throws if server is not a member of the Microsoft BizTalk Server Group; completes silently otherwise.
.EXAMPLE
   PS> Assert-BizTalkServer -Name Artichaut
.EXAMPLE
   PS> Assert-BizTalkServer -Name Artichaut, Aubergine
.NOTES
   © 2022 be.stateless.
#>

function Assert-BizTalkServer {
   [CmdletBinding()]
   [OutputType([void])]
   param(
      [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
      [AllowEmptyCollection()]
      [string[]]
      $Name
   )
   Begin {
      Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
   }
   Process {
      Enumerate-BizTalkServer -Name $Name -UserBoundParameters $PSBoundParameters -ErrorAction Stop -WarningAction SilentlyContinue
   }
}

<#
.SYNOPSIS
   Gets all or one Microsoft BizTalk Server Group's Servers by name.
.DESCRIPTION
   This command returns the servers being members of BizTalk Server Group.
.PARAMETER Name
   The name of the server belonging to the Microsoft BizTalk Server Group.
.OUTPUTS
   Returns information about the server belonging to the Microsoft BizTalk Server Group.
.EXAMPLE
   PS> Get-BizTalkServer
.EXAMPLE
   PS> Get-BizTalkServer -Name Artichaut, Aubergine
.NOTES
   © 2022 be.stateless.
#>

function Get-BizTalkServer {
   [CmdletBinding()]
   [OutputType([PSCustomObject[]])]
   param(
      [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
      [ValidateNotNullOrEmpty()]
      [string[]]
      $Name
   )
   Begin {
      Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
   }
   Process {
      Enumerate-BizTalkServer -Name $Name -UserBoundParameters $PSBoundParameters -ErrorAction SilentlyContinue -WarningAction SilentlyContinue |
         Where-Object -FilterScript { $_ }
   }
}

<#
.SYNOPSIS
   Returns whether a server is a member of the Microsoft BizTalk Server Group.
.DESCRIPTION
   This command will return $true if the server of a given name is a member of the Microsoft BizTalk Server Group.
.PARAMETER Name
   The name of the server to test membership to Microsoft BizTalk Server Group.
.OUTPUTS
   Returns $true if server if a member of the Microsoft BizTalk Server Group; $false otherwise.
.EXAMPLE
   PS> Test-BizTalkServer -Name Artichaut
.EXAMPLE
   PS> Test-BizTalkServer -Name Artichaut, Aubergine
.NOTES
   © 2022 be.stateless.
#>

function Test-BizTalkServer {
   [CmdletBinding()]
   [OutputType([bool[]])]
   param(
      [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
      [AllowEmptyCollection()]
      [string[]]
      $Name
   )
   Begin {
      Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
   }
   Process {
      Enumerate-BizTalkServer -Name $Name -UserBoundParameters $PSBoundParameters -ErrorAction SilentlyContinue -WarningAction SilentlyContinue |
         ForEach-Object -Process { [bool]$_ }
   }
}

function Enumerate-BizTalkServer {
   [Diagnostics.CodeAnalysis.SuppressMessage('PSUseApprovedVerbs', '', Justification = 'Non-public function.')]
   [CmdletBinding()]
   [OutputType([PSCustomObject[]])]
   param(
      [Parameter(Mandatory = $false)]
      [AllowEmptyString()]
      [AllowEmptyCollection()]
      [AllowNull()]
      [string[]]
      $Name,

      [Parameter(Mandatory = $true)]
      [HashTable]
      $UserBoundParameters
   )

   function Enumerate-BizTalkServerCore {
      [CmdletBinding()]
      [OutputType([PSCustomObject[]])]
      param(
         [Parameter(Mandatory = $false)]
         [AllowEmptyString()]
         [AllowEmptyCollection()]
         [AllowNull()]
         [string[]]
         $Name = '' # default value ensures its pipeline will run
      )
      $Name | ForEach-Object -Process { $_ } -PipelineVariable currentName | ForEach-Object -Process {
         $filter, $message = if (![string]::IsNullOrWhiteSpace($currentName)) {
            "Name='$currentName'"
            $serverMessages.Error_Not_Found -f $currentName
         } else {
            $null
            $serverMessages.Error_None_Found
         }
         $instance = Get-CimInstance -Namespace root\MicrosoftBizTalkServer -ClassName MSBTS_Server -Filter $filter
         if ($null -eq $instance) {
            Write-Error -Message $message
            Write-Warning -Message $message
            $null
         } else {
            $instance
         }
      }
   }

   $arguments = @{ } + $PSBoundParameters
   $arguments.Remove('UserBoundParameters') | Out-Null
   if ($UserBoundParameters.ContainsKey('ErrorAction')) { $arguments.ErrorAction = $UserBoundParameters.ErrorAction }
   if ($UserBoundParameters.ContainsKey('WarningAction')) { $arguments.WarningAction = $UserBoundParameters.WarningAction }
   Enumerate-BizTalkServerCore @arguments
}

Import-LocalizedData -BindingVariable serverMessages -FileName Server.Messages.psd1
# SIG # Begin signature block
# MIII0QYJKoZIhvcNAQcCoIIIwjCCCL4CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUX6BGFBH6+j4z5GVpr4jR5lgQ
# WTWgggVMMIIFSDCCAzCgAwIBAgIJAJkr3mJdTBkUMA0GCSqGSIb3DQEBCwUAMEEx
# PzA9BgNVBAMeNgBpAGMAcgBhAGYAdABzAG8AZgB0AHcAYQByAGUAQABzAHQAYQB0
# AGUAbABlAHMAcwAuAGIAZTAeFw0yMTA2MjUxNDEyMjNaFw00MTA2MjAxNDEyMjNa
# MEExPzA9BgNVBAMeNgBpAGMAcgBhAGYAdABzAG8AZgB0AHcAYQByAGUAQABzAHQA
# YQB0AGUAbABlAHMAcwAuAGIAZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAOeqdUHBv7sxSeX3aj6yPKj7PAvs8izpVXjyEBl5aR8mQneVcXuF53AH7EW1
# 6E5p4+Az5pJPGUD5c3tXhiGMF7vgLhQjO6hlaVBRIqiIYHikNLwMNy6YBMc/QQYM
# rPhqHEFsZ53dkBIIj3M8e3kFcTFA09n25yDtTPDab4nd9yUhc9Qc8+nfpIzfYsoP
# 1pZ3nCzhw6hN2/44v1dkQrG3dRYwt+px65p6NPNZWEJpt4VCJjIFh+lBYJdxm9d4
# X/rAnlHIkbv7liOavWDzgHVabS3hdAWtcDmynm+7+FcZDFqPWNCl3e4SS7xe4s/R
# CKFKA0IsfKkSk9YJlLgeSQIEXUOOWXJAGaLqnRD8xWLZsc4Oi9GZg7XV1mv/S88c
# oztXnwtAN3OOlRKBh2QbomMgxeMO0GvsLE/cq5Q/YKAoz+KGr/7LcZq9jzQ8IPus
# ZvWLeDXmxPiwJjpZc1koLgfGIEX2NStQTT3QmacWr9thrWcKvI+4uBmI4exS9B4a
# R3nV91w5EY+2RoYsHqej9LWwNamO96+jMX9pxprTX+EkLUuMAikw/po8sBC9MUUn
# 5pMWmUv7DCtQOLGGBDDMMMkn4ZcjpCEEdPGHRKfqNnD27ssGtDjiNzfQrsm67toU
# bBwUF+gyJq/YckWquYJhA9ZOFWEADuIwGnsOzsoRvuQyY+p9AgMBAAGjQzBBMA4G
# A1UdDwEB/wQEAwIHgDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDAzAXBgNVHREEEDAO
# ggxzdGF0ZWxlc3MuYmUwDQYJKoZIhvcNAQELBQADggIBACithYM3qckZRc9+Xbfu
# a6gWr3HwjrW+FHKgjfrcOm8ZnLVapb9xFqsqrRQqd3RXWQDINEGrtI2rSfrzyfoK
# UiTgldIfQNP1ZcGY229d++90t3hdo2mlt05hjYlbMENloJHpsEP0vQZmwOcEimCT
# ex1pymYM+P9pj3j8UD1PT1eIZot6or8fBRl63UybyDSrM7L4UOkkAOniKxWy5pW6
# 6duS8SR+SZpr3Bv44NyXPj0Nv+MIpLmsLrd7XPBFmnGxzY01ZO9vzi9KEhM2wT5i
# jPqHDNOvfPiADtAa+EyUBzdJiqy9heCz/TMZQgMWGwtfqJNxWZmsHcha2anW4Qt+
# mzrLO4GojWoVog9uVSAq+l0a+YQsd1u1kUmm4vgZCFyUA+lEp4LkI7ca2VBHkLPD
# w+u2DoDMRiqFPZjO7BCKjGc0jj9B/qGR3JVt+tqDdB621xXf2YGF2oFvxZQ/keGt
# 0ujfJ+JwN3nCulDAA4773q6KUnfykyrvAgITNbRJL6TngeRKtw9VIJBPxzqMzLpV
# 5ggXNituwLaD1CCBJ1oo9DZHpL9gplXp1wGrelJOTiJhh+pdNsPtRH7CrranWa5h
# LFLuigqin0eewQ5giJ1VaiBVEseOmiZog+27UpFIv40aDzgGL3YxB/Mu0ojwrQtp
# WLmqJCmWnR5qxOm0yK+zNWe0MYIC7zCCAusCAQEwTjBBMT8wPQYDVQQDHjYAaQBj
# AHIAYQBmAHQAcwBvAGYAdAB3AGEAcgBlAEAAcwB0AGEAdABlAGwAZQBzAHMALgBi
# AGUCCQCZK95iXUwZFDAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAA
# oQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4w
# DAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUaTgA2iytFmkBtaUXQ/Lq5png
# LNowDQYJKoZIhvcNAQEBBQAEggIAj3jLce2qem5KpWYXqKzrBPCj0a4uJp14kMuQ
# KoCpMX/ix/f8D1yySWzDgurBloDpWbRwLd0DBe76hpR2nAvKq+j1fWIKA9IG/2If
# uJbPhujQ8Qj0erRwlZoZdA0RwygdC6UJ6mM+vzoIU+41H3ZoRB65TyUpluqwzAF9
# 6SxEIiTwtpYVwl0G5skq1ES4D9lUxnb764enX4/MKRO2wrK2UkpUk7esVkoMw36/
# xOtGbO3Nj4wZY3HBdUXiALL1PyrEkMRSwZyc/oswZkslCe6QDEcgRT7pUJmp+aUB
# mKNDG56pLE+5XKuOB8WrrDn1HoQhutn2+MnhiFGHV9N7p5v0QezpKRk3R8hapDn4
# ihto4BNkddR/FtGLO7bV1Cm+9uIeRLdtb+N6Z8JBhoXxF1ouqCB8sV1NeKb3jgK3
# RWOZAPlU8SZl37w4tN5GzA+Z/9KAGxE6fanHVva6x21qN3jO/3ymorPBdkk2Plt8
# Or0GX6EUDo5RL8wot6uO0dwbUR455Rhz0KihLMvYnbfPbQm511FkzdV5M/hVemZH
# Wn/2I5fOR5TNThEsvJFpoq57YaLAulyQaGiObfBpnT6aqJ7KHtqSlYBDyKIcj46d
# w2k1tUX7aLGmQ/bMz+a3dn/UH+UmcAtkqFkoWlDc1mXTJgq67Mh0DMZ09iE7svPe
# gUCsqTg=
# SIG # End signature block