Consultar la información de un usuario en Active Directory Users & Computers (dsa.msc) puede ser un poco lenta, incluso hay información que no muestra facilmente como la fecha en que cambió la contraseña. o los dias que faltan para que caduque.
Podemos hacer un pequeño script en Powershell para ver rapidamente los atributos LDAP que nos interesen. Y la nueva funcionalidad de out-gridview de Powershell v3, facilita un monton la busqueda de usuarios.
Out-GridView ya existia en Powershell v2, y servia para sacar la información a un formulario en lugar de la consola, es decir, no valia para nada.
A partir de la version v3, han implementado un nuevo parametro -passthru que nos permite seleccionar uno o varios registro del formulario y devolverlos al script.
Veamos un ejemplo:
Al seleccionar un usuario de la lista y pulsar aceptar ese registro pasa a la variable $usuario y podemos trabajar con él en el resto del script.
Podemos hacer un pequeño script en Powershell para ver rapidamente los atributos LDAP que nos interesen. Y la nueva funcionalidad de out-gridview de Powershell v3, facilita un monton la busqueda de usuarios.
Out-GridView ya existia en Powershell v2, y servia para sacar la información a un formulario en lugar de la consola, es decir, no valia para nada.
A partir de la version v3, han implementado un nuevo parametro -passthru que nos permite seleccionar uno o varios registro del formulario y devolverlos al script.
Veamos un ejemplo:
$strsearch="John"
$searcher = New-Object DirectoryServices.DirectorySearcher([adsi]"")
$searcher.filter = "(&(objectclass=user)(objectcategory=person)(givenname=$strsearch))"
$users = $searcher.findall()
$usuarios=@()
foreach ($user in $users)
{
$usuarios+=new-object PSObject -property @{
givenname=[string]$user.properties.givenname
sn=[string]$user.properties.sn
displayname=[string]$user.properties.displayname
samaccountname=[string]$user.properties.samaccountname
}
}
$usuario=$usuarios|select samaccountname,givenname,sn,displayname|out-gridview -passthru -title "Pick a user"
He creado un objeto PSObject para almacenar 4 atributos basicos a modo de previsualización ya que la consulta devuelta tiene todos los atributos bajo properties, y no voy a hacer un GetDirectoryEntry() mientras no haya elegido elegido al usuario que me interesa.Al seleccionar un usuario de la lista y pulsar aceptar ese registro pasa a la variable $usuario y podemos trabajar con él en el resto del script.
Function Get-UAC($uac)
{
$flags=@()
if ((2 -band $uac) -ne "0"){$flags+="ACCOUNTDISABLE"}
if ((32 -band $uac) -ne "0"){$flags+="PASSWD_NOTREQD"}
if ((512 -band $uac) -ne "0"){$flags+="NORMAL_ACCOUNT"}
if ((65536 -band $uac) -ne "0"){$flags+="DONT_EXPIRE_PASSWORD"}
return $flags
}
Function caducidad-contraseña($PasswordLastChanged, $intMaxPwdAge)
{
$ahora=get-date
$intTimeInterval = [int32]($ahora - $PasswordLastChanged).days
If ($intTimeInterval -ge $intMaxPwdAge)
{
$strdias="está CADUCADA"
}
else
{
$ExpiringDate = $PasswordLastChanged.addDays($intMaxPwdAge)
$fechacaducidad=$Expiringdate.toString("dd/MM/yyyy")
$ExpiringDays = [int32]($ExpiringDate - $ahora).days
$strdias= "caduca en $ExpiringDays dias ($fechacaducidad)"
}
return $strdias
}
#### main ####
$SECS_IN_A_DAY=86400
$raya= "-" * 60
if ([int32][string]$host.version -lt 3){write-warning "la version de powershell actual es $($host.version)`nNecesitas la version 3.0 o superior.";start-sleep -s 4;exit}
do
{
$buscar=read-host "Usuario/Apellido/mail a buscar en Directorio activo?"
write-host $raya -fore yellow
$searcher = New-Object DirectoryServices.DirectorySearcher([adsi]"")
$searcher.filter = "(&(objectclass=user)(objectcategory=person)(|(samaccountname=$buscar)(mail=$buscar)(sn=$buscar*)))"
$users = $searcher.findall()
if ($users.count -eq 0)
{
write-host "NO EXISTE USUARIO $BUSCAR" -fore red
}
else
{
if ($users.count -eq 1)
{
$user=$users
}
else
{
$usuarios=@()
foreach ($user in $users)
{
$usuarios+=new-object PSObject -property @{
nombre=[string]$user.properties.givenname
apellidos=[string]$user.properties.sn
displayname=[string]$user.properties.displayname
samaccountname=[string]$user.properties.samaccountname
}
}
$usuario=$usuarios|select samaccountname,nombre,apellidos,displayname|out-gridview -passthru -title "Elige un usuario"
$user=$users|?{$_.properties.samaccountname -eq $usuario.samaccountname}
}
}
}while ($user -eq $null)
write-host "Datos Active Directory" -fore black -back magenta
$user=$user.GetDirectoryEntry()
$usuario=$user.samaccountname
if ($user.scriptpath -ne $null){$script=$user.scriptpath}else{$script="$usuario.bat"}
write-host "Cuenta de usuario: " -fore cyan -nonewline;write-host $usuario
write-host "UPN: " -fore cyan -nonewline;write-host "$($user.userprincipalname)"
write-host "Nombre: " -fore cyan -nonewline;write-host "$($user.givenname)"
write-host "Apellidos: " -fore cyan -nonewline;write-host "$($user.sn)"
write-host "EmployeeType: " -fore cyan -nonewline;write-host "$($user.EmployeeType)"
write-host "Alta (mm/dd/yyyy): " -fore cyan -nonewline;write-host "$($user.whenCreated)"
if ($user.mail -ne $null)
{
write-host "Mail: " -fore cyan -nonewline;write-host "$($user.mail)"
if ([string]$user.homeMTA -eq ""){$buzon="Office 365 (en la nube)"}else{$buzon="On-premise (Exchange) " + "$($user.homeMdb)".substring(0,19)+"..."}
write-host "Buzon: " -fore cyan -nonewline;write-host "$Buzon"
}
$uac=$user.userAccountControl
$flags=Get-Uac("$uac")
if ($flags -notcontains "DONT_EXPIRE_PASSWORD")
{
$domain = [ADSI]"WinNT://$env:userdomain"
$intMaxPwdAge =($domain.maxpasswordage.value)/$SECS_IN_A_DAY
$PasswordLastChanged =$user.PasswordLastChanged
write-host "Cambió la contraseña el $($PasswordLastChanged.toString("dd/MM/yyyy"))" -fore yellow
$strdias=caducidad-contraseña $PasswordLastChanged $intMaxPwdAge
write-host "La contraseña $strdias" -fore yellow}
write-host "Distinguishedname: " -fore cyan -nonewline;write-host "$($user.distinguishedname)"
write-host "UserAccountControl Flags:" -fore cyan
$flags
write-host $raya -fore yellow

Comentarios
Publicar un comentario