Add self-hosted RustDesk bootstrap management
This commit is contained in:
@@ -124,6 +124,7 @@ $runtimeInstaller = Get-ChildItem (Join-Path $packageRoot 'payload\prerequisites
|
||||
Select-Object -First 1
|
||||
foreach ($requiredPath in @(
|
||||
(Join-Path $scriptsRoot 'Enroll-SguDomainClient.ps1'),
|
||||
(Join-Path $scriptsRoot 'Install-SguRustDeskClient.ps1'),
|
||||
(Join-Path $scriptsRoot 'Register-SguClientCertificate.ps1'),
|
||||
(Join-Path $providerPublishPath 'SGU.CredentialProvider.comhost.dll'))) {
|
||||
if (-not (Test-Path -LiteralPath $requiredPath -PathType Leaf)) {
|
||||
@@ -177,10 +178,23 @@ try {
|
||||
$serverIdentity = Invoke-Command -Session $session -ScriptBlock {
|
||||
$computer = Get-CimInstance Win32_ComputerSystem
|
||||
$brokerService = Get-Service SGUAuthBroker -ErrorAction SilentlyContinue
|
||||
$rustDeskStatusPath = Join-Path $env:ProgramData 'SGU\RustDesk\server.json'
|
||||
$rustDeskStatus = if (Test-Path -LiteralPath $rustDeskStatusPath -PathType Leaf) {
|
||||
Get-Content -LiteralPath $rustDeskStatusPath -Raw | ConvertFrom-Json
|
||||
}
|
||||
else {
|
||||
$null
|
||||
}
|
||||
$hbbsTask = Get-ScheduledTask -TaskName 'SGU-RustDesk-hbbs' -ErrorAction SilentlyContinue
|
||||
$hbbrTask = Get-ScheduledTask -TaskName 'SGU-RustDesk-hbbr' -ErrorAction SilentlyContinue
|
||||
[pscustomobject]@{
|
||||
ComputerName = $env:COMPUTERNAME
|
||||
Domain = $computer.Domain
|
||||
BrokerService = if ($brokerService) { $brokerService.Status.ToString() } else { 'Missing' }
|
||||
RustDeskServerAddress = if ($rustDeskStatus) { [string]$rustDeskStatus.ServerAddress } else { $null }
|
||||
RustDeskPublicKey = if ($rustDeskStatus) { [string]$rustDeskStatus.PublicKey } else { $null }
|
||||
RustDeskHbbsTask = if ($hbbsTask) { $hbbsTask.State.ToString() } else { 'Missing' }
|
||||
RustDeskHbbrTask = if ($hbbrTask) { $hbbrTask.State.ToString() } else { 'Missing' }
|
||||
}
|
||||
}
|
||||
if (-not $serverIdentity.Domain -or
|
||||
@@ -190,6 +204,12 @@ try {
|
||||
if ($serverIdentity.BrokerService -ne 'Running') {
|
||||
throw "The SGU Authentication Broker is not running on $($serverIdentity.ComputerName)."
|
||||
}
|
||||
if ([string]::IsNullOrWhiteSpace($serverIdentity.RustDeskServerAddress) -or
|
||||
[string]::IsNullOrWhiteSpace($serverIdentity.RustDeskPublicKey) -or
|
||||
$serverIdentity.RustDeskHbbsTask -ne 'Running' -or
|
||||
$serverIdentity.RustDeskHbbrTask -ne 'Running') {
|
||||
throw "The RustDesk server is not ready on $($serverIdentity.ComputerName). Run the current server bootstrap first."
|
||||
}
|
||||
|
||||
$certificateSubject = "CN=SGU Credential Provider Client $env:COMPUTERNAME"
|
||||
$clientCertificate = Get-ChildItem Cert:\LocalMachine\My |
|
||||
@@ -274,6 +294,8 @@ try {
|
||||
DomainDnsServerAddresses = @($DomainControllerIPv4Address.IPAddressToString)
|
||||
RemoteDesktopPrincipal = "$DomainNetbios\SG-Laboratorio-Usuarios-RDP"
|
||||
DotNetRuntimeInstallerPath = $runtimeInstaller.FullName
|
||||
RustDeskServerAddress = $serverIdentity.RustDeskServerAddress
|
||||
RustDeskServerPublicKey = $serverIdentity.RustDeskPublicKey
|
||||
SkipRestart = $true
|
||||
}
|
||||
if ($NewComputerName) {
|
||||
@@ -281,6 +303,31 @@ try {
|
||||
}
|
||||
|
||||
$result = & (Join-Path $scriptsRoot 'Enroll-SguDomainClient.ps1') @enrollmentParameters
|
||||
|
||||
$rustDeskEnrollment = $result.RustDesk
|
||||
if (-not $rustDeskEnrollment -or -not $rustDeskEnrollment.RustDeskId -or
|
||||
-not $rustDeskEnrollment.AccessPassword) {
|
||||
throw 'The client RustDesk enrollment did not provide an ID and protected access credential.'
|
||||
}
|
||||
$rustDeskPasswordPointer = [Runtime.InteropServices.Marshal]::SecureStringToBSTR(
|
||||
$rustDeskEnrollment.AccessPassword)
|
||||
try {
|
||||
$rustDeskPassword = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($rustDeskPasswordPointer)
|
||||
Invoke-Command -Session $session -ScriptBlock {
|
||||
param($ComputerName, $RustDeskId, $AccessPassword)
|
||||
$registrationScript = Join-Path $env:ProgramData 'SGU\RustDesk\Register-SguRustDeskDevice.ps1'
|
||||
if (-not (Test-Path -LiteralPath $registrationScript -PathType Leaf)) {
|
||||
throw 'The RustDesk device-registration script is missing on the domain controller.'
|
||||
}
|
||||
& $registrationScript -ComputerName $ComputerName -RustDeskId $RustDeskId `
|
||||
-AccessPassword $AccessPassword | Out-Null
|
||||
} -ArgumentList $env:COMPUTERNAME,$rustDeskEnrollment.RustDeskId,$rustDeskPassword
|
||||
}
|
||||
finally {
|
||||
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($rustDeskPasswordPointer)
|
||||
$rustDeskPassword = $null
|
||||
}
|
||||
$rustDeskEnrollment.PSObject.Properties.Remove('AccessPassword')
|
||||
}
|
||||
finally {
|
||||
if ($session) {
|
||||
@@ -319,6 +366,7 @@ if ($SkipRestart) {
|
||||
ClientCertificateRegistered = $true
|
||||
BrokerEndpoint = $brokerEndpoint
|
||||
RestartRequired = $true
|
||||
RustDesk = if ($result) { $result.RustDesk } else { $null }
|
||||
EnrollmentResult = $result
|
||||
}
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user