Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
350 changes: 179 additions & 171 deletions functions/public/Install-omsAgent.ps1
Original file line number Diff line number Diff line change
@@ -1,172 +1,180 @@
#Requires -Version 5.0

function Install-OmsAgent
{
<#
.Synopsis
Installs the OMS agent on remote computers.
.DESCRIPTION
Either downloads the installer from a URL or copies the installer via the powershell session. Can detected if a previous version is installed and skip if so. If allready installed WorkSpaceId and WorkSpaceKey added to previous install. Doesn't detect invalid workspace IDs or Keys.
.EXAMPLE
Install-OmsAgent -sourcePath 'c:\MMASetup-AMD64.exe' -workspaceID '<workSpaceID>' -workspaceKey '<workSpaceKey>' -Verbose
.EXAMPLE
Install-OmsAgent -computerName <computerName> -workspaceID '<workSpaceID>' -workspaceKey '<workSpaceKey>' -Verbose
.EXAMPLE
$workSpace = Get-Credential
Install-OmsAgent -computerName 'computerOne' -workspace $workSpace -verbose
.NOTES
Written by Ben Taylor
Version 1.1, 08.02.2017
#>
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'Low', DefaultParameterSetName='downloadOMS')]
[OutputType([String])]
Param (
[Parameter(Mandatory = $false, Position = 0, ValueFromPipeline=$True, valuefrompipelinebypropertyname=$true)]
[ValidateNotNullOrEmpty()]
[Alias('IPAddress', 'Name')]
[string[]]
$computerName = $env:COMPUTERNAME,
[Parameter(Mandatory=$true, ParameterSetName='workSpaceClearText')]
[ValidateNotNullOrEmpty()]
[string]
$workspaceid,
[Parameter(Mandatory=$true, ParameterSetName='workSpaceClearText')]
[ValidateNotNullOrEmpty()]
[string]
$workspacekey,
[Parameter(Mandatory=$true, ParameterSetName='workSpaceEncrypt')]
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$workSpace,
[Parameter(ParameterSetName='downloadOMS')]
[ValidateNotNullOrEmpty()]
[string]
$downloadURL = 'http://download.microsoft.com/download/0/C/0/0C072D6E-F418-4AD4-BCB2-A362624F400A/MMASetup-AMD64.exe',
[Parameter(ParameterSetName='localOMS')]
[ValidateScript({Test-Path $_ })]
[string]
$sourcePath,
[Parameter()]
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$Credential
)

Begin
{
$commonSessionParams = @{
ErrorAction = 'Stop'
}

If ($PSBoundParameters['Credential'])
{
$commonSessionParams.Credential = $Credential
}

If ($PSBoundParameters['workspace'])
{
$workspaceid = (Convert-CredentialToPlainText -credential $workSpace).userName
$workspacekey = (Convert-CredentialToPlainText -credential $workSpace).passWord
}
}
Process
{
forEach ($computer in $computerName)
{
try
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Creating Remote PS Session"
$psSession = New-PSSession -ComputerName $computer @commonSessionParams

Write-Verbose "[$(Get-Date -Format G)] - $computer - Checking if OMS is Installed"

if(-not (Get-omsAgentInternal -computerName $computer -session $psSession))
{
If ($Pscmdlet.ShouldProcess($computer, 'Install OMS Agent'))
{
$path = Invoke-Command -Session $pssession -ScriptBlock {
$path = Join-Path $ENV:temp "MMASetup-AMD64.exe"

# Check if file exists and if so remove
if(Test-Path $path)
{
Remove-Item $path -force -Confirm:$false
}

$path
}

if($PSBoundParameters.sourcePath -eq $true)
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Copying files over powershell session"
Copy-Item -Path $sourcePath -Destination (Split-path $path) -ToSession $psSession -Force
}
else
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Trying to download installer from URL - $downloadURL"
Invoke-Command -Session $psSession -ScriptBlock {
Invoke-WebRequest $USING:downloadURL -OutFile $USING:path -ErrorAction Stop | Out-Null
} -ErrorAction Stop
}


Write-Verbose "$computer - Trying to install OMS..."
$installString = $path + ' /C:"setup.exe /qn ADD_OPINSIGHTS_WORKSPACE=1 ' + "OPINSIGHTS_WORKSPACE_ID=$workspaceID " + "OPINSIGHTS_WORKSPACE_KEY=$workSpaceKey " +'AcceptEndUserLicenseAgreement=1"'

$installSuccess = Invoke-Command -Session $psSession -ScriptBlock {
cmd.exe /C $USING:installString
$LASTEXITCODE
} -ErrorAction Stop

if($installSuccess -ne 0)
{
Write-Error "$computer - OMS didn't install correctly based on the exit code"
}
else
{
if(Get-omsAgentInternal -computerName $computer -session $psSession)
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - OMS installed correctly"
}
else
{
Write-Error "[$(Get-Date -Format G)] - $computer - OMS didn't install correctly based on the exit code"
}
}
}
}
else
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - OMS Agent allready installed so skipping."
}
}
catch
{
Write-Error $_
}
Finally
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Tidying up install files\sessions if needed"

if($null -ne $psSession)
{
try
{
Invoke-Command -Session $pssession -ScriptBlock {
if(Test-Path $USING:path)
{
Remove-Item $USING:path -force -Confirm:$false
}
} -ErrorAction Stop
}
catch
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Nothing to tidy up"
}

Remove-PSSession $psSession -whatif:$false -Confirm:$false
}
}
}
}
#Requires -Version 5.0

function Install-OmsAgent
{
<#
.Synopsis
Installs the OMS agent on remote computers.
.DESCRIPTION
Either downloads the installer from a URL or copies the installer via the powershell session. Can detected if a previous version is installed and skip if so. If allready installed WorkSpaceId and WorkSpaceKey added to previous install. Doesn't detect invalid workspace IDs or Keys.
.EXAMPLE
Install-OmsAgent -sourcePath 'c:\MMASetup-AMD64.exe' -workspaceID '<workSpaceID>' -workspaceKey '<workSpaceKey>' -Verbose
.EXAMPLE
Install-OmsAgent -computerName <computerName> -workspaceID '<workSpaceID>' -workspaceKey '<workSpaceKey>' -Verbose
.EXAMPLE
$workSpace = Get-Credential
Install-OmsAgent -computerName 'computerOne' -workspace $workSpace -verbose
.NOTES
Written by Ben Taylor
Version 1.1, 08.02.2017
#>
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'Low', DefaultParameterSetName='downloadOMS')]
[OutputType([String])]
Param (
[Parameter(Mandatory = $false, Position = 0, ValueFromPipeline=$True, valuefrompipelinebypropertyname=$true)]
[ValidateNotNullOrEmpty()]
[Alias('IPAddress', 'Name')]
[string[]]
$computerName = $env:COMPUTERNAME,
[Parameter(Mandatory=$true, ParameterSetName='localoms-workSpaceClearText')]
[Parameter(Mandatory=$true, ParameterSetName='downloadoms-workSpaceClearText')]
[ValidateNotNullOrEmpty()]
[string]
$workspaceid,
[Parameter(Mandatory=$true, ParameterSetName='localoms-workSpaceClearText')]
[Parameter(Mandatory=$true, ParameterSetName='downloadoms-workSpaceClearText')]
[ValidateNotNullOrEmpty()]
[string]
$workspacekey,
[Parameter(Mandatory=$true, ParameterSetName='localoms-workSpaceEncrypt')]
[Parameter(Mandatory=$true, ParameterSetName='downloadoms-workSpaceEncrypt')]
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$workSpace,
[Parameter(ParameterSetName='downloadOMS')]
[Parameter(Mandatory=$true, ParameterSetName='downloadoms-workSpaceEncrypt')]
[ValidateNotNullOrEmpty()]
[string]
$downloadURL = 'http://download.microsoft.com/download/0/C/0/0C072D6E-F418-4AD4-BCB2-A362624F400A/MMASetup-AMD64.exe',
[Parameter(ParameterSetName='localOMS')]
[Parameter(Mandatory=$true, ParameterSetName='localoms-workSpaceClearText')]
[Parameter(Mandatory=$true, ParameterSetName='localoms-workSpaceEncrypt')]
[ValidateScript({Test-Path $_ })]
[string]
$sourcePath,
[Parameter()]
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$Credential
)

