viernes, 7 de octubre de 2016

Powershell script para ver bloqueos, cambiar contraseña y desbloquear usuarios de AD

Hay veces en la que no nos interesa dejar la consola de administracion de Active Directory para funciones simples como desbloquear y cambiar contraseñas de usuarios.

Para ello es puede ser muy util el siguiente Powershell Script que realiza las siguientes funciones:

- Muestra sólo los usuarios bloqueados (pudiendo omitir ciertos powerusers)
- Permite desbloquear usuario
- Permite cambiar contraseña usuario
- Permite desbloquear y cambiar contraseña
- Permite desbloquear, cambiar contraseña y marcar cambiar contraseña en el siguiente logon

Todo ello con un array de nuestros controladores de dominio, útil si hay dispersión geografica y algún que otro control de errores básico.

<#
  Author:   Miguel Varona - Alberto Molero
  Date:     05/10/2016
  Version:  2.0
 
 
  Descripción
    Herramienta para identificar bloqueos en AD, desbloquear usuario y porporcionarle nueva contraseña. 
 
  UPDATED 06/10/2016
    Añadimos opción de cambiar password, establecer cambio en siguiente logon y desbloquear.
  UPDATED 05/10/2016
    Añadimos los usuarios a excluir en la lista de bloqueos.
     

#>

#Importa el modulo de Active Directory
Import-Module ActiveDirectory

Write-Host ""
Write-Host "PowerShell AD Password Tool"
Write-Host ""
Write-Host "Herramienta de comprobación de expiración y bloqueo de cuentas de AD"
Write-Host "Status.  Te permitirá desbloquear y/o establecer una nueva contraseña"
Write-Host ""
Write-Host ""


###########################
##       FUNCIONES       ##
###########################


#################################
###  unlockAndCheck function  ###
#################################

#Esta funcion desbloquea el usuario definido el los DCs de la lista $servers array, despues comprueba que esta desbloqueado.

function unlockAndCheck {

    foreach ($server in $servers) {

        Try {
                   
            Write-Host "Desbloqueando usuario en $server"
            Unlock-ADAccount -Identity $user -server $server
        }catch{

           

        }

    }        
                               
               
               
    #Consigue el status de bloqueo y lo marca en la variable $Lock
    $Lock = (Get-ADUser -Filter {samAccountName -eq $user } -Properties * |
                    Select-Object -expand lockedout)

    Write-Host ""

    #Dependiendo del estatus, muestra si el usuario esta bloqueado o no.
    switch ($Lock) {
                        "False" { Write-Host "$user El usuario está BLOQUEADO." }
                        "True" { Write-Host "$user El usuario no está bloqueado." }
                   }
}



############################
###  resetPass function  ###
############################

#Esta función cambia la contraseña del usuario definicdo en los DCs del $server array.
function resetPass {
   
    $newpass = (Read-Host -AsSecureString "Introduzaca nueva contraseña")
               
   
    foreach ($server in $servers) {

        Write-Host "Cambiando Contraseña en $server"
        Set-ADAccountPassword -Server $server -Identity $user -NewPassword $newpass
   
    }           
   
                               
    Write-Host ""
    Write-Host "Contraseña de $user cambiada."
    Write-Host ""

}

##################################################
###  resetPassand changenextlogon function     ###
##################################################

##Esta función cambia la contraseña del usuario definicdo en los DCs del $server array y añade la opción de cambiar contrasseña en el siguiente logon.
function resetPasschange {
   
    $newpass = (Read-Host -AsSecureString "Introduzaca nueva contraseña")
               
   
    foreach ($server in $servers) {

        Write-Host "Cambiando Contraseña en $server"
        Set-ADAccountPassword -Server $server -Identity $user -NewPassword $newpass ; Set-ADUser -Identity $user -ChangePasswordAtLogon $true
   
    }           
   
                               
    Write-Host ""
    Write-Host "Contraseña de $user cambiada."
    Write-Host ""

}
###########################
##     End FUNCTIONS     ##
###########################




#############################################
##  Definir los Controladores de Dominio   ##
#############################################

