При закрытии подписчики были переданы в рассылку "Delphi - проблемы и решения" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Информационный Канал Subscribe.Ru |
type SID_IDENTIFIER_AUTHORITY = record Value : array[0..5] of Byte; end;
SECURITY_NULL_SID_AUTHORITY (0) - применяется для создания пустой группы - SECURITY_NULL_RID (0) [Sid пустой группы S-1-0-0] SECURITY_WORLD_SID_AUTHORITY (1) - применяется для создания учетной записи "Все" - SECURITY_WORLD_RID (0) [Sid Все(EveryOne) S-1-1-0] SECURITY_LOCAL_SID_AUTHORITY (2) - применяется для создания группы Local (в ней находятся все пользователи, регистрирующиеся локально) - SECURITY_LOCAL_RID (0) [Sid группы Local S-1-2-0] SECURITY_CREATOR_SID_AUTHORITY (3) - применяется для создания стандартных SID владельцев - SECURITY_CREATOR_OWNER_RID (0) - [Создатель/владелец - S-1-3-0] - SECURITY_CREATOR_GROUP_RID (1) - [Группа владельца - S-1-3-1]Все вышеописанные SID являются одинаковыми для любой NT. Единственным органом, выдающим RID пользователям и группам, является SECURITY_NT_AUTHORITY (5). У него также есть несколько стандартных RID. Полный их список вы можете найти в MSDN. Я назову только один - SECURITY_LOCAL_SYSTEM_RID (18) и SID S-1-5-18 соответствуют учетной записи LocalSystem\Система.
// Ищем SID пользователя lpName procedure UserGetSid(lpName : PWideChar); var lpDomain : PWideChar; Sid : PSID; cbDomain,cbSid : Cardinal; peUse : Cardinal; begin cbSid:=128; // Размер буфера под SID (должно хватить) cbDomain:=64; // Кол-во символов в имени домена // Выделяем память GetMem(Sid,cbSid); GetMem(lpDomain,cbDomain*SizeOf(WideChar)); // Я в примерах использую Unicode-строки // Пытаемся получить SID и имя домена if not LookupAccountNameW(nil,lpName,Sid,cbSid,lpDomain,cbDomain,peUse) and (GetLastError=ERROR_INSUFFICIENT_BUFFER) then begin // Не хватило памяти под SID и/или имя домена. // в cbSid и cbDomain находятся необходимые размеры ReAllocMem(Sid,cbSid); // Повторюсь - функция требует и возвращает не размер буфера, а кол-во символов. ReAllocMem(lpDomain,cbDomain*SizeOf(WideChar)); // Снова вызываем if not LookupAccountNameW(nil,lpName,Sid,cbSid,lpDomain,cbDomain,peUse) then MessageBoxW(0,PWideChar(SysErrorMessage(GetLastError)),'Error',MB_OK); end; // Пользуемся SID // Освобождаем память FreeMem(Sid); Freemem(lpDomain); end; // Получаем имя пользователя по SID //(комментировать не буду - все аналогично предыдущему примеру) procedure GetSidUser(Sid : PSID); var Sid : PSID; lpName,lpDomain : PWideChar; cbName,cbDomain : Cardinal; peUse : Cardinal; begin cbName:=64; cbDomain:=64; GetMem(lpName,cbName*SizeOf(WideChar)); GetMem(lpDomain,cbDomain*SizeOf(WideChar)); if not LookupAccountSidW(nil,Sid,lpName,cbName,lpDomain,cbDomain,peUse) and (GetLastError=122) then begin ReAllocMem(lpName,cbName*SizeOf(WideChar)); ReAllocMem(lpDomain,cbDomain*SizeOf(WideChar)); if not LookupAccountSidW(nil,Sid,lpName,cbName,lpDomain,cbDomain,peUse) then MessageBoxW(0,PWideChar(SysErrorMessage(GetLastError)),'Error',MB_OK); end; // Пользуемся lpName ShowMessage(lpName); FreeMem(lpName); Freemem(lpDomain); end;Наличие имени сервера (локального компьютера (nil) в данном случае) не означает, что поиск будет вестись только на этом компьютере. Функция просматривает объекты в таком порядке - стандартные SID, пользователи и группы на этом компьютере, домен и все компьютеры в нем, другие домены. При этом, если имя учетной записи совпадает с именем компьютера, то она вернет SID последнего.
const SidTypeUser = 1; // SID пользователя SidTypeGroup = 2; // группы SidTypeDomain = 3; // домена SidTypeAlias = 4; // встроенной группы SidTypeWellKnownGroup = 5; // стандартной группы SidTypeDeletedAccount = 6; // удаленной записи SidTypeInvalid = 7; // неверный SID SidTypeUnknown = 8; // неизвестный SID SidTypeComputer = 9; // SID компьютера (объявления в windows.pas нет.)
const SECURITY_NT_AUTHORITY : TSidIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); // создаем SID AllocateAndInitializeSid(SECURITY_NT_AUTHORITY,1,2,0,0,0,0,0,0,0,Sid); // используем SID // Освобождаем память FreeSid(Sid);
SID = record Revision : Byte; SubAuthorityCount : Byte; IdentifierAuthority : SID_IDENTIFIER_AUTHORITY; SubAuthority : array [0..ANYSIZE_ARRAY-1] of DWORD; end;
function SidToStr(Sid : PSID):WideString; var SIA : PSidIdentifierAuthority; dwCount : Cardinal; I : Integer; begin // S-R-I-S-S... Result:=''; // Проверяем SID if not isValidSid(Sid) then Exit; Result:='S-'; // Префикс // Получаем номер версии SID // Хотя работать на прямую с SID, как я уже говорил, не рекомендуется Result:=Result+IntToStr(Byte(Sid^))+'-'; // Получаем орган, выдавший SID // Пока все находится в последнем байте sia:=GetSidIdentifierAuthority(Sid); Result:=Result+IntToStr(sia.Value[5]); //S-R-I- // кол-во RID dwCount:= GetSidSubAuthorityCount(Sid)^; // и теперь перебираем их for i:=0 to dwCount-1 do Result:=Result+'-'+IntToStr(GetSidSubAuthority(Sid,i)^); end;
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||