Desinstalación del agente de Azure Connected Machine desde servidores habilitados para Arc

Si ya no desea administrar una máquina a través de servidores habilitados para Azure Arc, debe quitar las extensiones de máquina virtual del servidor, desconectar el agente y desinstalar el software del servidor. Es importante completar todos estos pasos para quitar completamente todos los componentes de software relacionados del sistema.

Quitar extensiones de máquina virtual

Si ha implementado Azure extensiones de máquina virtual en un servidor habilitado para Azure Arc, debe desinstalar todas las extensiones antes de desconectar el agente o desinstalar el software. La desinstalación del agente de Azure Connected Machine no quita automáticamente las extensiones y estas extensiones no se reconocen si vuelve a conectar el servidor a Azure Arc.

Para obtener instrucciones sobre cómo enumerar y quitar las extensiones en el servidor habilitado para Azure Arc, consulte los siguientes recursos:

Desconecte el servidor de Azure Arc

Después de quitar todas las extensiones del servidor habilitado para Arc, el siguiente paso es desconectar el agente. Esta acción elimina el recurso de Azure correspondiente para el servidor y borra el estado local del agente.

Para desconectar el agente, ejecute el azcmagent disconnect comando como administrador en el servidor. Se le pedirá que inicie sesión con una cuenta de Azure que tenga permiso para eliminar el recurso de la suscripción. Si el recurso ya se eliminó en Azure, pase una marca adicional para limpiar el estado local: azcmagent disconnect --force-local-only.

Si sus cuentas de administrador y de Azure son diferentes, es posible que surjan problemas porque el mensaje de inicio de sesión se establece de forma predeterminada en la cuenta de administrador. Para resolver estos problemas, ejecute el azcmagent disconnect --use-device-code comando . Se le pedirá que inicie sesión con una cuenta de Azure que tenga permiso para eliminar el recurso.

Caution

Al desconectar el agente de las máquinas virtuales habilitadas para Arc que se ejecutan en Azure Local, use solo el comando azcmagent disconnect --force-local-only. El uso del comando sin la marca --force-local-only puede hacer que la máquina virtual de Arc en Azure Local se elimine tanto de Azure como del entorno local.

Desinstalación del agente

Después de desconectar el agente de Azure Arc, quite el agente de Connected Machine del servidor.

Ambos métodos siguientes quitan el agente, pero no quitan la carpeta C:\Archivos de programa\AzureConnectedMachineAgent en el equipo.

Desinstalar desde el Panel de control

Siga estos pasos para desinstalar el agente de Windows de la máquina:

  1. Inicie sesión en el equipo con una cuenta que disponga de permisos de administrador.
  2. En el Panel de control, seleccione Programas y características.
  3. En Programas y características, seleccione Agente de máquina conectada de Azure, desinstalar y, a continuación, seleccione .

También puede eliminar el agente de Windows directamente desde el asistente para la instalación del agente. Ejecute el paquete del instalador deAzureConnectedMachineAgent.msi para hacerlo.

Desinstalar desde la línea de comandos

