<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=84259&amp;view=findpost&amp;p=619778</guid>
        <pubDate>Mon, 21 Feb 2005 20:30:46 +0000</pubDate>
        <title>Получение информации о пользователях и группах домена</title>
        <link>https://forum.sources.ru/index.php?showtopic=84259&amp;view=findpost&amp;p=619778</link>
        <description><![CDATA[s-mike: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">////////////////////////////////////////////////////////////////////////////////</div><div class="code_line">//</div><div class="code_line">// &nbsp;****************************************************************************</div><div class="code_line">// &nbsp;* Project &nbsp; : DomainInfo</div><div class="code_line">// &nbsp;* Unit Name : uMain</div><div class="code_line">// &nbsp;* Purpose &nbsp; : Демо получения информации о пользователях и группах домена</div><div class="code_line">// &nbsp;* Author &nbsp; &nbsp;: Александр (Rouse_) Багель</div><div class="code_line">// &nbsp;* Version &nbsp; : 1.00</div><div class="code_line">// &nbsp;****************************************************************************</div><div class="code_line">//</div><div class="code_line">// &nbsp;Спасибо милой девушке Ане и группе &quot;Машина Времени&quot; за моральную поддержку...</div><div class="code_line">//</div><div class="code_line">&nbsp;</div><div class="code_line">unit uMain;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,</div><div class="code_line">&nbsp;&nbsp;Dialogs, StdCtrls, ExtCtrls, ComCtrls</div><div class="code_line">&nbsp;&nbsp;{$IFDEF VER150}</div><div class="code_line">&nbsp;&nbsp; &nbsp;, XPMan</div><div class="code_line">&nbsp;&nbsp;{$ENDIF};</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;netapi32lib = &#39;netapi32.dll&#39;;</div><div class="code_line">&nbsp;&nbsp;NERR_Success = NO_ERROR;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;// Структура для получения информации о рабочей станции</div><div class="code_line">&nbsp;&nbsp;PWkstaInfo100 = ^TWkstaInfo100;</div><div class="code_line">&nbsp;&nbsp;TWkstaInfo100 = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;wki100_platform_id &nbsp;: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;wki100_computername : PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;wki100_langroup &nbsp; &nbsp; : PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;wki100_ver_major &nbsp; &nbsp;: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;wki100_ver_minor &nbsp; &nbsp;: DWORD;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Итруктура для определения DNS имени контролера домена</div><div class="code_line">&nbsp;&nbsp;TDomainControllerInfoA = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;DomainControllerName: LPSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DomainControllerAddress: LPSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DomainControllerAddressType: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DomainGuid: TGUID;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DomainName: LPSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DnsForestName: LPSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Flags: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DcSiteName: LPSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ClientSiteName: LPSTR;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;PDomainControllerInfoA = ^TDomainControllerInfoA;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Структура для отображения пользователей</div><div class="code_line">&nbsp;&nbsp;PNetDisplayUser = ^TNetDisplayUser;</div><div class="code_line">&nbsp;&nbsp;TNetDisplayUser = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri1_name: LPWSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri1_comment: LPWSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri1_flags: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri1_full_name: LPWSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri1_user_id: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri1_next_index: DWORD;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Структура для отображения рабочих станций</div><div class="code_line">&nbsp;&nbsp;PNetDisplayMachine = ^TNetDisplayMachine;</div><div class="code_line">&nbsp;&nbsp;TNetDisplayMachine = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri2_name: LPWSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri2_comment: LPWSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri2_flags: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri2_user_id: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usri2_next_index: DWORD;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Структура для отображения групп</div><div class="code_line">&nbsp;&nbsp;PNetDisplayGroup = ^TNetDisplayGroup;</div><div class="code_line">&nbsp;&nbsp;TNetDisplayGroup = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;grpi3_name: LPWSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;grpi3_comment: LPWSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;grpi3_group_id: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;grpi3_attributes: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;grpi3_next_index: DWORD;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Структура для отображения пользователей принадлежащих группе</div><div class="code_line">&nbsp;&nbsp;// или групп в которые входит пользователь</div><div class="code_line">&nbsp;&nbsp;PGroupUsersInfo0 = ^TGroupUsersInfo0;</div><div class="code_line">&nbsp;&nbsp;TGroupUsersInfo0 = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;grui0_name: LPWSTR;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TfrmDomainInfo = class(TForm)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Button1: TButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gbCurrent: TGroupBox;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gbDomainResList: TGroupBox;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ledCompName: TLabeledEdit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ledUserName: TLabeledEdit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ledDomainName: TLabeledEdit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ledControllerName: TLabeledEdit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lvUsers: TListView;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gbInfo: TGroupBox;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lbInfo: TListBox;</div><div class="code_line">&nbsp;&nbsp; &nbsp;VSplitter: TSplitter;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pcRes: TPageControl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TabSheet1: TTabSheet;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TabSheet2: TTabSheet;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TabSheet3: TTabSheet;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lvWorkStation: TListView;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lvGroups: TListView;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Label1: TLabel;</div><div class="code_line">&nbsp;&nbsp; &nbsp;memTrustedDomains: TMemo;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ledDNSName: TLabeledEdit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormCreate(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure lvGroupsClick(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;CurrentDomainName: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetCurrentUserName: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetCurrentComputerName: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetDomainController(const DomainName: String): String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetDNSDomainName(const DomainName: String): String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function EnumAllTrustedDomains: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function EnumAllUsers: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function EnumAllGroups: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function EnumAllWorkStation: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetSID(const SecureObject: String): String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetAllGroupUsers(const GroupName: String): Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetAllUserGroups(const UserName: String): Boolean;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Функции которые предоставят нам возможность получения информации</div><div class="code_line">&nbsp;&nbsp;function NetApiBufferFree(Buffer: Pointer): DWORD; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;external netapi32lib;</div><div class="code_line">&nbsp;&nbsp;function NetWkstaGetInfo(ServerName: PWideChar; Level: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Bufptr: Pointer): DWORD; stdcall; external netapi32lib;</div><div class="code_line">&nbsp;&nbsp;function NetGetDCName(ServerName: PWideChar; DomainName: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var Bufptr: PWideChar): DWORD; stdcall; external netapi32lib;</div><div class="code_line">&nbsp;&nbsp;function DsGetDcName(ComputerName, DomainName: PChar; DomainGuid: PGUID;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SiteName: PChar; Flags: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var DomainControllerInfo: PDomainControllerInfoA): DWORD; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;external netapi32lib name &#39;DsGetDcNameA&#39;;</div><div class="code_line">&nbsp;&nbsp;function NetQueryDisplayInformation(ServerName: PWideChar; Level: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Index: DWORD; EntriesRequested: DWORD; PreferredMaximumLength: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var ReturnedEntryCount: DWORD; SortedBuffer: Pointer): DWORD; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;external netapi32lib;</div><div class="code_line">&nbsp;&nbsp;function NetGroupGetUsers(ServerName: PWideChar; GroupName: PWideChar; Level: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var Bufptr: Pointer; PrefMaxLen: DWORD; var EntriesRead: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var TotalEntries: DWORD; ResumeHandle: PDWORD): DWORD; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;external netapi32lib;</div><div class="code_line">&nbsp;&nbsp;function NetUserGetGroups(ServerName: PWideChar; UserName: PWideChar; Level: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var Bufptr: Pointer; PrefMaxLen: DWORD; var EntriesRead: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var TotalEntries: DWORD): DWORD; stdcall; external netapi32lib;</div><div class="code_line">&nbsp;&nbsp;function NetEnumerateTrustedDomains(ServerName: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DomainNames: PWideChar): DWORD; stdcall; external netapi32lib;</div><div class="code_line">&nbsp;&nbsp;procedure ConvertSidToStringSid(SID: PSID; var StringSid: LPSTR); stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;external advapi32 name &#39;ConvertSidToStringSidA&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;frmDomainInfo: TfrmDomainInfo;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Данная функция получает информацию о всех группах присутствующих в домене</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.EnumAllGroups: Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Tmp, Info: PNetDisplayGroup;</div><div class="code_line">&nbsp;&nbsp;I, CurrIndex, EntriesRequest,</div><div class="code_line">&nbsp;&nbsp;PreferredMaximumLength,</div><div class="code_line">&nbsp;&nbsp;ReturnedEntryCount: Cardinal;</div><div class="code_line">&nbsp;&nbsp;Error: DWORD;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;CurrIndex := 0;</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;Info := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// NetQueryDisplayInformation возвращает информацию только о 100-а записях</div><div class="code_line">&nbsp;&nbsp; &nbsp;// для того чтобы получить всю информацию используется третий параметр,</div><div class="code_line">&nbsp;&nbsp; &nbsp;// передаваемый функции, который определяет с какой записи продолжать</div><div class="code_line">&nbsp;&nbsp; &nbsp;// вывод информации</div><div class="code_line">&nbsp;&nbsp; &nbsp;EntriesRequest := 100;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PreferredMaximumLength := EntriesRequest * SizeOf(TNetDisplayGroup);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReturnedEntryCount := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Для выполнения функции, в нее нужно передать DNS имя контролера домена</div><div class="code_line">&nbsp;&nbsp; &nbsp;// (или его IP адрес), с которого мы хочем получить информацию</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Для получения информации о группах используется структура NetDisplayGroup</div><div class="code_line">&nbsp;&nbsp; &nbsp;// и ее идентификатор 3 (тройка) во втором параметре</div><div class="code_line">&nbsp;&nbsp; &nbsp;Error := NetQueryDisplayInformation(StringToOleStr(ledControllerName.Text), 3, CurrIndex,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;EntriesRequest, PreferredMaximumLength, ReturnedEntryCount, @Info);</div><div class="code_line">&nbsp;&nbsp; &nbsp;// При безошибочном выполнении фунции будет результат либо</div><div class="code_line">&nbsp;&nbsp; &nbsp;// 1. NERR_Success - все записи возвращены</div><div class="code_line">&nbsp;&nbsp; &nbsp;// 2. ERROR_MORE_DATA - записи возвращены, но остались еще и нужно вызывать функцию повторно</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Error in [NERR_Success, ERROR_MORE_DATA] then</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Tmp := Info;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Выводим информацию которую вернула функция в структуру</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for I := 0 to ReturnedEntryCount - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;with lvGroups.Items.Add do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Caption := Tmp^.grpi3_name; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Имя группы</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SubItems.Add(Tmp^.grpi3_comment); &nbsp; &nbsp; // Комментарий</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SubItems.Add(GetSID(Caption)); &nbsp; &nbsp; &nbsp; &nbsp;// SID группы</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Запоминаем индекс с которым будем вызывать повторно функцию (если нужно)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CurrIndex := Tmp^.grpi3_next_index;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Inc(Tmp);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Чтобы небыло утечки ресурсов, освобождаем память занятую функцией под структуру</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;NetApiBufferFree(Info);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;// Если результат выполнения функции ERROR_MORE_DATA - вызываем функцию повторно</div><div class="code_line">&nbsp;&nbsp;until Error in [NERR_Success, ERROR_ACCESS_DENIED];</div><div class="code_line">&nbsp;&nbsp;// Ну и возвращаем результат всего что мы тут накодили</div><div class="code_line">&nbsp;&nbsp;Result := Error = NERR_Success;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Данная функция получает информацию о всех доверенных доменах</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.EnumAllTrustedDomains: Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Tmp, DomainList: PWideChar;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;// Используем недокументированную функцию NetEnumerateTrustedDomains</div><div class="code_line">&nbsp;&nbsp;// (только не пойму, с какого перепуга она не документирована?)</div><div class="code_line">&nbsp;&nbsp;// Тут все очень просто, на вход имя контролера домена, ны выход - список доверенных доменов</div><div class="code_line">&nbsp;&nbsp;Result := NetEnumerateTrustedDomains(StringToOleStr(ledControllerName.Text),</div><div class="code_line">&nbsp;&nbsp; &nbsp;@DomainList) = NERR_Success;</div><div class="code_line">&nbsp;&nbsp;// Если вызов функции успешен, то...</div><div class="code_line">&nbsp;&nbsp;if Result then</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp := DomainList;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while Length(Tmp) &#62; 0 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;memTrustedDomains.Lines.Add(Tmp); // Банально выводим список на экран</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Tmp := Tmp + Length(Tmp) + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Не забываем про память</div><div class="code_line">&nbsp;&nbsp; &nbsp;NetApiBufferFree(DomainList);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Данная функция получает информацию о всех пользователях присутствующих в домене</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.EnumAllUsers: Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Tmp, Info: PNetDisplayUser;</div><div class="code_line">&nbsp;&nbsp;I, CurrIndex, EntriesRequest,</div><div class="code_line">&nbsp;&nbsp;PreferredMaximumLength,</div><div class="code_line">&nbsp;&nbsp;ReturnedEntryCount: Cardinal;</div><div class="code_line">&nbsp;&nbsp;Error: DWORD;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;CurrIndex := 0;</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;Info := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// NetQueryDisplayInformation возвращает информацию только о 100-а записях</div><div class="code_line">&nbsp;&nbsp; &nbsp;// для того чтобы получить всю информацию используется третий параметр,</div><div class="code_line">&nbsp;&nbsp; &nbsp;// передаваемый функции, который определяет с какой записи продолжать</div><div class="code_line">&nbsp;&nbsp; &nbsp;// вывод информации</div><div class="code_line">&nbsp;&nbsp; &nbsp;EntriesRequest := 100;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PreferredMaximumLength := EntriesRequest * SizeOf(TNetDisplayUser);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReturnedEntryCount := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Для выполнения функции, в нее нужно передать DNS имя контролера домена</div><div class="code_line">&nbsp;&nbsp; &nbsp;// (или его IP адрес), с которого мы хочем получить информацию</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Для получения информации о пользователях используется структура NetDisplayUser</div><div class="code_line">&nbsp;&nbsp; &nbsp;// и ее идентификатор 1 (единица) во втором параметре</div><div class="code_line">&nbsp;&nbsp; &nbsp;Error := NetQueryDisplayInformation(StringToOleStr(ledControllerName.Text), 1, CurrIndex,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;EntriesRequest, PreferredMaximumLength, ReturnedEntryCount, @Info);</div><div class="code_line">&nbsp;&nbsp; &nbsp;// При безошибочном выполнении фунции будет результат либо</div><div class="code_line">&nbsp;&nbsp; &nbsp;// 1. NERR_Success - все записи возвращены</div><div class="code_line">&nbsp;&nbsp; &nbsp;// 2. ERROR_MORE_DATA - записи возвращены, но остались еще и нужно вызывать функцию повторно</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Error in [NERR_Success, ERROR_MORE_DATA] then</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Tmp := Info;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Выводим информацию которую вернула функция в структуру</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for I := 0 to ReturnedEntryCount - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;with lvUsers.Items.Add do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Caption := Tmp^.usri1_name; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Имя пользователя</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SubItems.Add(Tmp^.usri1_comment); &nbsp; &nbsp;// Комментарий</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SubItems.Add(GetSID(Caption)); &nbsp; &nbsp; &nbsp; // Его SID</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Запоминаем индекс с которым будем вызывать повторно функцию (если нужно)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CurrIndex := Tmp^.usri1_next_index;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Inc(Tmp);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Грохаем выделенную при вызове NetQueryDisplayInformation память</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;NetApiBufferFree(Info);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;// Если результат выполнения функции ERROR_MORE_DATA</div><div class="code_line">&nbsp;&nbsp;// (т.е. есть еще данные) - вызываем функцию повторно</div><div class="code_line">&nbsp;&nbsp;until Error in [NERR_Success, ERROR_ACCESS_DENIED];</div><div class="code_line">&nbsp;&nbsp;// Ну и возвращаем результат всего что мы тут накодили</div><div class="code_line">&nbsp;&nbsp;Result := Error = NERR_Success;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Данная функция получает информацию о всех рабочих станциях присутствующих в домене</div><div class="code_line">// &nbsp;Вообщето так делать немного не верно, дело в том что рабочие станции могут</div><div class="code_line">// &nbsp;присутствовать в списке не только те, которые завел сисадмин (но для демки сойдет и так)</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.EnumAllWorkStation: Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Tmp, Info: PNetDisplayMachine;</div><div class="code_line">&nbsp;&nbsp;I, CurrIndex, EntriesRequest,</div><div class="code_line">&nbsp;&nbsp;PreferredMaximumLength,</div><div class="code_line">&nbsp;&nbsp;ReturnedEntryCount: Cardinal;</div><div class="code_line">&nbsp;&nbsp;Error: DWORD;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;CurrIndex := 0;</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;Info := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// NetQueryDisplayInformation возвращает информацию только о 100-а записях</div><div class="code_line">&nbsp;&nbsp; &nbsp;// для того чтобы получить всю информацию используется третий параметр,</div><div class="code_line">&nbsp;&nbsp; &nbsp;// передаваемый функции, который определяет с какой записи продолжать</div><div class="code_line">&nbsp;&nbsp; &nbsp;// вывод информации</div><div class="code_line">&nbsp;&nbsp; &nbsp;EntriesRequest := 100;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PreferredMaximumLength := EntriesRequest * SizeOf(TNetDisplayMachine);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReturnedEntryCount := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Для выполнения функции, в нее нужно передать DNS имя контролера домена</div><div class="code_line">&nbsp;&nbsp; &nbsp;// (или его IP адрес), с которого мы хочем получить информацию</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Для получения информации о рабочих станциях используется структура NetDisplayMachine</div><div class="code_line">&nbsp;&nbsp; &nbsp;// и ее идентификатор 2 (двойка) во втором параметре</div><div class="code_line">&nbsp;&nbsp; &nbsp;Error := NetQueryDisplayInformation(StringToOleStr(ledControllerName.Text), 2, CurrIndex,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;EntriesRequest, PreferredMaximumLength, ReturnedEntryCount, @Info);</div><div class="code_line">&nbsp;&nbsp; &nbsp;// При безошибочном выполнении фунции будет результат либо</div><div class="code_line">&nbsp;&nbsp; &nbsp;// 1. NERR_Success - все записи возвращены</div><div class="code_line">&nbsp;&nbsp; &nbsp;// 2. ERROR_MORE_DATA - записи возвращены, но остались еще и нужно вызывать функцию повторно</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Error in [NERR_Success, ERROR_MORE_DATA] then</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Tmp := Info;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Выводим информацию которую вернула функция в структуру</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for I := 0 to ReturnedEntryCount - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;with lvWorkStation.Items.Add do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Caption := Tmp^.usri2_name; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Имя рабочей станции</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SubItems.Add(Tmp^.usri2_comment); &nbsp; &nbsp;// Комментарий</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SubItems.Add(GetSID(Caption)); &nbsp; &nbsp; &nbsp; // Её SID</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Запоминаем индекс с которым будем вызывать повторно функцию (если нужно)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CurrIndex := Tmp^.usri2_next_index;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Inc(Tmp);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Дабы небыло утечек</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;NetApiBufferFree(Info);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;// Если результат выполнения функции ERROR_MORE_DATA</div><div class="code_line">&nbsp;&nbsp;// (т.е. есть еще данные) - вызываем функцию повторно</div><div class="code_line">&nbsp;&nbsp;until Error in [NERR_Success, ERROR_ACCESS_DENIED];</div><div class="code_line">&nbsp;&nbsp;// Ну и возвращаем результат всего что мы тут накодили</div><div class="code_line">&nbsp;&nbsp;Result := Error = NERR_Success;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmDomainInfo.FormCreate(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;// Просто вызываем все функции подряд (не делал проверок на результат функций)</div><div class="code_line">&nbsp;&nbsp;ledUserName.Text := GetCurrentUserName;</div><div class="code_line">&nbsp;&nbsp;ledCompName.Text := GetCurrentComputerName;</div><div class="code_line">&nbsp;&nbsp;ledDomainName.Text := CurrentDomainName;</div><div class="code_line">&nbsp;&nbsp;ledControllerName.Text := GetDomainController(CurrentDomainName);</div><div class="code_line">&nbsp;&nbsp;// Единственно, если нет контролера домена, то дальше определять бесполезно</div><div class="code_line">&nbsp;&nbsp;if ledControllerName.Text = &#39;&#39; then Exit;</div><div class="code_line">&nbsp;&nbsp;ledDNSName.Text := GetDNSDomainName(CurrentDomainName);</div><div class="code_line">&nbsp;&nbsp;EnumAllTrustedDomains;</div><div class="code_line">&nbsp;&nbsp;EnumAllUsers;</div><div class="code_line">&nbsp;&nbsp;EnumAllWorkStation;</div><div class="code_line">&nbsp;&nbsp;EnumAllGroups;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Довольно простая функция, возвращает только имена пользователей принадлезжащих группе</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.GetAllGroupUsers(const GroupName: String): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Tmp, Info: PGroupUsersInfo0;</div><div class="code_line">&nbsp;&nbsp;PrefMaxLen, EntriesRead,</div><div class="code_line">&nbsp;&nbsp;TotalEntries, ResumeHandle: DWORD;</div><div class="code_line">&nbsp;&nbsp;I: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;// На вход подается список который мы будем заполнять</div><div class="code_line">&nbsp;&nbsp;lbInfo.Items.Clear;</div><div class="code_line">&nbsp;&nbsp;// Обязательная инициализация</div><div class="code_line">&nbsp;&nbsp;ResumeHandle := 0;</div><div class="code_line">&nbsp;&nbsp;PrefMaxLen := DWORD(-1);</div><div class="code_line">&nbsp;&nbsp;// Выполняем</div><div class="code_line">&nbsp;&nbsp;Result := NetGroupGetUsers(StringToOleStr(ledControllerName.Text),</div><div class="code_line">&nbsp;&nbsp; &nbsp;StringToOleStr(GroupName), 0, Pointer(Info), PrefMaxLen,</div><div class="code_line">&nbsp;&nbsp; &nbsp;EntriesRead, TotalEntries, @ResumeHandle) = NERR_Success;</div><div class="code_line">&nbsp;&nbsp;// Смотрим результат...</div><div class="code_line">&nbsp;&nbsp;if Result then</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp := Info;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for I := 0 to EntriesRead - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lbInfo.Items.Add(Tmp^.grui0_name); // Банально выводим результат из структуры</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Inc(Tmp);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Не забываем, ибо может быть склероз :)</div><div class="code_line">&nbsp;&nbsp; &nbsp;NetApiBufferFree(Info);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Аналогично предыдущей функции (заметьте - структура таже)</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.GetAllUserGroups(const UserName: String): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Tmp, Info: PGroupUsersInfo0;</div><div class="code_line">&nbsp;&nbsp;PrefMaxLen, EntriesRead,</div><div class="code_line">&nbsp;&nbsp;TotalEntries: DWORD;</div><div class="code_line">&nbsp;&nbsp;I: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;lbInfo.Items.Clear;</div><div class="code_line">&nbsp;&nbsp;PrefMaxLen := DWORD(-1);</div><div class="code_line">&nbsp;&nbsp;Result := NetUserGetGroups(StringToOleStr(ledControllerName.Text),</div><div class="code_line">&nbsp;&nbsp; &nbsp;StringToOleStr(UserName), 0, Pointer(Info), PrefMaxLen,</div><div class="code_line">&nbsp;&nbsp; &nbsp;EntriesRead, TotalEntries) = NERR_Success;</div><div class="code_line">&nbsp;&nbsp;if Result then</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp := Info;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for I := 0 to EntriesRead - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lbInfo.Items.Add(Tmp^.grui0_name);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Inc(Tmp);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;NetApiBufferFree(Info);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Получаем имя компьютера и имя домена</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.GetCurrentComputerName: String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Info: PWkstaInfo100;</div><div class="code_line">&nbsp;&nbsp;Error: DWORD;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;// А для этого мы воспользуемся следующей функцией</div><div class="code_line">&nbsp;&nbsp;Error := NetWkstaGetInfo(nil, 100, @Info);</div><div class="code_line">&nbsp;&nbsp;if Error &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;raise Exception.Create(SysErrorMessage(Error));</div><div class="code_line">&nbsp;&nbsp;// Как видно, вызов который возвращает обычную структуру, из которой и прочитаем, все что нужно :)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// А именно имя компьютера в сети</div><div class="code_line">&nbsp;&nbsp;Result := Info^.wki100_computername;</div><div class="code_line">&nbsp;&nbsp;// И где он находиться</div><div class="code_line">&nbsp;&nbsp;CurrentDomainName := info^.wki100_langroup;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Без комментариев</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.GetCurrentUserName: String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Size: Cardinal;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Size := MAXCHAR;</div><div class="code_line">&nbsp;&nbsp;SetLength(Result, Size);</div><div class="code_line">&nbsp;&nbsp;GetUserName(PChar(Result), Size);</div><div class="code_line">&nbsp;&nbsp;SetLength(Result, Size);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Получаем DNS имя контроллера домена</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.GetDNSDomainName(const DomainName: String): String;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;DS_IS_FLAT_NAME = {text}010000;</div><div class="code_line">&nbsp;&nbsp;DS_RETURN_DNS_NAME &nbsp;= 000000;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;GUID: PGUID;</div><div class="code_line">&nbsp;&nbsp;DomainControllerInfo: PDomainControllerInfoA;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;GUID := nil;</div><div class="code_line">&nbsp;&nbsp;// Для большинства операций нам потребуется IP адрес контроллера домена</div><div class="code_line">&nbsp;&nbsp;// или его DNS имя, которое мы получим вот так:</div><div class="code_line">&nbsp;&nbsp;if DsGetDcName(nil, PChar(CurrentDomainName), GUID, nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp;DS_IS_FLAT_NAME or DS_RETURN_DNS_NAME, DomainControllerInfo) = NERR_Success then</div><div class="code_line">&nbsp;&nbsp;// Параметры которые мы передаем означают:</div><div class="code_line">&nbsp;&nbsp;// DS_IS_FLAT_NAME - передаем просто имя домена</div><div class="code_line">&nbsp;&nbsp;// DS_RETURN_DNS_NAME - ждем получения DNS имени</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := DomainControllerInfo^.DomainControllerName; // Результат собсно тут...</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Склероз это болезнь, ее нужно лечить...</div><div class="code_line">&nbsp;&nbsp; &nbsp;NetApiBufferFree(DomainControllerInfo);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Ну тут без комментариев - просто получаем имя контроллера домена</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.GetDomainController(const DomainName: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Domain: WideString;</div><div class="code_line">&nbsp;&nbsp;Server: PWideChar;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Domain := StringToOleStr(DomainName);</div><div class="code_line">&nbsp;&nbsp;if NetGetDCName(nil, @Domain[1], Server) = NERR_Success then</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := Server;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;NetApiBufferFree(Server);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Не знаю зачем добавил это, ну раз добавил - получение SID объекта</div><div class="code_line">// &nbsp;Без комментариев...</div><div class="code_line">// =============================================================================</div><div class="code_line">function TfrmDomainInfo.GetSID(const SecureObject: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;SID: PSID;</div><div class="code_line">&nbsp;&nbsp;StringSid: PChar;</div><div class="code_line">&nbsp;&nbsp;ReferencedDomain: String;</div><div class="code_line">&nbsp;&nbsp;cbSid, cbReferencedDomain:DWORD;</div><div class="code_line">&nbsp;&nbsp;peUse: SID_NAME_USE;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;cbSID := 128;</div><div class="code_line">&nbsp;&nbsp;cbReferencedDomain := 16;</div><div class="code_line">&nbsp;&nbsp;GetMem(SID, cbSid);</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(ReferencedDomain, cbReferencedDomain);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if LookupAccountName(PChar(ledDNSName.Text),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;PChar(SecureObject), SID, cbSid,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;@ReferencedDomain[1], cbReferencedDomain, peUse) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ConvertSidToStringSid(SID, StringSid);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := StringSid;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;FreeMem(SID);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmDomainInfo.lvGroupsClick(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Value: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if (Sender as TListView).Selected = nil then Exit;</div><div class="code_line">&nbsp;&nbsp;Value := (Sender as TListView).Selected.Caption;</div><div class="code_line">&nbsp;&nbsp;case (Sender as TListView).Tag of</div><div class="code_line">&nbsp;&nbsp; &nbsp;0:</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;gbInfo.Caption := Format(&#39;Группы в которые входит пользователь &quot;%s&quot;&#39;, [Value]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GetAllUserGroups(Value);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;1:</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;gbInfo.Caption := Format(&#39;Группы в которые входит рабочая станция &quot;%s&quot;&#39;, [Value]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GetAllUserGroups(Value);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;2:</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;gbInfo.Caption := Format(&#39;Объекты входящие в группу &quot;%s&quot;&#39;, [Value]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GetAllGroupUsers(Value);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Проект также доступен по адресу: <a class='tag-url' href='http://rouse.front.ru/domaininfo.zip' target='_blank'>http://rouse.front.ru/domaininfo.zip</a>]]></description>
        <author>s-mike</author>
        <category>Интернет, сети, протоколы</category>
      </item>
	
      </channel>
      </rss>
	