Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Получить список групп текущего юзера/общий   Найти похожие ветки 

 
sniknik ©   (2009-12-01 12:03) [0]

Пытаюсь получить список групп (для начала юзера от которого запущен процесс), по идее должно работать -
function SidToName(Sid: PSID): string;
var
 Name: array[0..128] of Char;
 NameSize: DWORD;
 Domain: array[0..64] of Char;
 DomainSize: DWORD;
 peUse: SID_NAME_USE;
begin
 Win32Check(IsValidSid(Sid));

 NameSize  :=128;
 DomainSize:=64;

 if LookupAccountSid(nil, Sid, @Name[0], NameSize, @Domain[0], DomainSize, peUse)
   then result:= Domain + "\" + Name + " - " + IntToStr(peUse);
end;

procedure SidGroupList(List: TStrings);
var
 hToken: THandle;
 pTGroups: PTokenGroups;
 i, Size: integer;
 RetLength: DWORD;
 Sid: PSid;
begin
 Win32Check(OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hToken));

 try
   pTGroups:= nil;
   GetTokenInformation(hToken, TokenGroups, pTGroups, 0, RetLength);
   GetMem(pTGroups, RetLength);
   try
     Win32Check(GetTokenInformation(hToken, TokenGroups, pTGroups, RetLength, RetLength));

     for i:= 0 to pTGroups.GroupCount - 1 do begin
       Size:= GetLengthSid(pTGroups.Groups[i].Sid);
       GetMem(Sid, Size);
       CopyMemory(Sid, pTGroups.Groups[i].Sid, Size);

       List.AddObject(SidToName(Sid), Sid);
     end;
   finally
     FreeMem(pTGroups);
   end;
 finally
   CloseHandle(hToken);
 end;
end;

даже что то выдает... но, почему то всегда одно и тоже. Для проверки создал свою группу "Test", добавляю себя в члены этой группы... (в lusrmgr.msc видит) но моя функция, группу игнорирует. Вопрос, почему?
Ну и продолжение, как получить полный список доступных, независимо от пользователя. В гугле что то все вертится вокруг проверки является ли текущий админом...


 
sniknik ©   (2009-12-01 12:15) [1]

Блин! Первый вопрос отпал, все работает, просто в системе 2 одноименных юзера (различаются по сиду), доменный и локальный, а lusrmgr.msc показывает их как одного, вот и путаница. Если запустить от имени и выбрать чисто локального, то моя группа у него есть.

По общему списку еще актуален.


 
clickmaker ©   (2009-12-01 12:21) [2]

> как получить полный список доступных

групп? NetGroupEnum что-ли?


 
sniknik ©   (2009-12-01 12:27) [3]

Кстати, приемлем (а то и лучше) другой вариант...
Если в свойствах учетки на панели "Членство в группах" нажать "Добавить" то открывается выбор от системы, так вот если есть возможность использовать этот системный выбор, это бы меня более чем устроило. (нужно сделать выбор группы в программе, а средства значения не имеют)
Опять, вопрос как? Если вообще возможно.


 
sniknik ©   (2009-12-01 12:28) [4]

> NetGroupEnum что-ли?
А это тоже самое?


 
clickmaker ©   (2009-12-01 12:32) [5]

> это тоже самое?

ну наверно да.


 
sniknik ©   (2009-12-01 12:46) [6]

Нда, похоже я искал не там... потому и не находил.
Спасибо.


 
sniknik ©   (2009-12-01 15:43) [7]

В общем итог
procedure GroupList(List: TStrings);
type
 GROUP_INFO = record
   lgrpi_name   : LPWSTR;
   lgrpi_comment: LPWSTR;
 end;

 TGroups = array of GROUP_INFO;
var
 pGroups: Pointer;
 Res, i : integer;
 cbRead, cbTotal: integer;
 DName: WideString;
begin
 NetLocalGroupEnum(nil, 1, pGroups, DWORD(-1), DWORD(cbRead), DWORD(cbTotal), nil);
 for i:=0 to cbRead - 1 do
   with TGroups(pGroups)[i] do
     List.Add("\" + WideCharToString(lgrpi_name));

 NetApiBufferFree(pGroups);

 DName:= DomainName;
 NetGroupEnum(PWideChar(DName), 1, pGroups, DWORD(-1), DWORD(cbRead), DWORD(cbTotal), nil);
 for i:= 0 to cbRead - 1 do
   with TGroups(pGroups)[i] do
     List.Add(DomainName + "\" + WideCharToString(lgrpi_name));

 NetApiBufferFree(pGroups);
end;

Действительно все сходится... т.е. тут нету сида, но если его получить по имени группы (+локальное(/пустое) или доменное имя) то они сходятся один в один с тем что получал ранее для текущего процесса.



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

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.051 c
15-1329639614
NailMan
2012-02-19 12:20
2013.03.22
Давно что то не было новостей...


15-1333826589
Дмитрий С
2012-04-07 23:23
2013.03.22
Занимает ли пустой файл блок в fat32 или ext3?


15-1350899839
AV
2012-10-22 13:57
2013.03.22
Чем занимались во времена Пушкина осенью :)


15-1344432770
ProgRAMmer Dimonych
2012-08-08 17:32
2013.03.22
Доступ к INI-файлу из нескольких процессов


15-1347287024
LDV
2012-09-10 18:23
2013.03.22
сборка com-сервера из командной строки. Проблема с tlb