Creio 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);
}
One Response to “Alterando a senha de usuários no Active Directory utilizando perl”
  1. 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 :)

  2.  
Leave a Reply