Puede desinstalar el agente manualmente desde el símbolo del sistema o mediante un método automatizado (como un script) siguiendo el ejemplo siguiente. En primer lugar, debe recuperar el código del producto, que es un GUID que es el identificador principal del paquete de aplicación, desde el sistema operativo. La desinstalación se realiza mediante la línea de comandos Msiexec.exe : msiexec /x {Product Code}.

  1. Abra el Editor del Registro.

  2. En la clave del registro HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall, busque y copie el GUID del código de producto.

  3. Desinstale el agente mediante Msiexec, como en los ejemplos siguientes:

    • En la línea de comandos, escriba el siguiente comando:

      msiexec.exe /x {product code GUID} /qn
      
    • Puede realizar los mismos pasos mediante PowerShell:

      Get-ChildItem -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall | `
      Get-ItemProperty | `
      Where-Object {$_.DisplayName -eq "Azure Connected Machine Agent"} | `
      ForEach-Object {MsiExec.exe /x "$($_.PsChildName)" /qn}
      

Eliminación de recursos obsoletos del servidor

Si retira o desconecta un servidor sin quitar limpiamente el agente, el recurso normalmente permanece en el portal de Azure con un estado Disconnected. Con el tiempo, estos recursos obsoletos pueden desordenar su entorno.

El siguiente script de PowerShell le ayuda a identificar y eliminar servidores habilitados para Azure Arc que se han desconectado durante un número especificado de días.

Prerequisites

  • Azure PowerShell: Az módulo instalado.
  • Permisos: Acceso de lector para realizar consultas a través de Azure Resource Graph, y de colaborador o propietario (o Microsoft.HybridCompute/machines/delete) para eliminar los recursos.

Script de limpieza

Este script usa Azure Resource Graph para consultar Microsoft.HybridCompute/machines recursos en los que el estado es Disconnected y la marca de tiempo lastStatusChange es anterior al umbral configurado.

Guarde el código siguiente como Cleanup-StaleArcServers.ps1.

<#
.SYNOPSIS
    Identifies and removes stale Azure Arc-enabled servers that have been disconnected for a specified number of days.

.DESCRIPTION
    This script queries Azure Resource Graph to find Azure Arc-enabled servers (Microsoft.HybridCompute/machines)
    that have a status of 'Disconnected' and have not updated their status for more than the specified number of days.
    Supports -WhatIf and -Confirm via SupportsShouldProcess.

.PARAMETER DaysDisconnected
    The number of days a server must be disconnected to be considered stale. Default is 60.

.PARAMETER Subscription
    Optional. One or more Subscription IDs to scope the query to.
    If not specified, queries all subscriptions the current context has access to.

.PARAMETER ManagementGroup
    Optional. A Management Group name to scope the query to.
    Cannot be used together with -Subscription.

.EXAMPLE
    .\Cleanup-StaleArcServers.ps1 -DaysDisconnected 60 -WhatIf
    Lists Arc servers disconnected for more than 60 days across all subscriptions.

.EXAMPLE
    .\Cleanup-StaleArcServers.ps1 -DaysDisconnected 90 -Subscription 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    Permanently deletes Arc servers disconnected for more than 90 days in the specified subscription.

.NOTES
    Author: Microsoft
    Date: 2026-01-12
    Requires: Az.ResourceGraph, Az.Resources
#>

[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
param (
    [int]$DaysDisconnected = 60,
    
    [ValidateNotNullOrEmpty()]
    [string[]]$Subscription,

    [ValidateNotNullOrEmpty()]
    [string]$ManagementGroup
)

# Check required modules
foreach ($mod in @('Az.ResourceGraph', 'Az.Resources')) {
    if (-not (Get-Module -Name $mod -ListAvailable -ErrorAction SilentlyContinue)) {
        Write-Error "Required module '$mod' is not installed. Run: Install-Module $mod -Scope CurrentUser"
        return
    }
}

# Check for Azure connection
try {
    $context = Get-AzContext -ErrorAction Stop
    Write-Host "Connected to Azure context: $($context.Name)" -ForegroundColor Cyan
}
catch {
    Write-Error "Not connected to Azure. Please run 'Connect-AzAccount' first."
    return
}

# Construct the KQL query
# We look for resources of type hybridcompute/machines
# Status must be Disconnected
# lastStatusChange must be older than $DaysDisconnected
$kqlQuery = @"
Resources
| where type == 'microsoft.hybridcompute/machines'
| where properties.status == 'Disconnected'
| where properties.lastStatusChange < ago($($DaysDisconnected)d)
| project id, name, resourceGroup, subscriptionId, location, status = properties.status, lastStatusChange = properties.lastStatusChange
"@

Write-Host "Searching for Arc servers disconnected for more than $DaysDisconnected days..." -ForegroundColor Yellow

# Execute Search with pagination (Search-AzGraph returns max 1000 results per call)
$staleServers = [System.Collections.Generic.List[object]]::new()
$skipToken = $null

try {
    do {
        $params = @{
            Query = $kqlQuery
            First = 1000
        }
        if ($skipToken) {
            $params['SkipToken'] = $skipToken
        }
        if ($Subscription) {
            $params['Subscription'] = $Subscription
        }
        if ($ManagementGroup) {
            $params['ManagementGroup'] = $ManagementGroup
        }

        $result = Search-AzGraph @params -ErrorAction Stop
        if ($result) {
            $staleServers.AddRange([object[]]$result)
            $skipToken = $result.SkipToken
        }
    } while ($skipToken)
}
catch {
    Write-Error "Failed to query Azure Resource Graph. Ensure resource graph module is installed and you have read permissions.`nError: $_"
    return
}

if ($staleServers.Count -eq 0) {
    Write-Host "No stale Arc servers found matching the criteria." -ForegroundColor Green
    return
}

Write-Host "Found $($staleServers.Count) stale servers." -ForegroundColor Yellow

# Process results
$successCount = 0
$failCount = 0

foreach ($server in $staleServers) {
    if ($PSCmdlet.ShouldProcess($server.id, "Delete stale Arc server '$($server.name)' (Disconnected since: $($server.lastStatusChange))")) {
        try {
            Remove-AzResource -ResourceId $server.id -Force -ErrorAction Stop
            Write-Host "Successfully deleted '$($server.name)'." -ForegroundColor Green
            $successCount++
        }
        catch {
            Write-Error "Failed to delete '$($server.name)'. Error: $_"
            $failCount++
        }
    }
}

Write-Host "`nCleanup completed. Deleted: $successCount, Failed: $failCount, Total: $($staleServers.Count)" -ForegroundColor Green

Uso del script

Prerequisites

El script requiere los siguientes módulos de PowerShell:

  • Az.ResourceGraph
  • Az.Resources

Si no están instalados, ejecute:

Install-Module Az.ResourceGraph, Az.Resources -Scope CurrentUser

Steps

  1. Iniciar sesión en Azure

    Abra el terminal de PowerShell e inicie sesión.

    Connect-AzAccount
    
  2. Ejecución de un análisis de What-If

    En primer lugar, ejecute el script con la opción -WhatIf. En este paso se enumeran los servidores que cumplen los criterios sin eliminarlos realmente. Este comando comprueba los servidores que se han desconectado durante 60 días o más.

    .\Cleanup-StaleArcServers.ps1 -DaysDisconnected 60 -WhatIf
    

    Para limitar el ámbito de la consulta a una suscripción específica, use el -Subscription parámetro :

    .\Cleanup-StaleArcServers.ps1 -DaysDisconnected 60 -Subscription 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' -WhatIf
    

    Para limitar el ámbito de la consulta a un grupo de administración en su lugar, use el -ManagementGroup parámetro :

    .\Cleanup-StaleArcServers.ps1 -DaysDisconnected 60 -ManagementGroup 'MyManagementGroup' -WhatIf
    

    Revise la salida para asegurarse de que solo enumera los servidores previstos.

  3. Realizar la limpieza

    Cuando esté seguro de la lista de servidores que se van a quitar, ejecute el script sin el -WhatIf conmutador.

    .\Cleanup-StaleArcServers.ps1 -DaysDisconnected 60
    

    Para limpiar los servidores desconectados durante un período más largo (por ejemplo, seis meses), aumente el número de días:

    .\Cleanup-StaleArcServers.ps1 -DaysDisconnected 180
    

    El script solicita confirmación antes de cada eliminación. Para omitir mensajes, agregue -Confirm:$false.