mirror of
https://github.com/PurpleComputing/mdmscripts.git
synced 2026-02-03 14:13:27 +00:00
Create zerotier-win.ps1
This commit is contained in:
112
zerotier-win.ps1
Normal file
112
zerotier-win.ps1
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Installs ZeroTier
|
||||||
|
.DESCRIPTION
|
||||||
|
Install ZeroTier and join/configure ZeroTier network
|
||||||
|
.EXAMPLE
|
||||||
|
./InstallZeroTier.ps1 -NetworkID [Network ID]
|
||||||
|
./InstallZeroTier.ps1 -NetworkID [Network ID] -Token [API Token] -Headless
|
||||||
|
.NOTES
|
||||||
|
Requires PowerShell 7 or higher (installed if missing) when using the $Token parameter.
|
||||||
|
A UAC prompt will appear during install if -Headless is not used.
|
||||||
|
|
||||||
|
CREDIT: https://gist.github.com/wise-io
|
||||||
|
#>
|
||||||
|
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$NetworkID, # ZeroTier Network ID
|
||||||
|
[string]$Token, # ZeroTier API Token
|
||||||
|
[switch]$Headless, # Run msi in headless mode
|
||||||
|
[Alias('AllowDNS')]
|
||||||
|
[switch]$ManageDNS, # Allows ZeroTier to manage DNS
|
||||||
|
[Alias('AllowGlobal')]
|
||||||
|
[switch]$GlobalRoutes, # Allows ZeroTier managed routes to overlap public IP space
|
||||||
|
[Alias('AllowDefault')]
|
||||||
|
[switch]$DefaultRoute # Allows ZeroTier to override system default route (full tunnel)
|
||||||
|
)
|
||||||
|
|
||||||
|
$DownloadURL = 'https://download.zerotier.com/dist/ZeroTier%20One.msi'
|
||||||
|
$Installer = "$env:temp\ZeroTierOne.msi"
|
||||||
|
$ZTCLI = 'C:\Program Files (x86)\ZeroTier\One\zerotier-cli.bat'
|
||||||
|
|
||||||
|
# Set PowerShell to TLS 1.2
|
||||||
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||||
|
|
||||||
|
if ($Token) {
|
||||||
|
# Check for required PowerShell version (7+)
|
||||||
|
if (!($PSVersionTable.PSVersion.Major -ge 7)) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
# Install PowerShell 7 if missing
|
||||||
|
if (!(Test-Path "$env:SystemDrive\Program Files\PowerShell\7")) {
|
||||||
|
Write-Output 'Installing PowerShell version 7...'
|
||||||
|
Invoke-Expression "& { $(Invoke-RestMethod https://aka.ms/install-powershell.ps1) } -UseMSI -Quiet"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Refresh PATH
|
||||||
|
$env:Path = [System.Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' + [System.Environment]::GetEnvironmentVariable('Path', 'User')
|
||||||
|
|
||||||
|
# Restart script in PowerShell 7
|
||||||
|
pwsh -File "`"$PSCommandPath`"" @PSBoundParameters
|
||||||
|
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Output 'PowerShell 7 was not installed. Update PowerShell and try again.'
|
||||||
|
throw $Error
|
||||||
|
}
|
||||||
|
finally { exit $LASTEXITCODE }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Write-Output 'Downloading ZeroTier...'
|
||||||
|
Invoke-WebRequest -Uri $DownloadURL -OutFile $Installer
|
||||||
|
|
||||||
|
Write-Output 'Installing ZeroTier...'
|
||||||
|
if ($Headless) {
|
||||||
|
# Install & unhide from installed programs list
|
||||||
|
cmd /c msiexec /i $Installer /qn /norestart 'ZTHEADLESS=Yes'
|
||||||
|
if ($env:PROCESSOR_ARCHITECTURE -eq 'AMD64') { $RegKey = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{002609B2-C32C-481A-B17F-B7ED428427AC}' }
|
||||||
|
else { $RegKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{002609B2-C32C-481A-B17F-B7ED428427AC}' }
|
||||||
|
Remove-ItemProperty -Path $RegKey -Name 'SystemComponent' -ErrorAction Ignore
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
# Install & close ui
|
||||||
|
cmd /c msiexec /i $Installer /qn /norestart
|
||||||
|
Stop-Process -Name 'zerotier_desktop_ui' -Force -ErrorAction Ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get Node ID
|
||||||
|
$NodeID = (cmd /c $ZTCLI info).split(' ')[2]
|
||||||
|
|
||||||
|
# API Member object properties
|
||||||
|
$Member = @{
|
||||||
|
name = $env:COMPUTERNAME
|
||||||
|
description = ''
|
||||||
|
config = @{ authorized = $True }
|
||||||
|
} | ConvertTo-Json
|
||||||
|
|
||||||
|
# Prepare API request
|
||||||
|
$Params = @{
|
||||||
|
Method = 'Post'
|
||||||
|
Uri = "https://my.zerotier.com/api/network/$NetworkID/member/$NodeID"
|
||||||
|
Body = $Member
|
||||||
|
Authentication = 'Bearer'
|
||||||
|
Token = ConvertTo-SecureString $Token -AsPlainText -Force
|
||||||
|
MaximumRetryCount = 3
|
||||||
|
RetryIntervalSec = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
# Join network
|
||||||
|
Write-Output "Configuring ZeroTier network $NetworkID as $NodeID..."
|
||||||
|
if ($Token) { Invoke-RestMethod @Params } else { cmd /c $ZTCLI join $NetworkID }
|
||||||
|
|
||||||
|
# Configure ZeroTier client
|
||||||
|
if ($ManageDNS) { $AllowDNS = 1 } else { $AllowDNS = 0 }
|
||||||
|
if ($GlobalRoutes) { $AllowGlobal = 1 } else { $AllowGlobal = 0 }
|
||||||
|
if ($DefaultRoute) { $AllowDefault = 1 } else { $AllowDefault = 0 }
|
||||||
|
cmd /c $ZTCLI set $NetworkID allowDNS=$AllowDNS allowGlobal=$AllowGlobal allowDefault=$AllowDefault | Out-Null
|
||||||
|
}
|
||||||
|
catch { throw $Error }
|
||||||
|
finally { Remove-Item $Installer -Force -ErrorAction Ignore }
|
||||||
Reference in New Issue
Block a user