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:
1 2 3 4 5 6 7 8 9 10 11 |
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= |
GITHUB: https://gist.github.com/raulunzue/22423917c69465d44a8a2cf97edb75f5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
###################### # 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/ipsoapoo/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/ipsoapoo/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?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?