Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

**Улучшение безопасности: использование LsaLookupSids для получения названий локальных групп в Delphi 2010**

Delphi , Синтаксис , Справочник по API-функциям

Улучшение безопасности: использование LsaLookupSids для получения названий локальных групп в Delphi 2010

Введение

В процессе разработки приложений для Windows часто возникает необходимость работы с локальными группами пользователей, например, для добавления пользователя в группу администраторов. В Delphi 2010 для этого можно использовать функцию NetLocalGroupAddMembers. Однако, при разработке локализованных версий приложения, возникает задача получения названия группы на языке локализованной версии Windows. Для этого предназначена функция LsaLookupSids. В данной статье мы рассмотрим, как правильно использовать LsaLookupSids для получения названия группы по её SID.

Описание проблемы

Разработчики столкнулись с задачей получения названия группы пользователей по её SID в локализованной версии Windows. Функция LsaLookupSids предназначена для этого, но требует правильной настройки параметров для корректного выполнения запроса.

Пример кода

Вот пример кода, который демонстрирует использование LsaLookupSids для получения названия локальной группы администраторов:

function AddUser(const username, password: PChar; resetpassword: boolean): boolean; stdcall;
var
  NetApiStatus: NET_API_STATUS;
  UserInfo1003: USER_INFO_1003;
  UserInfo1005: USER_INFO_1005;
  ui: USER_INFO_1;
  grp: String;
  sid: PSID;
  snu: SID_NAME_USE;
  sidsize: LongWord;
  refdomain: array [0..MAX_PATH - 1] of char;
  refdomainsize: LongWord;
  sidstring: PChar;
  lgmi3: _LOCALGROUP_MEMBERS_INFO_3;
  reftranname: PLsaTranslatedName;
  pLsaPolicy: PLSA POLICY;
begin
  // Получаем обработчик политики безопасности
  pLsaPolicy := LsaOpenPolicy(nil, nil, POLICY_LOOKUP_NAMES);
  try
    sidstring := PChar('S-1-5-32-544'); // SID локальной группы администраторов
    sidsize := Length(sidstring);
    sid := AllocMem(sidsize);
    StrPCopy(sid^, sidstring);
    try
      refdomain := nil;
      refdomainsize := 0;
      reftranname := nil;
      LsaLookupSids(pLsaPolicy, 1, sid, @refdomain, reftranname);
      grp := reftranname^.Name.Buffer;
      ShowMessage('Название группы: ' + grp);
    finally
      FreeMem(sid, sidsize);
      LsaFreeReturnBuffer(refdomain);
      LsaFreeReturnBuffer(reftranname^.Name.Buffer);
    end;
  finally
    LsaClose(pLsaPolicy);
  end;
end;

Важные моменты

  • Необходимо открыть обработчик политики безопасности перед использованием LsaLookupSids.
  • После использования LsaLookupSids необходимо освободить выделенные буферы.
  • Пример кода предполагает, что SID уже известен и корректен.

Альтернативный ответ

В качестве альтернативы LsaLookupSids можно использовать функцию LookupAccountSid, которая предназначена для получения имени и домена пользователя или группы по SID. Пример использования LookupAccountSid с библиотекой JwaWindows:

uses JwaWindows;
var
  Sid: PSID;
  peUse: DWORD;
  cchDomain: DWORD;
  cchName: DWORD;
  Name: array of Char;
  Domain: array of Char;
begin
  Sid := nil;
  // Преобразуем строку SID в структуру PSID
  Win32Check(ConvertStringSidToSid(PChar('S-1-5-32-544'), Sid));
  try
    cchName := 0;
    cchDomain := 0;
    // Получаем длину необходимых буферов
    if (not LookupAccountSid(nil, Sid, nil, cchName, nil, cchDomain, peUse))
      and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
    begin
      SetLength(Name, cchName);
      SetLength(Domain, cchDomain);
      // Получаем имя и домен для SID
      if LookupAccountSid(nil, Sid, @Name[0], cchName, @Domain[0], cchDomain, peUse) then
        ShowMessageFmt('%s\%s', [PChar(Domain), PChar(Name)]);
    end;
  finally
    LocalFree(DWORD(Sid));
  end;
end;

Подтвержденный ответ

Также можно использовать библиотеку JCL, которая предоставляет удобные функции для работы с SID. Пример использования функции GetNameFromSid из JCL:

uses
  JclSecurity, JclWin32;
function GetNameFromSid(ASID: String): String;
begin
  // Код для получения имени группы по SID
end;

Этот код не использует LsaLookupSids, но использует LookupAccountSid для получения имени и домена, что является более простым и прямым способом для локальных групп.

Заключение

В данной статье мы рассмотрели, как использовать функцию LsaLookupSids для получения названия локальной группы в Delphi 2010, а также предложили альтернативный подход с использованием LookupAccountSid. Применение этих функций позволяет улучшить безопасность и локализацию приложений, работающих с локальными группами Windows.

Создано по материалам из источника по ссылке.

### Описание контекста: В контексте рассматривается использование функции `LsaLookupSids` для получения названия локальной группы пользователей по её SID в среде разработки Delphi 2010, что важно для локализации приложений под различные версии Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:15:46/0.0033800601959229/0