Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Вниз

Принадлежность группе пользователя в AD   Найти похожие ветки 

 
ilshat   (2008-09-02 10:15) [0]

Как выяснить принадлежит ли пользователь определенной группе в Active Directory?


 
ilshat   (2008-09-02 15:08) [1]

написал сам.. недождалси

{*******************************************************}
{                                                       }
{     Copyright (c) 2008 by Ilshat I. Fakhrislamov      }
{*******************************************************}
unit CheckUpUserInGroup;

interface

uses
SysUtils,ADODB,Variants;

function FCheckUpUserInGroup(UserName: string; GroupName: string; DomainName: string): boolean;

implementation

function FCheckUpUserInGroup(UserName: string; GroupName: string; DomainName: string): boolean;
var
 i: integer;
 ArrayMemberOf: variant;
 MemberOfString: string;
 NewADOConnection: TADOConnection;
 NewADOQuery: TADOQuery;
begin
 Result := false;
 UserName:=AnsiUpperCase(Trim(UserName));
 GroupName:=AnsiUpperCase(Trim(GroupName));

 NewADOConnection:=TADOConnection.Create(nil);

 with NewADOConnection do
 begin
   LoginPrompt:=false;
   ConnectionString:="Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0";
 end;
 NewADOQuery:=TADOQuery.Create(nil);
 with NewADOQuery do
 begin
   SQL.Text:="select memberof from ""LDAP://"+DomainName+""" where userPrincipalName="""+UserName+"@"+DomainName+"""";
   Connection:=NewADOConnection;
 end;
 NewADOQuery.Open;

 if not NewADOQuery.IsEmpty then
 begin
   ArrayMemberOf:=NewADOQuery.FieldByName("memberof").AsVariant;
   i:=VarArrayLowBound(ArrayMemberOf,1);
   while i<=VarArrayHighBound(ArrayMemberOf,1) do
   begin
     MemberOfString:=VarToStr(NewADOQuery.FieldByName("memberof").Value[i]);
     i:=i+1;
     if Pos(GroupName,AnsiUpperCase(MemberOfString))>0 then Result:=true;
   end;
 end;

 NewADOQuery.Close;
 NewADOQuery.Destroy;
 NewADOConnection.Destroy;
end;

end.


 
Weaver   (2009-07-08 12:16) [2]

При запросе


select distinguishedName,Name from "LDAP://DC=*,DC=*" where objectClass="user" or objectClass="group"


Получаю "Отсутствует право доступа" ("Permission denied"). Пробовал на двух разных AD, в обоих имею самые полные права. Куда копать?


 
clickmaker ©   (2009-07-08 12:59) [3]

а логин-пароль не нужны в ConnectionString?


 
Weaver   (2009-07-08 18:02) [4]

используется связка ADOConnection и ADOQuery. В ADOConnection прописан провайдер и связка имя пароль (точную строку в данный момент не приведу). Открытие ADOConnection срабатывает успешно. Затем пытаюсь открыть ADOQuery (с вышеуказанным запросом) - срабатывает исключение с текстом "Отсутствует право доступа"


 
stepka   (2009-08-31 19:06) [5]

select distinguishedName,Name from "LDAP://DC=*,DC=*" where objectClass="user" or objectClass="group" ошибка в этой строке скорее всего т.к. у вас запрос не дописан полностью.
У мен ябыла такая же ошибка с ограниченным доступом, вылечилось вот так:
select distinguishedName,Name from "LDAP://CN=Users,DC=domain,DC=ru" where objectClass="user" or objectClass="group"


 
ronin2007 ©   (2010-06-08 12:26) [6]

Функция очень полезная, да вот только возникает вопрос, а если пользователь напрямую не входит в заданную группу? Т.е. входит в какую-то, а та в свою очередь входит в заданную. Как подправить эту функцию?


 
ronin2007 ©   (2010-06-11 05:59) [7]

Переделал немного под себя. Теперь обрабатывается вложенность групп. Убрал параметр имя домена, т.к. он у меня один. Кому надо, легко может добавить.
Пользуйтесь наздоровье.

function FCheckUpUserInGroup(UserName: string; GroupName: string): boolean;
var
i: integer;
ArrayMemberOf: variant;
MemberOfString: string;
NewADOConnection: TADOConnection;
NewADOQuery: TADOQuery;
CheckedGroups:String; //Здесь будут запоминаться уже проверенные группы
  function CheckUpGroupInGroup(GroupName1,GroupName2:String):boolean;
  var
    i: integer;
    ArrayMemberOf: variant;
    MemberOfString: string;
    NewADOConnection: TADOConnection;
    NewADOQuery: TADOQuery;
  begin
    Result := false;
    GroupName1:=AnsiUpperCase(Trim(GroupName1));      //искомая группа
    GroupName2:=AnsiUpperCase(Trim(GroupName2));      //группа, в которую  входит пользователь
    if GroupName1=GroupName2 then
    begin
      Result:=true;
      Exit;
    end;
    if pos(","+GroupName2+",",CheckedGroups)>0 then Exit; //Выходим, если эта группа уже проверялась
    // нужно узнать не входил ли группа GroupName2 в группу GroupName1
    //Для этого смотрим в какие группы входит GroupName2 и повторяем для каждой группы CheckUpGroupInGroup(GroupName1,GroupName2)
    NewADOConnection:=TADOConnection.Create(nil);
    NewADOQuery:=TADOQuery.Create(nil);
    try
      with NewADOConnection do
      begin
        LoginPrompt:=false;
        ConnectionString:="Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0";
      end;

      //ищем в какие группы входит группа GroupName2
      with NewADOQuery do
      begin
        SQL.Text:="select memberof from ""LDAP://DC=MyDomen,DC=ru"" where objectcategory=""group"" and samaccountname="""+GroupName2+"""";
        Connection:=NewADOConnection;
      end;
      NewADOQuery.Open;
      if not NewADOQuery.IsEmpty then
      if not NewADOQuery.FieldByName("memberof").IsNull then
      begin
        ArrayMemberOf:=NewADOQuery.FieldByName("memberof").AsVariant;
        i:=VarArrayLowBound(ArrayMemberOf,1);
        while i<=VarArrayHighBound(ArrayMemberOf,1) do
        begin
          MemberOfString:=VarToStr(NewADOQuery.FieldByName("memberof").Value[i]);
          MemberOfString:=ExtractWord(1,MemberOfString,[","]);
          MemberOfString:=ExtractWord(2,MemberOfString,["="]);
          MemberOfString:=AnsiUpperCase(MemberOfString);
          i:=i+1;
          if CheckUpGroupInGroup(GroupName1,MemberOfString) then
          begin
            Result:=true;
            break;
          end
          else
          CheckedGroups:=CheckedGroups+MemberOfString+",";
        end;
      end
      else CheckedGroups:=CheckedGroups+GroupName2+",";
    finally
      NewADOQuery.Close;
      NewADOQuery.Destroy;
      NewADOConnection.Destroy;
    end;
  end;
begin
Result := false;
UserName:=AnsiUpperCase(Trim(UserName));
GroupName:=AnsiUpperCase(Trim(GroupName));
CheckedGroups:=",";
NewADOConnection:=TADOConnection.Create(nil);
NewADOQuery:=TADOQuery.Create(nil);
try
  with NewADOConnection do
  begin
    LoginPrompt:=false;
    ConnectionString:="Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0";
  end;

  with NewADOQuery do
  begin
    SQL.Text:="select memberof from ""LDAP://DC=MyDomen,DC=ru"" where userPrincipalName="""+UserName+"@MyDomen.RU""";
    Connection:=NewADOConnection;
  end;
  NewADOQuery.Open;
  if not NewADOQuery.IsEmpty then
  if not NewADOQuery.FieldByName("memberof").IsNull then
  begin
    ArrayMemberOf:=NewADOQuery.FieldByName("memberof").AsVariant;
    i:=VarArrayLowBound(ArrayMemberOf,1);
    while i<=VarArrayHighBound(ArrayMemberOf,1) do
    begin
      MemberOfString:=VarToStr(NewADOQuery.FieldByName("memberof").Value[i]);
      MemberOfString:=ExtractWord(1,MemberOfString,[","]);
      MemberOfString:=ExtractWord(2,MemberOfString,["="]);
      MemberOfString:=AnsiUpperCase(MemberOfString);
      i:=i+1;
      if CheckUpGroupInGroup(GroupName,MemberOfString) then
      begin
        Result:=true;
        break;
      end;
    end;
  end;
