Alta de usuario completamente automatizada desde una lista de SharePoint. Crea la cuenta en Active Directory, sincroniza con Microsoft 365, crea la VM Hyper-V si es necesario, y publica el resultado directamente en Jira.
Un nuevo elemento en la lista de SharePoint dispara Power Automate, que crea el job en Azure Automation y espera el resultado. El Hybrid Worker on-prem ejecuta el wrapper, que a su vez llama a los scripts de logica en el servidor.
onboarding.ps1 (en git, en el servidor).
CreateVM=true y el alta es exitosa
→ llama a create_vm.ps1 via Start-Process aislado.
Todos los parametros se mapean directamente desde Power Automate al crear el job. Los parametros de solo wrapper (JiraTicket, CreateVM) se eliminan de PSBoundParameters antes de pasar al script de logica.
| Parametro | Tipo | Obligatorio | Descripcion |
|---|---|---|---|
SourceUserSamAccountName | string | Si | Usuario AD a clonar como plantilla |
NewSamAccountName | string | Si | Login del nuevo usuario |
GivenName | string | Si | Nombre |
Surname | string | Si | Apellidos |
UserPrincipalName | string | No | UPN si difiere del patron por defecto |
CompanyName, Manager, Office... | string | No | Atributos AD opcionales |
PrimarySMTP | string | No | SMTP primario del buzon |
SecondarySMTP | string[] | No | Aliases de correo adicionales |
ExtensionAttribute1..15 | string | No | Atributos extendidos AD (explicito > heredado de plantilla) |
AdditionalGroups | string[] | No | Grupos adicionales mas alla de los de la plantilla |
OU | string[] | No | OU destino. Azure Automation fragmenta las comas — el wrapper rejunta el array en un string de ruta DN. |
CreateVM | bool | No | Si true y el alta es exitosa, crea VM en cluster Hyper-V |
Platform | string | No | Plataforma del usuario (Windows o Mac). Determina el grupo de licencias M365 a asignar. |
JiraTicket | string | No | Clave del ticket donde publicar el comentario (ej: SYS-1234) |
Ejecutado por onboarding.ps1 en el servidor on-prem. Cada paso con try/catch. El resultado de cada paso queda reflejado en el log JSON.
| Paso | Accion | Detalle |
|---|---|---|
| 1 | Obtener plantilla | Lectura del usuario de referencia con Get-ADUser -Properties * |
| 2 | Generar password | RNG criptografico RNGCryptoServiceProvider. Formato Palabra##!Palabra con pool de 200 palabras espanolas. Facil de dictar por telefono. |
| 3 | Crear usuario AD | New-ADUser con fusion de atributos: explicitos (parametros) > heredados de plantilla |
| 4 | ProxyAddresses | SMTP primario + aliases secundarios. Respeta la politica de naming corporativa. |
| 5 | ExtensionAttributes | Copia de extensionAttributes 1-15. Prioridad: valor explicito > heredado de plantilla. |
| 6 | Grupos de seguridad | Clonacion de todos los grupos del usuario plantilla + grupos adicionales opcionales via Add-ADGroupMember. |
| 7 | AD Connect delta sync | Trigger de sincronizacion incremental para propagacion inmediata a Azure AD / Microsoft 365. |
| 8 | Habilitar cuenta | Enable-ADAccount tras completar la configuracion inicial. |
| 9 | Salida JSON | Respuesta estructurada con Success, SamAccountName, UPN, Password y Log completo. |
Si el parametro CreateVM es true y el alta de usuario ha sido exitosa, el wrapper lanza create_vm.ps1 para crear la VM del usuario en el cluster Hyper-V.
Conecta al cluster hypervcolt.oficina.idealista, selecciona el nodo disponible y el CSV con mas espacio libre.
Copia el VHDX plantilla (w11plantilla.vhdx) al CSV seleccionado. Configura procesadores, memoria, red VLAN 25 y servicios de integracion.
Registra la VM como rol de cluster con Add-ClusterVirtualMachineRole y la arranca via Start-ClusterGroup.
create_vm.ps1 escribe el resultado en $env:TEMP\create_vm_result.json y el wrapper lo lanza via Start-Process powershell.exe con stdout/stderr redirigidos a ficheros que se descartan. El resultado llega por el fichero temporal, que se elimina tras la lectura.
Si se proporciona el parametro Platform, el wrapper asigna automaticamente al usuario a un grupo de licencias M365 en Azure AD via Microsoft Graph API. El mapeo se configura en config.psd1.
Tabla en config.psd1 → LicenseGroups con mapeo empresa + plataforma → grupo de licencias. Soporta fallback _default, wildcard * y exclusion con $null.
Antes de asignar, consulta Get-MgSubscribedSku para comprobar si quedan licencias disponibles. Si alguna SKU esta agotada, asigna igualmente pero crea un ticket de aviso.
Si las licencias estan agotadas, crea un ticket en Jira (proyecto SIS) con detalle de SKUs y lo enlaza al ticket de alta usando Add-JiraIssueLink.
| Empresa | Windows | Mac |
|---|---|---|
| _default (cualquier empresa) | LIC M365 E5 | LIC M365 Business Premium |
| Avaibook On-line, S.L.U. | LIC M365 E3 | LIC M365 Business Premium |
| Colaborador | LIC M365 F1 (cualquier plataforma) | |
| Externo | Excluido (sin licencia) | |
Get-MgUser hasta 3 veces con 15s de espera entre cada intento para encontrar al usuario antes de asignarlo al grupo.
Si se proporciona JiraTicket, el wrapper publica un comentario wiki-formatted directamente en el ticket via Jira REST API v2. Power Automate solo envia el mensaje de Teams con las credenciales.
{noformat}.
Tabla con (/) COMPLETADO, credenciales de acceso y fila de VM Hyper-V si fue solicitada.
Tabla con (x) ERROR y el log del proceso para diagnostico. El campo success: false en el JSON permite a Power Automate crear un ticket de incidencia adicional.
Autenticacion Basic Auth (email:token en Base64). Funcion Add-JiraComment. El Write-Host del modulo se suprime con 6>$null para no contaminar el JSON output.
El runbook emite un unico JSON compacto al final. Power Automate lo parsea con la accion Parse JSON usando el schema siguiente.
onboarding.ps1 directamente. Esto desacopla el schema de Power Automate de la estructura interna del script y evita rotura del Parse JSON ante cambios internos.