Active Directory es un servicio de Microsoft que utiliza LDAP para almacenar información de los usuarios y equipos de la red, como el nombre, usuario, contraseña así como la gestión de políticas.
La interfaz de servicio de Active Directory (ADSI) proporciona una interfaz COM que utilizaremos en nuestro programa y para ello preparamos una interfaz en la que le pedimos al usuario su usuario / contraseña y la comparamos con las obtenidas utilizando las units ActiveDs_Tlb y Adshlp, no olvidar añadir también la unit ComObj.
Para hacer la llamada necesitamos además el nombre de dominio de la red y el tipo de autenticación.
Si al comparar ambos datos se produce un error es que no se encuentra el objeto buscado o hay un problema de conectividad de la red.
El ejemplo que está a continuación ha sido desarrollado en Delphi 2009 y probado en servidores Windows 2003 y 2008.
Aquí tienen la unit principal:
unit uAD;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ActiveX, adshlp, ActiveDs_Tlb, ComObj;
type
TfrmLogin = class(TForm)btnLogin: TButton;edtUsuario: TEdit;edtSenha: TEdit;lblUsuario: TLabel;lblSenha: TLabel;lblLogin: TLabel;
procedure btnLoginClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmLogin: TfrmLogin;
implementation
{$R *.dfm}
procedure TfrmLogin.btnLoginClick(Sender: TObject);
var
adObject: IADs;
begin
///Inicialização do COM
CoInitialize(nil);
try
ADsOpenObject('LDAP://', LowerCase(edtUsuario.Text), edtSenha.Text, ADS_SECURE_AUTHENTICATION, IADs, adObject);
ShowMessage('Login válido!');
except
on e: EOleException do
begin
if Pos('Falha de logon', e.Message) > 0 then
ShowMessage('Login inválido!')
else
ShowMessage(e.Message);
end;
end;
CoUninitialize;
end;
end.
begin
if Pos('Falha de logon', e.Message) > 0 then
ShowMessage('Login inválido!')
else
ShowMessage(e.Message);
end;
end;
CoUninitialize;
end;
enlace | Codigo
Por: Rodrigo Alves dos Santos
Contacto: rod.alves88 @ gmail.com
Aqui tienen otro codigo que devuelve el nombre de usuario desde un objeto AD (Hay que utilizar la unit ADSISearch.pas)
try
ADSISearch1.Filter := WideString('samaccountname=' + GetUserFromWindows());
try
ADSISearch1.Search;
slTemp := ADSISearch1.GetFirstRow();
except
//uh-oh, this is a problem, get out of here
//must not have been able to talk to AD
//could be the user recently changed pwd and is logged in with
//their cached credentials
//just suppress this exception
bHomeDriveMappingFailed := True;
Result := bSuccess;
Exit;
end;
while (slTemp <> nil) do
begin
for ix := 0 to slTemp.Count - 1 do
begin
curLine := AnsiUpperCase(slTemp[ix]);
if AnsiStartsStr('HOMEDIRECTORY', curLine) then
begin
sADHomeDriveUncPath := AnsiReplaceStr(curLine, 'HOMEDIRECTORY=', '');
//sADHomeDriveUncPath := slTemp[ix];
end
else if AnsiStartsStr('HOMEDRIVE', curLine) then
begin
sADHomeDriveLetter := AnsiReplaceStr(curLine, 'HOMEDRIVE=', '');
//sADHomeDriveLetter := slTemp[ix];
end;
end;
FreeAndNil(slTemp);
slTemp := ADSISearch1.GetNextRow();
end;
except
//suppress this exception
bHomeDriveMappingFailed := True;
Exit;
end;
No hay comentarios:
Publicar un comentario