Powershell: Script para comprobar perfiles VHDX FSLogix en Citrix
Hoy os voy a dejar un script de cosecha propia…se puede utilizar para perfiles Citrix basado en el sistema de perfilado FSLogix de Microsoft.
Os explico lo que vamos a hacer con él:
- Comprobar que los discos VHDX no crecen más de 4GB
- Lo completo con otro script que comprime el disco si pasa de cierto tamaño y podéis encontrar en la siguiente entrada
- Si han crecido ese tamaño, mandamos un correo directamente al usuario para que mueva datos de su perfil a los recursos de archivado, como unidades de red
- Para ello me baso en el nombre del disco VHDX, que es el del usuario (si tiene el SID habría que modificarlo)
- Lo ejecutaré sobre una tarea programada en un servidor Windows Server
- Veréis que si la línea es 1, utilizo un filtro. Esto es porque no he logrado sacar el resultado sin que el primer valor se corte
- Adicionalmente, he generado una cuenta de email para que envíe los correos. Esa cuenta, no puede ir en claro en el script, así que lo codificamos con Base64, por ejemplo:
PS C:\WINDOWS\system32> $Text = 'pruebascript' $Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text) $EncodedText =[Convert]::ToBase64String($Bytes) $EncodedText $Text = 'elblogdenegu@maquinasvirtuales.eu' $Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text) $EncodedText =[Convert]::ToBase64String($Bytes) $EncodedText cAByAHUAZQBiAGEAcwBjAHIAaQBwAHQA ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUAQABnAG0AYQBpAGwALgBjAG8AbQA=El script extrae el dato de los discos VHDX y trata por un lado el tamaño, y por otro el nombre, que en mi caso es el mismo el nombre del disco al del usuario:
GITHUB: https://gist.github.com/raulunzue/22423917c69465d44a8a2cf97edb75f5
###################### # FUNCION SABER LINEA ###################### function linea { $input | Select-String '.' | Select-Object -Property LineNumber, Line } ############################### # LISTAR DISCOS Y TAMAÑOS VHDX ############################### $usuarios=Get-ChildItem -Path "c:\Users\runzue" -Filter "*.vhdx" -Recurse -File | Select-Object Name, @{n = 'SizeInGB'; e = {[math]::round($_.length/1GB,2)}} # SEPARAMOS Y LIMPIAMOS VALORES EN DOS LISTADOS #DISCOS-USUARIOS $usuarios.Name | ForEach-Object { $_ -replace ".vhdx","" } > "c:\Users\runzue\vhdx.txt" # Limpiamos los espacios en blanco y exportamos a TXT (Get-Content c:\Users\runzue\vhdx.txt) | ? {$_.trim() -ne "" } | Set-Content c:\Users\runzue\vhdx.txt #$vhdx=(Get-Content -Path "c:\Users\runzue\vhdx.txt") #ESPACIO OCUPADO $usuarios.SizeInGB > "c:\Users\runzue\gigas.txt" # Limpiamos los espacios en blanco y exportamos a TXT (Get-Content c:\Users\runzue\gigas.txt) | ? {$_.trim() -ne "" } | Set-Content c:\Users\runzue\gigas.txt #$gigas=(Get-Content -Path "c:\Users\runzue\gigas.txt") ##################### # TRATAMOS LOS DATOS ##################### $dia=Get-date -Format "MM-dd-yyyy" ForEach ($file in (Get-Content -Path "c:\Users\runzue\vhdx.txt")) { #SABER LA LINEA EN EL LISTADO DEL VHDX $linea= (Get-Content -Path "c:\Users\runzue\vhdx.txt") | sls -Pattern $file | linea $linea=$linea.LineNumber #PUNTO DE CONTROL Write-Output "Fila $linea para valor $file" #BUSCAMOS EL TAMAÑO DEL PERFIL #HAGO UN FILTRO AL PRIMER VALOR PARA QUE NO LO CORTE if ($linea -eq 1) { $gigas=(Get-Content -Path "c:\Users\runzue\gigas.txt" -TotalCount $linea) #PUNTO DE CONTROL Write-Output "Para el disco VHDX $file el valor es $gigas GBs" #################### # HACEMOS UN FILTRO #################### $hora=Get-Date -Format "HH:mm:ss" # SI EL TAMAÑO ES DE MAS DE 4GB if ($gigas -ge 4) { ############### # ENVIO CORREO ############### # ENCRIPTAMOS USUARIO Y CONTRASEÑA $EncodedTextMAIL = “ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUAQABnAG0AYQBpAGwALgBjAG8AbQA=” $DecodedTextMAIL = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextMAIL)) $EncodedTextPW = “cAByAHUAZQBiAGEAcwBjAHIAaQBwAHQA” $DecodedTextPW = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextPW)) $emailSmtpServer = "smtp.tuserver.es" $emailSmtpServerPort = "587" $emailSmtpUser = "$DecodedTextMAIL" $emailSmtpPass = "$DecodedTextPW" $emailFrom = "cuentacorreo@tudominio.es" $emailTo = "$file@tudominio.es" $emailcc="otrousuario@tudominio.es" $emailMessage = New-Object System.Net.Mail.MailMessage( $emailFrom , $emailTo ) $emailMessage.cc.add($emailcc) $emailMessage.Subject = "PERFIL DE TRABAJO A PUNTO DE LLENARSE" $emailMessage.IsBodyHtml = $true #true or false depends $emailMessage.Body = "<h2>¡Su perfil se está llenando!</h2>" $emailMessage.Body += "Su perfil Windows tiene un límite de <FONT SIZE=4><strong>5GB</strong></font> y usted ha llegado a <FONT SIZE=4><strong>$gigas GB</strong></font>" $emailMessage.Body += "<p>Por favor, mueva ficheros de sus carpetas personales (Escritorio, Descargas y Documentos), a sus unidades de red asignadas</p>" $emailMessage.Body += "<p>Si no lo hace, puede provocar problemas en su sesión</p>" $emailMessage.Body += "Gracias de antemano, le agradecemos su colaboración" $emailMessage.Body += '<p><img src="https://www.maquinasvirtuales.eu/wp-content/uploads/2018/11/maquinas-virtuales-logo1.png"></p>' $SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort ) $SMTPClient.EnableSsl = $False $SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass ); $SMTPClient.Send( $emailMessage ) ########################## # GENERA LOG DE ACCIONES ########################## #PUNTO DE CONTROL Write-Output "Perfil mayor de 4GB" Echo "$hora - Enviado correo a $file@tudominio.es. Perfil de $file de $gigas GB y es mayor de 4GB" >> c:\Users\runzue\perfilesvhdx-$dia.log } else { ########################## # GENERA LOG SIN ACCIONES ########################## #PUNTO DE CONTROL Write-Output "Perfil menor de 4GB" Echo "$hora - Perfil de $file de $gigas GB. Menor de 4GB" >> c:\Users\runzue\perfilesvhdx-$dia.log } } Else { $gigas=(Get-Content -Path "c:\Users\runzue\gigas.txt" -TotalCount $linea)[-1] #PUNTO DE CONTROL Write-Output "Para el disco VHDX $file el valor es $gigas GBs" #################### # HACEMOS UN FILTRO #################### $hora=Get-Date -Format "HH:mm:ss" # SI EL TAMAÑO ES DE MAS DE 4GB if ($gigas -ge 4) { ############### # ENVIO CORREO ############### # ENCRIPTAMOS USUARIO Y CONTRASEÑA $EncodedTextMAIL = “ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUAQABnAG0AYQBpAGwALgBjAG8AbQA=” $DecodedTextMAIL = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextMAIL)) $EncodedTextPW = “cAByAHUAZQBiAGEAcwBjAHIAaQBwAHQA” $DecodedTextPW = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextPW)) $emailSmtpServer = "smtp.tuserver.es" $emailSmtpServerPort = "587" $emailSmtpUser = "$DecodedTextMAIL" $emailSmtpPass = "$DecodedTextPW" $emailFrom = "cuentacorreo@tudominio.es" $emailTo = "$file@tudominio.es" $emailcc="otrousuario@tudominio.es" $emailMessage = New-Object System.Net.Mail.MailMessage( $emailFrom , $emailTo ) $emailMessage.cc.add($emailcc) $emailMessage.Subject = "PERFIL DE TRABAJO A PUNTO DE LLENARSE" $emailMessage.IsBodyHtml = $true #true or false depends $emailMessage.Body = "<h2>¡Su perfil se está llenando!</h2>" $emailMessage.Body += "Su perfil Windows tiene un límite de <FONT SIZE=4><strong>5GB</strong></font> y usted ha llegado a <FONT SIZE=4><strong>$gigas GB</strong></font>" $emailMessage.Body += "<p>Por favor, mueva ficheros de sus carpetas personales (Escritorio, Descargas y Documentos), a sus unidades de red asignadas</p>" $emailMessage.Body += "<p>Si no lo hace, puede provocar problemas en su sesión</p>" $emailMessage.Body += "Gracias de antemano, le agradecemos su colaboración" $emailMessage.Body += '<p><img src="https://www.maquinasvirtuales.eu/wp-content/uploads/2018/11/maquinas-virtuales-logo1.png"></p>' $SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort ) $SMTPClient.EnableSsl = $False $SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass ); $SMTPClient.Send( $emailMessage ) ########################## # GENERA LOG DE ACCIONES ########################## #PUNTO DE CONTROL Write-Output "Perfil mayor de 4GB" Echo "$hora - Enviado correo a $file@tudominio.es. Perfil de $file de $gigas GB y es mayor de 4GB" >> c:\Users\runzue\perfilesvhdx-$dia.log } else { ########################## # GENERA LOG SIN ACCIONES ########################## #PUNTO DE CONTROL Write-Output "Perfil menor de 4GB" Echo "$hora - Perfil de $file de $gigas GB. Menor de 4GB" >> c:\Users\runzue\perfilesvhdx-$dia.log } } }
Espero os parezca interesante…ya que es gratis, comparte ;P
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
La entrada Powershell: Script para comprobar perfiles VHDX FSLogix en Citrix se publicó primero en Blog Virtualizacion.