<#

   
    Si disponemos de mas de un DC y repartidos Geográficamente esta lista nos ahorra
    el tiempo de replica para el cambio y desbloqueo de contraseña.
   
    ----> Importante: Mantener la lista si los mismos cambian.

#>

#Creating Empty $servers Array
$servers = New-Object System.Collections.ArrayList

#Creating Empty $unavailable Array
$unavailable = New-Object System.Collections.ArrayList

#Assign Domain Controllers to $servers Array

$servers.add("servidor.dominio.local") | out-null


# NOTA: Puedes añadir más, copiando la linea justo debajo.



##################################################
##   Comprobacion de usuarios bloqueados en AD  ##
##################################################

#Cuenta cuantas cuentas bloqueadas hay en DC local y lo establece en la variable $count

$count = Search-ADAccount –LockedOut | where { $_.Name -ne "Administrator" -and $_.Name -ne "Guest" -and $_.Name -ne "SAU" -and $_.Name -ne "Otrousuario" -and $_.Name -ne "Otrousuario" -and $_.Name -ne "obs_int_svc" -and $_.Name -ne "Otrousuario" -and $_.Name -ne "Invitado" } |
    Measure-Object | Select-Object -expand Count


#Si hay cuentas bloqueadas (exceptuando administrator, invitado y otras,las muestra.

If ( $count -gt 0 ) {

    Write-Host "Cuentas Bloqueadas actualmente en el Dominio:"
    Search-ADAccount –LockedOut | where { $_.Name -ne "Administrator" -and $_.Name -ne "Guest" -and $_.Name -ne "SAU" -and $_.Name -ne "Seguridad" -and $_.Name -ne "Formacion" -and $_.Name -ne "obs_int_svc" -and $_.Name -ne "test.operador" -and $_.Name -ne "Invitado" } |
        Select-Object Name, @{Expression={$_.SamAccountName};Label="Username"},@{Expression={$_.physicalDeliveryOfficeName};Label="Office Location"},@{Expression={$_.LastLogonDate};Label="Fecha de último acceso."}  | Format-Table -AutoSize
   
}else{
   
#   Write-Host "No tiene cuentas bloqueadas en el dominio."

}

Write-Host ""


###########################################
##   Pregunta por el nombre del usuario  ##
###########################################


#Pregunta por el nombre de usuario
$user = Read-Host "Introduzca el nombre de usuario que quieres comprobar o pulsa [CTR+C] para salir."


[int]$Checker1 = 0

# Control de errores
Do {
   
    # Try to retrieve info for given user, catch error if unalbe to retrieve
    Try {

        # Attempt to retrieve info about user and suppress output
        Get-ADUser -Identity $user | Out-Null

        # If successful, set Checker to 1 to exi do loop.
        $Checker1 = 1

    }catch{
       
        # If Attempt to retrieve info fails, run code in this catch block
             
        #Username entered was not found.  Have user try again.
        cls
        Write-Host ""
        Write-Host ""
        Write-Host "Cuenta de usuario no encontrada! - Comprueba el nombre y vuelve a intentar." -BackgroundColor Red -ForegroundColor White
        Write-Host ""
        $user = Read-Host "Introduzca el nombre de usuario que quieres comprobar o pulsa [CTR+C] para salir."

    }
# If Checker1 is equal to zero, then redo Do loop.
}While ($Checker1 -eq 0)




#############################################################
##   HAce un get para mostrar la informacion del usuario   ##
#############################################################

#Once a valid user is entered, proceed with remaining code
cls

Write-Host ""
Write-Host ""

# Hace un get para el nombre de usuario
$Name = (Get-ADUser -Filter {samAccountName -eq $user } -Properties * | Select-Object -expand DisplayName)

# Gets Phone number of entered user (linea comentada porque no utilizamos el campo, puede ser útil en un futuro.)
#$phone = (Get-ADUser -Filter {samAccountName -eq $user } -Properties * | Select-Object -expand telephoneNumber)

# Displays the Display Name and Phone number of user - I use this to verify I have the correct user and
# to have the phone number available, if I need to contact the user.
#Write-Host "$Name's phone number is:  $phone"


Write-Host ""
Write-Host ""





####################################################################
##  Hace un get para la antiguedad de la contraseña y la muestra  ##
####################################################################

