Powershell: Script de consulta valores en varios TXT
Os explicamos como conseguir datos de varios listados y enlazarlos en un log para luego poder cruzarlos. La ejecución del script sería:
- La idea es relacionar dos bases de datos no conectadas, una directorio activo. De forma que podamos relacionar el usuario de directorio activo con el de la otra base de datos. Y con ello modificar en el logon de usuario una clave de registro. Y a la vez, los usuarios que no podamos tener la relación porque no están en los listados, tener un log para corregirlos manualmente.
- Logon del usuario de directorio activo
- Comprobar el SID de ese usuario en directorio activo en un listado TXT (ya que la clave de registro es de usuario y va en el path), que generaremos de la siguiente forma (no puedo hacer consultas remotas al DC):
1 |
Get-ADUser -Filter * -Properties SamAccountName,SID | Select-Object SamAccountName,SID | Export-Csv "C:\Users\runzue\Desktop\usuarios.csv" |
- El segundo TXT relaciona usuarios de directorio activo con ciertos valores que existen en el tercer TXT. Estos datos los tengo de antes.
- El tercer TXT tiene valores del segundo TXT y los valores que queremos modificar en la clave de registro
Os dejo el script (https://gist.github.com/raulunzue/f2182a62e500f3de48034ff508f229ea):
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 |
# Script Raúl Unzué - El Blog de Negu # Buscamos modificar un valor en una clave de registro # relacionando directorio activo con otra base de datos # SABER EL USUARIO $usuario=C:\windows\system32\whoami.exe # ELIMINAR DOMINIO $usuariomodificado=$usuario.Substring(5) # SABER SID DE LISTADO # BUSCAMOS USUARIO EN DA (Get-Content "\\SYNOLOGY\SCRIPTS\usuarios-active-directory.txt") | Select-String -Pattern $usuariomodificado | Set-Content "\\SYNOLOGY\SCRIPTS\sid-$usuariomodificado.txt" # LIMPIAMOS FICHERO (Get-Content "\\SYNOLOGY\SCRIPTS\sid-$usuariomodificado.txt") | ? {$_.trim() -ne "" } | Set-Content "\\SYNOLOGY\SCRIPTS\sid-$usuariomodificado.txt" # ELIMINAMOS VALOR DESDE ; PARA LIMPIAR FICHERO (Get-Content "\\SYNOLOGY\SCRIPTS\sid-$usuariomodificado.txt") -replace ("$usuariomodificado;", "") | Set-Content "\\SYNOLOGY\SCRIPTS\sid-$usuariomodificado.txt" # CARGAMOS VALOR DE LA PRIMERA LINEA POR SI HAY USUARIOS SYS $sid= Get-Content "\\SYNOLOGY\SCRIPTS\sid-$usuariomodificado.txt" | select-object -First 1 # BUSCAR AL USUARIO EN EL LISTADO 1 # Buscamos cadena de texto (Get-Content "\\SYNOLOGY\SCRIPTS\item-screensize-limpio.txt") | Select-String -Pattern $usuariomodificado | Set-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt" # LIMPIAMOS FICHERO (Get-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt") | ? {$_.trim() -ne "" } | Set-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt" # ELIMINAMOS VALOR DESDE ; PARA LIMPIAR FICHERO (Get-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt") -replace ("$usuariomodificado;", "") | Set-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt" # CARGAMOS VALOR Y ELEGIMOS SOLO EL PRIMER VALOR $ws= Get-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt" | select-object -First 1 # COMPROBAMOS SI EXISTE if ($ws) { # BUSCAR VALOR PARA EL USUARIO EN EL LISTADO 2 # Buscamos cadena de texto (Get-Content "\\SYNOLOGY\SCRIPTS\SLTSSNSesionunica.txt") | Select-String -Pattern $ws | Set-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt" # LIMPIAMOS FICHERO (Get-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt") | ? {$_.trim() -ne "" } | Set-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt" # ELIMINAMOS VALOR DESDE ; PARA LIMPIAR FICHERO (Get-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt") -replace ("$ws", "") -replace (";", "") | Set-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt" # CARGAMOS VALOR PRIMER VALOR QUE ENCUENTRE $valor= Get-Content "\\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt" | select-object -First 1 if ($valor) { # EXTRAER VALOR ANTIGUO EN CLAVE DE REGISTRO # EXPORTAR CLAVE DE REGISTRO A TXT reg export "HKU\$sid\Software\IBM\Client Access Express\CurrentVersion\Environments\Mis conexiones\NEGU\Communication" \\SYNOLOGY\SCRIPTS\export-$usuariomodificado.txt # BUSCAMOS EL VALOR USER ID ORIGINAL (Get-Content "\\SYNOLOGY\SCRIPTS\export-$usuariomodificado.txt") | Select-String -Pattern "User ID" | Set-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" # LIMPIAMOS LOS VALORES OBTENIDOS (Get-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt") -replace ('"User ID"=', "") | Set-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" (Get-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt") -replace ('"', "") | Set-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" (Get-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt") | ? {$_.trim() -ne "" } | Set-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" # EXTRAEMOS EL VALOR VIEJO $valorold= Get-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" # IMPORTAR CLAVE DE REGISTRO # UNA VEZ CAMBIADO EL VALOR SE INYECTA Set-ItemProperty -Path "Registry::HKEY_USERS\$sid\Software\IBM\Client Access Express\CurrentVersion\Environments\Mis conexiones\NEGU\Communication" -Name "User ID" -Value $valor -Type String # LOG TEST DE TODOS LOS FICHEROS TRATADOS $hora=Get-Date write-output "Hora: $hora ; UsuarioWindows: $usuariomodificado ; ClaveOriginal: $valorold ; NuevaClave: $valor ; SID: $sid ; SesionUtilizada: $ws" | out-file -Filepath \\SYNOLOGY\SCRIPTS\usuarios.log -append } Else { # LOG TEST DE TODOS LOS FICHEROS TRATADOS $hora=Get-Date write-output "Hora: $hora ; UsuarioWindows: $usuariomodificado ; ClaveOrginal: $valorold ; NuevaClave: No existe valor en SLTSSN.txt ; SID: $sid ; SesionUtilizada: $ws" | out-file -Filepath \\SYNOLOGY\SCRIPTS\usuarios.log -append } } Else { # EXTRAER VALOR ANTIGUO EN CLAVE DE REGISTRO # EXPORTAR CLAVE DE REGISTRO A TXT reg export "HKU\$sid\Software\IBM\Client Access Express\CurrentVersion\Environments\Mis conexiones\NEGU\Communication" \\SYNOLOGY\SCRIPTS\export-$usuariomodificado.txt # BUSCAMOS EL VALOR USER ID ORIGINAL (Get-Content "\\SYNOLOGY\SCRIPTS\export-$usuariomodificado.txt") | Select-String -Pattern "User ID" | Set-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" # LIMPIAMOS LOS VALORES OBTENIDOS (Get-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt") -replace ('"User ID"=', "") | Set-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" (Get-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt") -replace ('"', "") | Set-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" (Get-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt") | ? {$_.trim() -ne "" } | Set-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" # EXTRAEMOS EL VALOR VIEJO $valorold= Get-Content "\\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt" # LOG TEST SI NO EXISTE EL USUARIO EN LISTADO 1 $hora=Get-Date write-output "Hora: $hora ; UsuarioWindows: $usuariomodificado ; SID: $sid ; ValorActual: $valorold ; No existe el usuario en el listado UsuarioWindows - FicheroWS y no se modifica el valor" | out-file -Filepath \\SYNOLOGY\SCRIPTS\usuarios.log -append } # BORRAR ITEMS Remove-Item -Path \\SYNOLOGY\SCRIPTS\buscar-$usuariomodificado.txt Remove-Item -Path \\SYNOLOGY\SCRIPTS\buscar2-$usuariomodificado.txt Remove-Item -Path \\SYNOLOGY\SCRIPTS\export-$usuariomodificado.txt Remove-Item -Path \\SYNOLOGY\SCRIPTS\sid-$usuariomodificado.txt |
Espero os parezca interesante…
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?