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

Вниз

Как определить, что пользователь A входит в группу B?   Найти похожие ветки 

 
Alexander ©   (2004-03-26 11:00) [0]

У меня есть их SID.
Про функции NetUserGet(Local)Groups, но они не всегда подходят, т.к. возможна ситуация A -> грC -> грD -> грB.

Или ещё как можно определить список групп, которым принадлежит заданная группа?


 
Игорь Шевченко ©   (2004-03-26 11:12) [1]

NetLocalGroupGetMembers не подойдет ?


 
Alexander ©   (2004-03-26 14:10) [2]

Спасибо, но она работает только для локальных групп, а для глобальных нет :(
Что делать в этом случае?


 
Игорь Шевченко ©   (2004-03-26 14:30) [3]


> Что делать в этом случае?

Справку читать.

The NetGroupGetUsers function retrieves a list of the members of a particular global group in the security database.


 
Alexander ©   (2004-03-26 14:47) [4]

Да я читал :) и функцию эту смотрел.
Да, она работает с глобальными группами, но выдаёт только пользователей этой группы, а мне нужен ещё и список в неё входящих групп.


 
Игорь Шевченко ©   (2004-03-26 15:21) [5]

Разве эта функция не отвечает на вопрос:

"Как определить, что пользователь A входит в группу B" ?

Я к тому, равзе она не выдает, что пользователь входит в эту группу, даже если на самом деле он входит в другую группу, которая входит в заданную ?


 
Alexander ©   (2004-03-26 15:51) [6]

В том-то и дело, что нет. Проверил. Она выдаёт только своих пользователей, а не пользователей своих подгрупп.


 
Alexander ©   (2004-03-29 08:24) [7]

Получается, что нет нормального способа получить полный пусть от пользователя к группе?


 
Cobalt ©   (2004-03-29 23:25) [8]

NetUserGetLocalGroups? там можно указывать
servername
   [in] Pointer to a constant string that specifies the DNS or NetBIOS name of the remote server on which the function is to execute. If this parameter is NULL, the local computer is used.

       Windows NT: This string must begin with \\.


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netusergetlocalgroups.asp


 
Игорь Шевченко ©   (2004-03-30 00:17) [9]

Alexander ©   (29.03.04 08:24)

И до кучи к Cobalt ©   (29.03.04 23:25)

NetUserGetGroups.

Если не поможет, опиши исходные данные (как и что создать, какие группы, каких пользователей), попробуем поискать решение.


 
Alexander ©   (2004-03-30 01:57) [10]

To Cobalt & Игорь Шевченко

Приведённые функции пробовал уже, но ... :(

Ситуация такая: в клиент-серверной программе нужно реализовать доступ к данным на уровне пользователя. Для каждой записи заданы пользователи и группы, которые имеют к ним доступ. К серверу поступает запрос - имя пользователя и сервер должен разрешить или запретить выдачу данных.

Вот какую ситуацию на данный момент не получается разобрать:
есть Active Directory (Windows 2003) и домен.
В домене есть группа Administrators (локальная встроенная).
Также есть группа Test (глобальная).

В оснастке Active Directory - пользователи и компьютеры добавляю открываю группа Text и добавляю в её члены группу Administrators.

Всё, все настройки заданы. Теперь задача получить программно родительскую связь этих двух групп.


 
Cobalt ©   (2004-03-30 09:00) [11]

Всё нижесказанное не претендует на истину в последней инстанции, а лишь отражает моё мнение

Вообще-то, архитектура идеологически хромает :(
Группы пользователей были придуманы не для этого.
Архитектура привилегий заключается в том, что проверяется именно она (привилегия), а не группа, ведь название группы "Админестраторы" ещё не означает, что у пользователей этой группы есть права на отладку.
 Мысль, я надеюсь, ясна?
Хотя, конечно, жаль, что MS не дала (судя по вашим изысканиям) функций для получения полной связи груп/пользователей.


 
Игорь Шевченко ©   (2004-03-30 10:44) [12]

Alexander ©   (30.03.04 01:57)


> Для каждой записи заданы пользователи и группы, которые
> имеют к ним доступ. К серверу поступает запрос - имя пользователя
> и сервер должен разрешить или запретить выдачу данных.


Impersonation не спасет ?


 
Alexander ©   (2004-03-30 12:43) [13]

To Cobalt:
Замечания принимаю, буду рад услышать совет по реализации доступа - работаю с этим впервые, я и сам знаю, что функции проверки овторизации нужно возлагать на Windows

To Игорь Шевченко:
Я много копался перед тем как задать вопрос.
Есть в JCL такая функция:


function IsAdministrator: Boolean;
var
 psidAdmin: Pointer;
 Token: THandle;
 Count: DWORD;
 TokenInfo: PTokenGroups;
 HaveToken: Boolean;
 I: Integer;
begin
 Result := False;
 psidAdmin := nil;
 TokenInfo := nil;
 HaveToken := False;
 try
   HaveToken := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, Token);
   if (not HaveToken) and (GetLastError = ERROR_NO_TOKEN) then
     HaveToken := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, Token);
   if HaveToken then
   begin
     Win32Check(AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
       SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
       psidAdmin));
     {$IFDEF FPC}
     if GetTokenInformation(Token, TokenGroups, nil, 0, @Count) or
      (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
        RaiseLastOSError;
     TokenInfo := PTokenGroups(AllocMem(Count));
     Win32Check(GetTokenInformation(Token, TokenGroups, TokenInfo, Count, @Count));
     {$ELSE FPC}
     if GetTokenInformation(Token, TokenGroups, nil, 0, Count) or
      (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
        RaiseLastOSError;
     TokenInfo := PTokenGroups(AllocMem(Count));
     Win32Check(GetTokenInformation(Token, TokenGroups, TokenInfo, Count, Count));
     {$ENDIF FPC}
     for I := 0 to TokenInfo^.GroupCount - 1 do
     begin
       {$RANGECHECKS OFF} // Groups is an array [0..0] of TSIDAndAttributes, ignore ERangeError
       Result := EqualSid(psidAdmin, TokenInfo^.Groups[I].Sid);
       {$IFDEF RANGECHECKS_ON}
       {$RANGECHECKS ON}
       {$ENDIF RANGECHECKS_ON}
       if Result then
         Break;
     end;
   end;
 finally
   if TokenInfo <> nil then
     FreeMem(TokenInfo);
   if HaveToken then
     CloseHandle(Token);
   if psidAdmin <> nil then
     FreeSid(psidAdmin);
 end;
end;


Здесь ключевые для меня строки:

   HaveToken := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, Token);
   if (not HaveToken) and (GetLastError = ERROR_NO_TOKEN) then
     HaveToken := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, Token);