# Get-date para Fecha de hoy
[datetime]$today = (get-date)

#Get pwdlastset fecha del AD para la variable $passdate2
$passdate2 = [datetime]::fromfiletime((Get-ADUser -Filter {samAccountName -eq $user } -Properties * |
    Select-Object -expand pwdlastset))

#Calcula la contraseña en dias
$PwdAge = ($today - $passdate2).Days

#Comprueba si es mas antigua de 30 dias
If ($PwdAge -gt 31){
       
        # Si es mas antigua de 30 días informa que está expirada y la muestra
        Write-Host "Contraseña de $user ha EXPIRADO!"
        Write-Host "Contrasela de $user tiene una antiguedad de $PwdAge dias "

}else{
       
        # Si es menor de 30 dias muestra la antiguedad
        Write-Host "COntraseña de $user tiene una antiguedad de $PwdAge dias "

}

Write-Host ""
Write-Host ""




########################################################
##   Estado del bloqueo en cada servidor disponible   ##
########################################################

#Comprueba la disponibilidad de los servidores y el estado del bloqueo de la cuenta de usuario. (ojo ping trafico permitido)

foreach ($object in $servers) {

    # ERROR CHECKING
    Try{
       
        # Check to see if server is available via a ping
        ping $object -n 1 | Out-Null

        # If server is available, complete code:
        switch (Get-ADUser -server $object -Filter {samAccountName -eq $user } -Properties * |
            Select-Object -expand lockedout) {
   
                "False" {"$object `t `t Not Locked"}
       
                "True" {"$object `t `t LOCKED"}
  
        }

    }catch{
       
        # If server is not available, alert admin that it will be skipped.
        Write-host "$object `t `t NOT Found - Skipping" -ForegroundColor white -BackgroundColor red

        # Add unavailible server to $unavailible array
        $unavailable.add($object) | out-null
       
    }

}


##############################################################
##   $servers Control de disponibilidad de servidores       ##
##############################################################

<#
   
    Para cada servidor en el array que no este disponible lo elimina del array
    con el fin de que el script no de error por time out. Otro pequeño control
    de errores.

#>
foreach ($server in $unavailable){

    $servers.Remove($server)

}




##############################################
##   Preguntar que opción quiere escoger    ##
##############################################

Write-Host ""
Write-Host ""


$option = Read-Host  "¿Quieres (1) Desbloquear el usuario, (2) Resetear la contraseña del usuario, (3) Desbloquear y resetear contraseña o (4) Desbloquear, resetear y cambiar en el logon siguiente (5) Salir?"



##########################################
##   Llevar a cabo la opción escogida   ##
##########################################
   
cls

[int]$checker2 = 0

While ($checker2 -eq 0) {
   
    switch ($option){
           
        "1" {

                #Call unlockAndCheck Function
                unlockAndCheck
                               
                Write-Host ""
                Write-Host "Pulsa cualqueir tecla para salir."
               
                $checker2 +=6
               
                $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
               
           
            }
        "2" {
               
                #call resetPass function
                resetPass             
                          
                Write-Host ""
                Write-Host "Pulsa cualqueir tecla para salir."
                $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
               
                $checker2 += 6
   
            }
        "3" {
   
                #call resetPass function
                resetPass
                              
                #Call unlockAndCheck Function
                unlockAndCheck               
               
           
                Write-Host ""
                Write-Host "Pulsa cualqueir tecla para salir."

               
                $checker2 += 6
               
                $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
   
            }
        "4" {
   
                #call resetPasschange function
                resetPasschange
                              
                #Call unlockAndCheck Function
                unlockAndCheck               
               
           
                Write-Host ""
                Write-Host "Pulsa cualqueir tecla para salir."

               
                $checker2 += 6
               
                $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
   
            }
        "5" {
   
                #exit code
                $checker2 += 6
   
             }   
     default {
               
                Write-Host ""
                Write-Host ""
                Write-Host "Ha seleccionado un número incorrecto." -BackgroundColor Red -ForegroundColor White
                Write-Host ""
                $option = Read-Host  "¿Quieres (1) Desbloquear el usuario, (2) Resetear la contraseña del usuario, (3) Desbloquear y resetear contraseña o (4) Desbloquear, resetear y cambiar en el logon siguiente (5) Salir?"
       
              }
    }

}








