ServiceNow-MIDServer.psm1
function Install-ServiceNowMIDServer { <# .SYNOPSIS Install ServiceNow MID server (Windows x64) .DESCRIPTION Automatically downloads MID Server agent and installs it for Windows x64 OS .EXAMPLE Install-ServiceNowMIDServer -ServiceNowInstanceName <string> -Name <string> -Credential <PSCredential> .PARAMETER ServiceNowInstanceName Your ServiceNow instance subdomain name from the URL: https:// <ServiceNowInstanceName> .service-now.com, Not the whole URL .PARAMETER Name Name of the MID server .PARAMETER Credential SericeNow MID server user credentials (user ID and password) .PARAMETER RootFolderName MID server agent root folder name. Default installation will be at C:\ServiceNow\<Name>\ #> [CmdletBinding()] param ( [Parameter(Mandatory)] [ValidatePattern('^[a-z0-9-]{1,50}$')] [string]$ServiceNowInstanceName, [Parameter(Mandatory)] [ValidatePattern('^[a-z0-9-_.]{1,100}$')] [string]$Name, [Parameter(Mandatory)] [PSCredential]$Credential, [Parameter()] [ValidatePattern('^[a-z0-9-._]{1,50}$')] [string]$RootFolderName = 'ServiceNow' ) $midServerFolderName = $Name $rootPath = Join-Path -Path $env:SystemDrive -ChildPath $RootFolder $queryURL = "https://$($ServiceNowInstanceName).service-now.com/api/now/table/sys_properties?sys_name=mid.version" $baseUrl = 'https://install.service-now.com/glide/distribution/builds/package/mid' $originalSecurityProtocol = [Net.ServicePointManager]::SecurityProtocol [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # folders and files $midserverFolder = Join-Path -Path $rootPath -ChildPath $midServerFolderName $configFilePath = Join-Path -Path $midserverFolder -ChildPath '\agent\config.xml' $wrapperFilePath = Join-Path -Path $midserverFolder -ChildPath '\agent\conf\wrapper-override.conf' $startFile = Join-Path -Path $midserverFolder -ChildPath '\agent\start.bat' try { # check current ServiceNow MID server version $MIDversion = (Invoke-RestMethod $queryURL -Credential $Credential -ErrorAction Stop).result.value if (!$MIDversion) { Write-Warning "Installation stopped. Can't fetch MID server version from target ServiceNow instance. Check network connectivity and MID server user credentials." [Net.ServicePointManager]::SecurityProtocol = $originalSecurityProtocol break } $dateVersion = ($MIDversion.split('_'))[-2] $dateString = "/{2}/{0}/{1}/" -f $dateVersion.split('-') $midServerAgentFileName = "mid.$($MIDversion).windows.x86-64.zip" $MIDServerAgentURL = $baseUrl + $dateString + $midServerAgentFileName $outfile = Join-Path -Path $env:TEMP -ChildPath $midServerAgentFileName if (Test-Path $midserverFolder) { Write-Warning "Installation stopped. MID server folder $midserverFolder and service already exists" [Net.ServicePointManager]::SecurityProtocol = $originalSecurityProtocol break } New-Item -ItemType Directory -Path $midserverFolder if (!(Test-Path $outfile)) { # download the Mid server agent (zip file) if it doesn't exist locally Write-Output "Downloading MID server agent $MIDServerAgentURL" Invoke-WebRequest -Uri $MIDServerAgentURL -OutFile $outfile } # Unzip MID server agent zip file Expand-Archive -Path $outfile -DestinationPath $midserverFolder $configTemplate = @" <?xml version="1.0" encoding="UTF-8"?> <parameters> <parameter value="https://$($ServiceNowInstanceName).service-now.com/" name="url"/> <parameter value="$($username)" name="mid.instance.username"/> <parameter value="$($password)" name="mid.instance.password" secure="true"/> <parameter value="$($Name)" name="name"/> <parameter value="" name="mid_sys_id"/> </parameters> "@ # set config Set-Content -Path $configFilePath -Value $configTemplate # set wrapper config (Name of the service) $wrapperContent = Get-Content -Path $wrapperFilePath $wrapperContent = $wrapperContent -replace "wrapper.name=snc_mid", "wrapper.name=snc_mid_$Name" $wrapperContent = $wrapperContent -replace "wrapper.displayname=ServiceNow MID Server", "wrapper.displayname=ServiceNow MID Server $Name" Set-Content -Path $wrapperFilePath -Value $wrapperContent # change directory to the mid server agent folder since the startFile has a relative path Set-Location (Join-Path -Path $midserverFolder -ChildPath '\agent') # Start MID server service Invoke-Expression $startFile } catch { [Net.ServicePointManager]::SecurityProtocol = $originalSecurityProtocol Write-Warning "Error occurred during the MID server installation process: $_" } [Net.ServicePointManager]::SecurityProtocol = $originalSecurityProtocol } |