finally
  NewADOQuery.Close;
  NewADOQuery.Destroy;
  NewADOConnection.Destroy;
end;
end;


 
ronin2007 ©   (2010-06-11 08:15) [8]

Ещё раз, немного подправленная, т.к. обнаружились баги:

function FCheckUpUserInGroup(UserName: string; GroupName: string): boolean;
var
i: integer;
ArrayMemberOf: variant;
MemberOfString: string;
NewADOConnection: TADOConnection;
NewADOQuery: TADOQuery;
CheckedGroups:String; //Здесь будут запоминаться уже проверенные группы
 function CheckUpGroupInGroup(GroupName1,GroupName2:String):boolean;
 var
   i: integer;
   ArrayMemberOf: variant;
   MemberOfString: string;
   NewADOConnection: TADOConnection;
   NewADOQuery: TADOQuery;
 begin
   Result := false;
   if GroupName1=GroupName2 then
   begin
     Result:=true;
     Exit;
   end;
   if pos(","+GroupName2+",",CheckedGroups)>0 then Exit; //Выходим, если эта группа уже проверялась
   // нужно узнать не входил ли группа GroupName2 в группу GroupName1
   //Для этого смотрим в какие группы входит GroupName2 и повторяем для каждой группы CheckUpGroupInGroup(GroupName1,GroupName2)
   NewADOConnection:=TADOConnection.Create(nil);
   NewADOQuery:=TADOQuery.Create(nil);
   try
     with NewADOConnection do
     begin
       LoginPrompt:=false;
       ConnectionString:="Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0";
     end;

     //ищем в какие группы входит группа GroupName2
     with NewADOQuery do
     begin
       SQL.Text:="select memberof from ""LDAP://DC=MyDomen,DC=ru"" where objectcategory=""group"" and samaccountname="""+GroupName2+"""";
       Connection:=NewADOConnection;
     end;
     NewADOQuery.Open;
     if not NewADOQuery.IsEmpty then
     if not NewADOQuery.FieldByName("memberof").IsNull then
     begin
       ArrayMemberOf:=NewADOQuery.FieldByName("memberof").AsVariant;
       i:=VarArrayLowBound(ArrayMemberOf,1);
       while i<=VarArrayHighBound(ArrayMemberOf,1) do
       begin
         MemberOfString:=VarToStr(NewADOQuery.FieldByName("memberof").Value[i]);
         MemberOfString:=ExtractWord(1,MemberOfString,[","]);
         MemberOfString:=ExtractWord(2,MemberOfString,["="]);
         MemberOfString:=AnsiUpperCase(MemberOfString);
         i:=i+1;
         if CheckUpGroupInGroup(GroupName1,MemberOfString) then
         begin
           Result:=true;
           break;
         end;
       end;
     end
     else CheckedGroups:=CheckedGroups+GroupName2+",";
   finally
     NewADOQuery.Close;
     NewADOQuery.Destroy;
     NewADOConnection.Destroy;
   end;
 end;
begin
Result := false;
UserName:=AnsiUpperCase(Trim(UserName));
GroupName:=AnsiUpperCase(Trim(GroupName));
CheckedGroups:=",";
NewADOConnection:=TADOConnection.Create(nil);
NewADOQuery:=TADOQuery.Create(nil);
try
 with NewADOConnection do
 begin
   LoginPrompt:=false;
   ConnectionString:="Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0";
 end;

 with NewADOQuery do
 begin
   SQL.Text:="select memberof from ""LDAP://DC=MyDomen,DC=ru"" where samaccountname="""+UserName+"""";
   Connection:=NewADOConnection;
 end;
 NewADOQuery.Open;
 if not NewADOQuery.IsEmpty then
 if not NewADOQuery.FieldByName("memberof").IsNull then
 begin
   ArrayMemberOf:=NewADOQuery.FieldByName("memberof").AsVariant;
   i:=VarArrayLowBound(ArrayMemberOf,1);
   while i<=VarArrayHighBound(ArrayMemberOf,1) do
   begin
     MemberOfString:=VarToStr(NewADOQuery.FieldByName("memberof").Value[i]);
     MemberOfString:=ExtractWord(1,MemberOfString,[","]);
     MemberOfString:=ExtractWord(2,MemberOfString,["="]);
     MemberOfString:=AnsiUpperCase(MemberOfString);
     i:=i+1;
     if CheckUpGroupInGroup(GroupName,MemberOfString) then
     begin
       Result:=true;
       break;
     end;
   end;
 end;
finally
 NewADOQuery.Close;
 NewADOQuery.Destroy;
 NewADOConnection.Destroy;
end;
end;



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.046 c
15-1418938202
Юрий
2014-12-19 00:30
2015.09.10
С днем рождения ! 19 декабря 2014 пятница


15-1415217828
Jeer
2014-11-05 23:03
2015.09.10
С днем военного разведчика!


15-1413374633
xayam
2014-10-15 16:03
2015.09.10
[Гравитация] Может такое быть?


15-1417274328
ВладОшин
2014-11-29 18:18
2015.09.10
Что за правило?


15-1415206301
Дмитрий Белькевич
2014-11-05 19:51
2015.09.10
Как сделать Variants и System.Variants одним юнитом в XE6?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский