Ya he logrado enumerar los grupos. Agregar un usuario a un grupo, eliminar un usuario de un grupo y hasta cambiarle la contraseña. Aca les dejo la documentacion.
Primero que todo aca les dejo dos excelentes articulos de como trabajar con ADSI usando Visual Basic pero esta muy facil de traducir.
http://www.15seconds.com/issue/011005.htm
http://www.15seconds.com/issue/011127.htm
Ahora bien, aca tienen el codigo que he utilizado para hacer estas tareas. Tengan en cuenta que hay mucha referencia a componentes. Cualquier duda me escriben un mensaje o la plantean aca.
Código Delphi
[-]
procedure ...
var
Usr: IADsUser;
dominio: string;
begin
dominio := frmSessionInit.edt_domain.Text;
try
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1,
IADsUser, usr)
else
ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usr);
Assert(usr <> nil);
if edt_new_pass.Text = edt_new_pass_confirm.Text then
begin
Usr.SetPassword(edt_new_pass.Text);
Application.MessageBox(PChar('Se ha cambiado la contraseña de forma satisfactória para "' + edt_searchcrit.Text + '"'), 'Cambiar Contraseña !', MB_OK + MB_ICONINFORMATION);
edt_new_pass.Clear;
edt_new_pass_confirm.Clear;
end
else
begin
Application.MessageBox('Las contraseñas no coinciden. Verifique sus datos antes de continuar.', 'Cambiar Contraseña !', MB_OK + MB_ICONINFORMATION);
end;
Usr.SetInfo;
except
on E: EOleException do begin
Application.MessageBox(PChar(E.Message), 'Error', MB_OK + MB_ICONERROR);
end;
end;
Esto es para por ejemplo activar o desactivar el atributo de "No expira la contraseña".
Código Delphi
[-]
procedure ...
var
Usr: IADsUser;
dominio: string;
begin
dominio := frmSessionInit.edt_domain.Text;
try
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1,
IADsUser, usr)
else
ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usr);
Assert(usr <> nil);
if chk_no_pass_expire.Checked then
Usr.Put('UserFlags', Usr.Get('UserFlags') OR ADS_UF_DONT_EXPIRE_PASSWD)
else
Usr.Put('UserFlags', Usr.Get('UserFlags') XOR ADS_UF_DONT_EXPIRE_PASSWD);
Usr.SetInfo;
except
on E: EOleException do begin
ShowMessage(E.Message);
end;
end;
Agregarle el usuario a uno o mas grupos.
Código Delphi
[-]
procedure ....
var
vNombreGrupo, dominio: string;
usuario : IADsUser;
grupo: IADsGroup;
vX: Integer;
begin
dominio := frmSessionInit.edt_domain.Text;
if frmGroupsEnum.ShowModal = mrOk then
begin
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1, IADsUser, usuario)
else
ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usuario);
Assert(usuario <> nil);
if frmGroupsEnum.box_grupos.Items.Count > 0 then
begin
if frmGroupsEnum.box_grupos.SelCount = 1 then begin
vNombreGrupo := frmGroupsEnum.box_grupos.Selected.Caption;
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
vNombreGrupo, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1, IADsGroup, grupo)
else
ADsGetObject('WinNT://' + dominio + '/' + vNombreGrupo, IADsGroup, grupo);
Assert(grupo <> nil);
try
grupo.Add(usuario.ADsPath); grupo.SetInfo; actualizar_datos_usuario();
except
end;
end
else begin
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1, IADsUser, usuario)
else
ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usuario);
for vX := 0 to frmGroupsEnum.box_grupos.Items.Count -1 do
begin
if frmGroupsEnum.box_grupos.Items.Item[vX].Selected then
begin
vNombreGrupo := frmGroupsEnum.box_grupos.Items.Item[vX].Caption;
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
vNombreGrupo, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1, IADsGroup, grupo)
else
ADsGetObject('WinNT://' + dominio + '/' + vNombreGrupo, IADsGroup, grupo);
Assert(grupo <> nil);
try grupo.Add(usuario.ADsPath);
grupo.SetInfo;
except
end;
end;
end;
actualizar_datos_usuario ();
end;
end;
end;
end;
y Aca es para eliminar al usuario de uno o mas grupos.
Código Delphi
[-]
procedure ...
var
vNombreGrupo, dominio: string;
usuario : IADsUser;
grupo: IADsGroup;
vX: Integer;
begin
dominio := frmSessionInit.edt_domain.Text;
if box_grupos.SelCount > 0 then
begin
if Application.MessageBox('¿En verdad deseas quitar a este usuario del grupo o conjunto de grupos seleccionado?', 'Quitar usuario de grupo', MB_YESNO + MB_ICONEXCLAMATION) = ID_YES then
begin
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1, IADsUser, usuario)
else
ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usuario);
Assert(usuario <> nil);
if frmGroupsEnum.box_grupos.Items.Count > 0 then
begin
if frmGroupsEnum.box_grupos.SelCount = 1 then begin
vNombreGrupo := box_grupos.Selected.Caption;
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
vNombreGrupo, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1, IADsGroup, grupo)
else
ADsGetObject('WinNT://' + dominio + '/' + vNombreGrupo, IADsGroup, grupo);
Assert(grupo <> nil);
try
grupo.Remove(usuario.ADsPath); grupo.SetInfo; actualizar_datos_usuario();
finally
end;
end
else begin
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1, IADsUser, usuario)
else
ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usuario);
for vX := 0 to box_grupos.Items.Count -1 do
begin
if box_grupos.Items.Item[vX].Selected then
begin
vNombreGrupo := box_grupos.Items.Item[vX].Caption;
if not frmSessionInit.chk_another_user.Checked then
ADsOpenObject('WinNT://' + dominio + '/' +
vNombreGrupo, frmSessionInit.cbb_username.Text,
frmSessionInit.edtPassword.Text, 1, IADsGroup, grupo)
else
ADsGetObject('WinNT://' + dominio + '/' + vNombreGrupo, IADsGroup, grupo);
Assert(grupo <> nil);
try grupo.Remove(usuario.ADsPath);
grupo.SetInfo;
except
end;
end;
end;
actualizar_datos_usuario ();
end;
end;
end;
end
else
Application.MessageBox('Debes seleccionar uno o más grupos de este usuario para poder realizar esta operación.', 'Quitar usuario de grupo', MB_OK + MB_ICONINFORMATION);
end;