miércoles, 7 de septiembre de 2016

Script para insertar excepciones de seguridad en Java a partir de la versión 7.45

Script para insertar excepciones de seguridad en Java a partir de la versión 7.45

Normalmente si actualizamos Java nos encontraremos que a los usuarios les aparecerá que para ejecutar ciertas partes de un site se requiere incluir una excepción en java. Esto se realiza por el panel de control - Java - Seguridad. Pero, ¿Cómo hacerlo de manera semi distribuida y con un control (sencillo) de versiones?
panelcontrol Java
Panel control Java


Despues de darle muchas vueltas adjunto el script realizado y lo comento. La idea es dejar el fichero exception.sites con las urls permitidas en una unidad compartida y mediante un bat primero efectuar un backup con la fecha (datestamp) y copiar el fichero nuevo en la ubicación de cada usuario utilizando la variable %userprofile% para personalizar la ruta de copia.

@echo off
REM Este fichero es el de excepciones de seguridad de java, cuando la version es superior a la 7.45


REM Crear la variable stamp con la fecha y hora para renombrar el fichero con la fecha

for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set YYYY=%dt:~0,4%
set MM=%dt:~4,2%
set DD=%dt:~6,2%
set HH=%dt:~8,2%
set Min=%dt:~10,2%
set Sec=%dt:~12,2%

set stamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%

rename %Userprofile%\AppData\LocalLow\Sun\Java\Deployment\security\exception.sites %stamp%.exception.sites

echo *******Copiando archivo de excepciones Por Miguel Varona -Alberto Molero - Septiembre 2016***********

copy \\recurso compartido\exception.sites %Userprofile%\AppData\LocalLow\Sun\Java\Deployment\security\ /y


echo ********Excepciones añadidas,se ha creado una copia de seguridad del mismo. pulsa espacio para salir***********

pause
La primera parte nos sirve para crear la variable de tiempo en un formato aceptado para renombrar el fichero (aprovechable para otros scripts)

También podemos añadir una línea al fichero con el siguiente script

@echo off
REM Este fichero es el de excepciones de seguridad de java, cuando la version es superior a la 7.45
echo *******Añadiendo info al archivo de excepciones Septiembre 2016***********

echo.file:/// >> %Userprofile%\AppData\LocalLow\Sun\Java\Deployment\security\exception.sites
echo.http://localhost >> %Userprofile%\AppData\LocalLow\Sun\Java\Deployment\security\exception.sites

echo ********Excepciones añadidas, pulsa espacio para salir***********
pause

jueves, 21 de julio de 2016

Quitar comprobacion drivers firmados en windows 7

Mediante el siguiente comando desactivaremos la comprobación de drivers firmados para Windows 7.
bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS
bcdedit.exe -set TESTSIGNING ON

viernes, 1 de abril de 2016

Usuario SYSTEM oracle caducado

Problema de caducidad usuario Oracle SYSTEM


Pasos para desbloquear usuario SYSTEM (Cuenta expirada) y configurar para que no vuelva a expirar.

1. Abrir consola cmd con otro usuario.

2. Otro usuario: Administrador de máquina

sqlplus /nolog connect / as SYSDBA

ALTER USER SYSTEM IDENTIFIED BY password; /* nuevo password */ ALTER USER SYSTEM ACCOUNT UNLOCK; ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

con esto desbloquearemos el usuario y no caducará más.

lunes, 25 de enero de 2016

Modificando Internet explorer mediante claves de registro. Parte I - Sitios Seguros

Para cambiar el comportamiento y ejecución de Active X, cuando éstos no responden y evitar tener que rehacer un perfil de usuario podemos forzar el estado mediante la modificación de las claves de registro dónde reside la seguridad de internet explorer:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings

Sin embargo también se puede forzar la aplicación de políticas modificando los mismos parámetros en la clave:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings

Ésto se logra añadiendo una clave DWORD con valor Security_HKLM_ y asignándole el valor 1 en la siguiente clave de registro

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings

Pero normalmente sólo se corrompe la parte del registro del usuario, impidiéndonos acceder a webs que requieren descarga y ejecución de activex por ejemplo de firmas (Banco de España, AEAT, etc...)

