Главная страница
    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.5 MB
Время: 0.052 c
15-1414791002
Юрий
2014-11-01 01:30
2015.09.10
С днем рождения ! 1 ноября 2014 суббота


1-1332746450
CRLF
2012-03-26 11:20
2015.09.10
Подружить IXMLDOMDocument2 и MS SQL XML


15-1412335282
ProstoTak
2014-10-03 15:21
2015.09.10
MS SQL deadlock


15-1415723216
Ellisium
2014-11-11 19:26
2015.09.10
MS SQL синхронизация / Timestamp


15-1419111005
Юрий
2014-12-21 00:30
2015.09.10
С днем рождения ! 21 декабря 2014 воскресенье





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский