Форум: "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