26
03
2010
Alterando a senha de usuários no Active Directory utilizando perl
Posted by Diego Lima in Development, Linux, Sysadmin, tags: active directory, Linux, perl, senha, windowsCreio que o título do post seja bem auto-explicativo
Esta é uma função em perl que recebe como parâmetros o nome de usuário, senha antiga e a nova senha e realiza a alteração, retornando 0 (zero) em caso de sucesso. Para utiliza-la em seu programa basta fazer as alterações relativas ao seu ambiente. A alteração de senhas por esse script é feita através do protocolo LDAP sobre SSL, o que torna a passagem de informações segura entre o cliente e servidor.
#!/usr/bin/perl -w
use strict;
use warnings;
use Net::LDAPS;
#####################################################################
# Altera senha de um usuário em um servidor AD utilizando LDAPS #
# Deve ser chamada da seguinte forma: #
# #
# changeAdPass [usuario] [senha atual] [senha nova] #
# #
# Autor: Diego Lima (diego@diegolima.org) #
#####################################################################
sub changeAdPass
{
# Paremetros de usuario
my $user_dn;
my $user_name = shift;
my $user_pass = shift;
my $user_newpass = shift;
my $uniuser_pass;
my $uniuser_newpass;
my $user_domain = 'diegolima.org'; # Dominio
# Parametros do servidor e diretorio
my $ad_server = '172.16.32.69'; # Servidor AD
my $ad_port = '636'; # Porta LDAPS
my $directory_base_dn = 'ou=usuarios,dc=diegolima,dc=org';
my $directory_scope = 'sub';
my $directory_filter = "(samaccountname=$user_name)";
my $directory_uid = "dn=$user_name,$directory_base_dn";
# Cria a conexao com o servidor
my $ldap_server = Net::LDAPS->new(
"$ad_server",
port => "$ad_port",
version => 3
)
or warn("Erro conectando ao servidor $ad_server - $!\n")
and return (1);
# Se autentica utilizando as credenciais do usuario
my $ldap_result =
$ldap_server->bind( "$user_domain\\$user_name", password => "$user_pass" )
or warn("Erro ao realizar bind como $user_domain\\$user_name $!\n")
and return (1);
if ( $ldap_result->code )
{
warn( "Erro tentando se autenticar como $user_domain\\$user_name - "
. $ldap_result->code
. "\n" )
and return ( $ldap_result->code );
}
# Busca o usuário no diretorio
$ldap_result = $ldap_server->search(
base => "$directory_base_dn",
scope => "$directory_scope",
filter => "$directory_filter"
)
or warn("Erro ao realizar buscar $directory_filter - $!\n")
and return (1);
if ( $ldap_result->code )
{
warn("$directory_filter não encontrado - $! \n") and return (1);
} else
{
# Apenas um usuário deve ser alterado
if ( $ldap_result->count != 1 )
{
# Mais de um usuario foi encontrado para a busca utilizada
warn( $ldap_result->count
. " resultados encontrados. Quantidade esperada: 1\n" )
and return (1);
} else
{
map { $uniuser_pass .= "$_\000" } split( //, "\"$user_pass\"" );
map { $uniuser_newpass .= "$_\000" }
split( //, "\"$user_newpass\"" );
# Recuperar o DN correto do usuario
$user_dn = $ldap_result->entry(0)->dn;
# Altera a senha do usuário (remove a antiga e adiciona a nova)
$ldap_result =
$ldap_server->modify(
"$user_dn",
changes => [
delete => [ 'unicodePwd' => $uniuser_pass ],
add => [ 'unicodePwd' => $uniuser_newpass ]
]
)
or warn("Erro modificando entrada unicodePwd de $user_dn - $! \n")
and return (1);
# Verificar o resultado da operacao de modificacao
if ( $ldap_result->code != 0 )
{
# Erro ao alterar a senha. Retornar o codigo do erro
warn( "Erro ao alterar senha de $user_dn - "
. $ldap_result->code
. "\n" )
and return ( $ldap_result->code );
}
}
}
# Desconectar do servidor
$ldap_server->unbind;
$ldap_server->disconnect();
return (0);
}
Entries (RSS)
im usually roaming throughout the web nearly all in the afternoon which means that I have a propensity to peruse a great deal, which sadly isn’t usually a beneficial option as some from the blogs I view are constructed of useless nonsense copied from distinct internet pages a million times, but I have to compliment you simply because this weblog is in reality really informative and consists of a great deal of exclusive material, so cheers for stopping the fad of basically just copying other people’s sites, in situation you ever wanna have fun with a few hands of zynga poker together just send me a message – you might have my email address