т.е. получаем токен текущего приложения.
Как можно это дело подправить для моих нужд - я не додумался.


 
Alexander ©   (2004-03-30 12:48) [14]

Читал книжку "Системное программирование в Windows 2000"
Там есть глава по безопасности.
Вот что получилось на основе её:

function UserInGroup(UserSidStr, GroupSidStr: string): Boolean;
const
 ACL_REVISION = 2;
var
 privsd: PSecurityDescriptor;
 token, len, amask: Cardinal;
 sd: TSecurityDescriptor;
 Acl: array[0..1023] of Byte;
 UserSid, GroupSid: PSID;
 mapping: GENERIC_MAPPING;
 pset: PRIVILEGE_SET;
 AccessAllowed: BOOL;
begin
 mapping.GenericRead    := 1;
 mapping.GenericWrite   := 0;
 mapping.GenericExecute := 3;
 mapping.GenericAll     := 3;

 Result := False;
 privsd := nil;
 UserSid  := SidStrToSid(UserSidStr);
 if Assigned(UserSid) then
 try
   GroupSid := SidStrToSid(GroupSidStr);
   if Assigned(GroupSid) then
   try
     if not InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION) then
       Exit;
     if not InitializeAcl(PACL(@Acl)^, SizeOf(Acl), ACL_REVISION) then
       Exit;
     if not AddAccessAllowedAce(PACL(@Acl)^, ACL_REVISION, 3, GroupSid) then
       Exit;
     if not SetSecurityDescriptorDacl(@sd, True, @Acl, False) then
       Exit;

     if not ImpersonateSelf(SecurityImpersonation) then
       Exit;
     if not OpenThreadToken(GetCurrentThread, TOKEN_ALL_ACCESS, False, token) then
       Exit;

     if not CreatePrivateObjectSecurity(nil, @sd, privsd, False, token, mapping) then
       Exit;
     Result := AccessCheck(privsd, token, 3, mapping, pset, len, amask,
                           AccessAllowed) and AccessAllowed;
   finally
     LocalFree(HLOCAL(GroupSid));
   end;
 finally
   LocalFree(HLOCAL(UserSid));
 end;
end;


(функция SidStrToSid - моя)
Но что-то это не работает :(


 
Игорь Шевченко ©   (2004-03-30 12:56) [15]

Alexander ©   (30.03.04 12:48)

Я бы рекомендовал почитать книжку Рихтера и Кларка "Программирование серверных приложений для Windows 2000"

И еще раз спрошу: Impersonation не поможет ?


 
Alexander ©   (2004-03-30 13:07) [16]

Так я не знаю, поможет или нет - потому и спрашиваю :(
До этого вообще с безопасностью не работал.

Есть ли где в online эта книжка?
И где можно ещё почитать про Impersonation?



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

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

Наверх




Память: 0.5 MB
Время: 0.055 c
3-1082115450
nv_
2004-04-16 15:37
2004.05.16
А всё таки поиск в подстановочном поле...


3-1082369091
}|{yk
2004-04-19 14:04
2004.05.16
Не подскажитте, почему такой вот запрос


3-1082631297
Top100
2004-04-22 14:54
2004.05.16
Экспорт данных из БД Оракла в таблицу Paradox


1-1083136882
Sectey
2004-04-28 11:21
2004.05.16
Можно ли узнать имя метода во время его выполнения


1-1083559480
-=Toshanius=-
2004-05-03 08:44
2004.05.16
Время работы программы





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