Untitled
qubit3265
plain_text
2 years ago
15 kB
9
Indexable
# Inputs $blockDesktopInstall = "false" <# .NOTES =========================================================================== Created with: SAPIEN Technologies, Inc., PowerShell Studio 2021 v5.8.187 Created on: 18/07/2021 23:57 Created by: Dvir Organization: YP Filename: OpenVPN 3 - GUI (Install) =========================================================================== .DESCRIPTION A full script to install and config a full profile for the user. #> $profileContent = @" dev tun persist-tun persist-key data-ciphers-fallback AES-128-CBC auth SHA256 tls-client client resolv-retry infinite remote XXX.XXX.XXX.XXX 1194 udp4 setenv opt block-outside-dns auth-user-pass #ca [inline] #tls-auth [inline] client-cert-not-required key-direction 1 remote-cert-tls server <ca> -----BEGIN CERTIFICATE----- XXX -----END CERTIFICATE----- </ca> <tls-auth> -----BEGIN OpenVPN Static key V1----- XXX -----END OpenVPN Static key V1----- </tls-auth> "@ <# Profile #> $profileName = "profile.ovpn" $profileDir = "$env:SystemDrive\Temp" $InstallParameters = @{ installSource = "https://openvpn.net/downloads/openvpn-connect-v3-windows.msi" configFile = "" configContent = "" installZip = "" installName = "openvpn-connect.msi" zipDir = "" unzipDir = "" installDir = "$env:windir\Temp\OpenVPNconnect" installTests = "$env:ProgramFiles\OpenVPN Connect\OpenVPNConnect.exe", "${env:ProgramFiles(x86)}\OpenVPN Connect\OpenVPNConnect.exe" installArgument = "Start-Process -FilePath `"$env:windir\Temp\OpenVPNconnect\openvpn-connect.msi`" -ArgumentList `"/qb`" -Wait -Verbose -ErrorAction Ignore" cleanFilesOnExit = $false sleepTimer = "5" retryCountMax = "5" brokenTestMax = "5" <# Max tests before the script closing from a broken loop #> } function Install-Program { <# .SYNOPSIS Version 1.1 .DESCRIPTION Smart install programs script, multi options. .EXAMPLE $InstallParameters = @{ installSource = "URL" configFile = "O365Office.xml" configContent = $configContent installZip = "" installName = "setup.exe" zipDir = "" unzipDir = "" installDir = "$env:windir\Temp" installTests = "$env:ProgramFiles\Microsoft Office\root\Office16\OUTLOOK.EXE", "${env:ProgramFiles(x86)}\Microsoft Office\root\Office16\OUTLOOK.EXE", "$env:ProgramFiles\Microsoft Office\Office16\OUTLOOK.EXE", "${env:ProgramFiles(x86)}\Microsoft Office\Office16\OUTLOOK.EXE", "$env:ProgramFiles\Microsoft Office\Office15\OUTLOOK.EXE", "${env:ProgramFiles(x86)}\Microsoft Office\Office15\OUTLOOK.EXE" installArgument = "Start-Process -FilePath `"$env:windir\Temp\setup.exe`" -ArgumentList `'/configure `"$env:windir\Temp\O365Office.xml`"`' -Wait -Verbose -ErrorAction Ignore" cleanFilesOnExit = $true sleepTimer = "5" retryCountMax = "5" brokenTestMax = "5" } Install-Program @InstallParameters #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [uri]$installSource, [Parameter(Mandatory = $false)] [String]$configFile, [Parameter(Mandatory = $false)] [String]$configContent, [Parameter(Mandatory = $false)] [String]$installZip, [Parameter(Mandatory = $false)] [String]$installName, [Parameter(Mandatory = $false)] [String]$zipDir, [Parameter(Mandatory = $false)] [String]$unzipDir, [Parameter(Mandatory = $false)] [String]$installDir, [Parameter(Mandatory = $false)] [Array]$installTests, [Parameter(Mandatory = $false)] [String]$installArgument, [Parameter(Mandatory = $true)] [Switch]$cleanFilesOnExit, [Parameter(Mandatory = $true)] [int]$sleepTimer, [Parameter(Mandatory = $false)] [int]$retryCountMax, [Parameter(Mandatory = $true)] [int]$brokenTestMax ) [Switch]$loop = $true <# Base loop, do not change #> [int]$retryCount = "0" <# Loop starting at 0, do not change #> [int]$brokenTest = "0" <# Test starting at 0, do not change #> [Switch]$startInstall = $true <# Base status, do not change #> [Switch]$skipFailTest = $false if (([int]$retryCountMax -eq "0") -or (([string]::IsNullOrEmpty($retryCountMax)))) { [Switch]$skipFailTest = $true } if (!([string]::IsNullOrEmpty($installTests))) { foreach ($installTest in $installTests) { if (Test-Path -Path $installTest) { [Switch]$startInstall = $false; break } } <# Test for install #> } else { [Switch]$startInstall = $true $installTest = $false $skipFailTest = $true } function Create-Folders { [CmdletBinding()] param ( [Parameter(Position = 0, Mandatory = $true)] [System.Array]$folders ) foreach ($folder in $folders) { if (!([System.IO.Directory]::Exists($folder))) { New-Item $folder -ItemType Directory | Out-Null } } <# Create directory if not exists #> } if (!([string]::IsNullOrEmpty($unzipDir))) { [System.Array]$foldersArray += $unzipDir } if (!([string]::IsNullOrEmpty($zipDir))) { [System.Array]$foldersArray += $zipDir } if (!([string]::IsNullOrEmpty($installDir))) { [System.Array]$foldersArray += $installDir } Create-Folders -Folders $foldersArray if ([Switch]$startInstall) { do <# Install and verify #> { function Clean-InstallFiles { if (!([string]::IsNullOrEmpty($zipDir))) { if (Test-Path -Path "$zipDir\$installZip") { Remove-Item -Path "$zipDir\$installZip" -Force -Verbose -ErrorAction SilentlyContinue } if (Test-Path -Path "$installDir") { Remove-Item -Path "$installDir" -Recurse -Force -Verbose -ErrorAction SilentlyContinue } } else { if (Test-Path -Path "$installDir\$installName") { Remove-Item -Path "$installDir\$installName" -Force -Verbose -ErrorAction SilentlyContinue } } if (!([string]::IsNullOrEmpty($configFile))) { If (Test-Path "$installDir\$configFile") { Remove-Item -Path "$installDir\$configFile" -Force -Verbose -ErrorAction SilentlyContinue } } } if (!(Test-Path -Path $installTest)) <# Download & Unzip block #> { if ([int]$retryCount -eq "0") { $retryCount += 1 if (!([string]::IsNullOrEmpty($installZip))) <# Download block #> { if (!(Test-Path -Path "$zipDir\$installZip")) <# Lookup if the zip is there, Download #> { Write-Verbose "Downloading to `"$zipDir\$installZip`"" try { Invoke-WebRequest $installSource -OutFile "$zipDir\$installZip" -Verbose -ErrorAction Ignore | Wait-Job } catch [System.Net.WebException] { Write-Output "Link Broken / No network." exit } } If (Test-Path -Path "$zipDir\$installZip") <# Unzip block #> { $ErrorOccured = $false try { Expand-Archive -Path "$zipDir\$installZip" -DestinationPath "$unzipDir" -Force -Verbose -ErrorAction Ignore } catch { Write-Output "The zip `"$zipDir\$installZip`" is broken, downloading again..." Clean-InstallFiles $retryCount -= 1 $ErrorOccured = $true } } } else { if (!(Test-Path -Path "$installName")) <# Lookup if the file is there, Download #> { Write-Verbose "Downloading to `"$installDir\$installName`"" try { Invoke-WebRequest $installSource -OutFile "$installDir\$installName" -Verbose -ErrorAction Ignore | Wait-Job } catch [System.Net.WebException] <# This catch is here in case of a dead link, if you get this error the link is either dead or broken. #> { Write-Output "Link Broken / No network." exit } } } if (!($ErrorOccured)) <# Run install block #> { if (!([string]::IsNullOrEmpty($configFile)) -and (!([string]::IsNullOrEmpty($configFile)))) { New-Item -Path $installDir -Name $configFile -ItemType "file" -Value $configContent -Force -Verbose } if (!([string]::IsNullOrEmpty($installArgument))) <# If installArgument is empty there is nothing to install, skip. #> { Write-Output "Running install.." Write-Output "Command: `"$installArgument`"" try { Invoke-Expression -Command $installArgument } catch { Write-Output "The file `"$installDir\$installName`" is broken, downloading again..." Clean-InstallFiles $retryCount -= 1 } } } } } if (!($skipFailTest)) { foreach ($installTest in $installTests) { if (Test-Path -Path $installTest) { break } } <# Test for install #> if (Test-Path -Path $installTest) { Write-Output "Installed!" if ([Switch]$cleanFilesOnExit) { Clean-InstallFiles } [Switch]$loop = $false } if (!(Test-Path -Path $installTest)) { if ($retryCount -gt $retryCountMax) { Write-Output "Failed to install..." Clean-InstallFiles [Switch]$loop = $false } elseif ([int]$retryCount -eq "0") { #Write-Output "Test" } <# Do nothing #> else { Write-Output "Testing install, attempt number $retryCount, Waiting $sleepTimer secs..." Start-Sleep -Seconds $sleepTimer $retryCount += 1 } <# Sleep before next loop #> } } else { [Switch]$loop = $false } $brokenTest += 1 <# If this loop hits $brokenTestMax the script will stop. #> if ($brokenTest -gt $brokenTestMax) { Write-Output "The script is broken, closing." exit } } While ($loop) } else { Write-Output "The program is already installed on this machine" } } function OpenVPN-Profile { Write-Host "Updating the config file..." if (!(Test-Path -Path $profileDir)) { New-Item -Path "$profileDir" -ItemType "directory" -Force } <# Lookup if the temp folder is there and create #> If (Test-Path "$profileDir\$profileName") { Remove-Item -Path "$profileDir\$profileName" -Force } If (!(test-path "$profileDir\$profileName")) { New-Item -Path $profileDir -Name $profileName -ItemType "file" -Value $profileContent -Force | Out-Null } } function OpenVPN-Remove-Service { Write-Output "Removing OpenVPN as a service, to replace with a GUI" Get-Process | Where-Object { $_.Name -eq "OpenVPNConnect" } | Stop-Process -Force Start-Process "C:\Program Files\OpenVPN Connect\ovpnconnector.exe" -Args "stop" -Wait Start-Process "C:\Program Files\OpenVPN Connect\ovpnconnector.exe" -Args "unset-config profile" -Wait Start-Process "C:\Program Files\OpenVPN Connect\ovpnconnector.exe" -Args "remove" -Wait } function OpenVPN-Config-GUI { Write-Host "Setting up the OpenVPN GUI..." [ScriptBlock]$scriptBlock = { $localAdmin = "Administrator" $profileName = "profile.ovpn" $exeLocation = "$env:Programfiles\OpenVPN Connect\OpenVPNConnect.exe" $profileDir = "$env:SystemDrive\Temp" $profileLocation = "$profileDir\$profileName" $username = $env:USERNAME if ($username -contains "Administrator") { if ($username -match "Administrator") { } else { $username = $username -replace "Administrator", "" } } $profileShortName = $profileName -Replace ".ovpn", "" $argumentList = "--minimize --accept-gdpr --skip-startup-dialogs --import-profile=$profileLocation --name=$profileShortName --username=$username --set-settings=launch-options --value=connect-latest --set-settings=seamless-tunnel --value=false --set-settings=enable-crash-reporting --value=true" Write-Host "Username: $username" Write-Host "Profile: $profileLocation" Write-Host "EXE: $exeLocation" Start-Process -FilePath $exeLocation -ArgumentList $argumentList <# Run the config #> Start-Sleep -Seconds 5 Start-Process -FilePath $exeLocation <# Start the program #> } try { Invoke-AsCurrentUser -ScriptBlock $scriptBlock -CacheToDisk -ErrorAction Stop } catch [Microsoft.PowerShell.Commands.WriteErrorException] { Invoke-Command -Command $scriptBlock } } function Install-CustomModule { param ( [Parameter(Mandatory = $true)] [Array]$Modules ) foreach ($module in $modules) { try { #Write-Output "Importing module '$module'" function Update-CustomModule { [cmdletbinding()] [outputtype("moduleInfo")] Param ( [Parameter(Position = 0, HelpMessage = "Enter a module name or names. Wildcards are allowed.")] [ValidateNotNullorEmpty()] [string[]]$Name = "*" ) Write-Verbose "Getting installed modules" Try { $modules = Get-Module -Name $name -ListAvailable -ErrorAction Stop } Catch { Throw $_ } if ($modules) { Write-Verbose "Found $($modules.count) matching modules" #group to identify modules with multiple versions installed Write-Verbose "Grouping modules" $g = $modules | Group-Object name -NoElement | Where-Object count -GT 1 Write-Verbose "Filter to modules from the PSGallery" $gallery = $modules.where({ $_.repositorysourcelocation }) Write-Verbose "Comparing to online versions" foreach ($module in $gallery) { #find the current version in the gallery Try { Write-Verbose "Looking online for $($module.name)" $online = Find-Module -Name $module.name -Repository PSGallery -ErrorAction Stop #compare versions if (($online.version -as [version]) -gt ($module.version -as [version])) { Uninstall-Module -Name $module -AllVersions -Force Install-Module -Name $module -Scope AllUsers -AllowClobber -Force } } Catch { #Write-Warning "Module $($module.name) was not found in the PSGallery" } } #foreach } else { Write-Warning "No matching modules found." } Write-Verbose "Check complete" } Update-CustomModule -Name "ExchangeOnlineManagement" -Verbose:$false Import-Module $module -ErrorAction Stop } catch { Write-Output "Could not find '$module' module, installing..." Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Verbose:$false *>$null Install-Module -Name $module -Scope AllUsers -AllowClobber -Force Import-Module $module -ErrorAction Stop #Write-Output "Importing module '$module'" } } } if (Get-WmiObject -Class win32_systemenclosure | Where-Object { $_.chassistypes -eq 9 -or $_.chassistypes -eq 10 -or $_.chassistypes -eq 14 }) { $Chasis = "Laptop" } if (Get-WmiObject -Class win32_battery) { $Chasis = "Laptop" } <# Shows battery status , if true then the machine is a laptop. #> else { $Chasis = "Desktop" } if ($blockDesktopInstall -eq "true") { Write-Output "Chasis: $Chasis, Block Desktop install is set to `"$blockDesktopInstall`"" if (($Chasis -eq "Laptop")) { Install-CustomModule -modules "RunAsUser" Install-Program @InstallParameters OpenVPN-Profile OpenVPN-Remove-Service OpenVPN-Config-GUI } else { OpenVPN-Remove-Service; Write-Output "PC is a $Chasis, skipping install." } }
Editor is loading...