(El ejemplo ha servido para poder descargar un componente de firma del Banco de España realizado por Indra, después de una actualización de Internet Explorer)

Usualmente este tipo de sites se deben catalogar como sitios seguros, identificándolos en el registro en la clave ZONES tipo 2

    1 = Local Intranet
    2 = Trusted Sites
    3 = Internet
A continuación buscaremos el identificador que proceda, normalmente el 1200

Internet Explorer registry numbers

Y procederemos a cambiarlo 0 enabled 1 prompt y 2 disabled, lo estableceremos en prompt para que nor pregunte y podamos autorizarlo manualmente desde el explorador.

Internet Explorer registry valuesEsto nos equivale a modificar los parámetros de ejecución de activex en herramientas, opciones avanzadas, seguridad.


Administrator approved

Tags

100 consejos 2 steps trouble 50gb cloud free acceso remoto acronis active directory activex AD administracion linux alta dyndns.com analytics android ape APN apt-get articulo request tracker 4 auditoria auditoría wireless b2b Backup backup on line backup online Backupify banco de españa Bancos bash bat bitlocker blogger_TID bloqueo usuario boomerang box box.net broute btrieve bugtraking bussines caducado cálculo callrecorder camara ip cambios catastro certificados Chrome cif Citrix Cloud cloud backup cloud computing cloud server cloudring cloudringapp.com cluod storage cmd cms CNMV comandos comercio electroinco Comisiones TPV computing condiciones tienda consola contraseña root cookie cookies Copia de seguridad copia seguridad correo correo electronico correo eléctronico cpu creacion servidor crm CSS desastre diagramly diferido directorio activo directorios disable dmesg Docs DOS drivers dropbox dropittome dropsync du du -sch dyndns e-commerce e-commerce mail shop ecommerce enviar mas tarde envío escritorio compartido esquemas estructura etiquetas inteligentes excel excepciones exclude dropbox exec Execpciones Java fhs ficheros find firewall firma fiscal flujo for formulario formularios free space ftp gdocs gdrive gmail gmail 2 pasos problema godaddy google apps google drive google history google search google+ GOYSCRIPT grabación de llamadas hacienda hang-out hangout hoja host dinamico i.e iass indra intalacion webmin interfaz metro internet explorer ip dinamica ipcam iva e-commerce Java joomla LAMP LDAP ley ley blogger ley cookies libros limpiar ubuntu linux linux password linux root logística LPIC mail mail notification mail server mamp MCSA memoria alta microsoft Ministerio Justicia Mis Documentos copia de seguridad molero monitor rendimiento montar usb mount mrw mta multishop mx Mysql net use NFC notificacion notificaciones novell 5.1 nube nube hibrida nube privada nube publica objetivo web Office on line Oracle organizaciones paas Pasarela de pago password root PAW pearltrees pedidos perfmon portapapeles postfix postfix gmail powershell precio prerequisitos ecommerce prestashop privacidad privacidad datos programación correo electrónico protección de datos proxy psexec puertos purgar pymes rackspace rackspace.com recover root recovery password linux recuperar root password recursos redirección registradores.org registro registry remoto rendimiento. windows 7 request tracker request tracker 4 article RESEVI ring rkhunter root linux root password root ubuntu rootkit router rt saas sals scheduled task script scripting scripts Secure SSH seguimiento seguridad send later server sincronización siret sitios seguros skydrive smalll server smartphone smtp smtp gmail relay smtp notification SSH ssl substitución system systernals tamaño directorio telefónica templates thatwe thunderbird ticketing tienda online tienda virtual tienda web token TPV virtual track translation two steps verification ubuntu ubuntu 12 ubuntu gmail relay unix upload urdangarín usb usbdisk ubuntu usuario validate.tpl variable VDA VDAAGENT verificación dos pasos vi virtual appliance virtualización novell visio vmware vritualdesktop w8 w8 gmail Wannacry webdav webmaster tools webmin websigner websigner.cab wifislax windos azure windows windows 7 windows 8 Windows Azure windows2012 windows8 wordpress workstation WPA xampp xargs XENDESKTOP zimbra on rackspace