Begin
{
$commonSessionParams = @{
ErrorAction = 'Stop'
}

If ($PSBoundParameters['Credential'])
{
$commonSessionParams.Credential = $Credential
}

If ($PSBoundParameters['workspace'])
{
$workspaceid = (Convert-CredentialToPlainText -credential $workSpace).userName
$workspacekey = (Convert-CredentialToPlainText -credential $workSpace).passWord
}
}
Process
{
$debugparams = $PSBoundParameters
Write-Debug -Message "[$(Get-Date -Format G)] - $debugparams - PSBOUNDParams"
forEach ($computer in $computerName)
{
try
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Creating Remote PS Session"
$psSession = New-PSSession -ComputerName $computer @commonSessionParams

Write-Verbose "[$(Get-Date -Format G)] - $computer - Checking if OMS is Installed"

if(-not (Get-omsAgentInternal -computerName $computer -session $psSession))
{
If ($Pscmdlet.ShouldProcess($computer, 'Install OMS Agent'))
{
$path = Invoke-Command -Session $pssession -ScriptBlock {
$path = Join-Path $ENV:temp "MMASetup-AMD64.exe"

# Check if file exists and if so remove
if(Test-Path $path)
{
Remove-Item $path -force -Confirm:$false
}

$path
}

if($PSBoundParameters.sourcePath)
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Copying files over powershell session"
Copy-Item -Path $sourcePath -Destination (Split-path $path) -ToSession $psSession -Force
}
else
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Trying to download installer from URL - $downloadURL"
Invoke-Command -Session $psSession -ScriptBlock {
Invoke-WebRequest $USING:downloadURL -OutFile $USING:path -ErrorAction Stop | Out-Null
} -ErrorAction Stop
}


Write-Verbose "$computer - Trying to install OMS..."
$installString = $path + ' /C:"setup.exe /qn ADD_OPINSIGHTS_WORKSPACE=1 ' + "OPINSIGHTS_WORKSPACE_ID=$workspaceID " + "OPINSIGHTS_WORKSPACE_KEY=$workSpaceKey " +'AcceptEndUserLicenseAgreement=1"'

$installSuccess = Invoke-Command -Session $psSession -ScriptBlock {
cmd.exe /C $USING:installString
$LASTEXITCODE
} -ErrorAction Stop

if($installSuccess -ne 0)
{
Write-Error "$computer - OMS didn't install correctly based on the exit code"
}
else
{
if(Get-omsAgentInternal -computerName $computer -session $psSession)
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - OMS installed correctly"
}
else
{
Write-Error "[$(Get-Date -Format G)] - $computer - OMS didn't install correctly based on the exit code"
}
}
}
}
else
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - OMS Agent allready installed so skipping."
}
}
catch
{
Write-Error $_
}
Finally
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Tidying up install files\sessions if needed"

if($null -ne $psSession)
{
try
{
Invoke-Command -Session $pssession -ScriptBlock {
if(Test-Path $USING:path)
{
Remove-Item $USING:path -force -Confirm:$false
}
} -ErrorAction Stop
}
catch
{
Write-Verbose "[$(Get-Date -Format G)] - $computer - Nothing to tidy up"
}

Remove-PSSession $psSession -whatif:$false -Confirm:$false
}
}
}
}
}