Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Имя домена


Чапаев ©   (2006-08-25 15:03:00) 

Как получить имя домена, в который в данный момент залогинен пользователь? Как получить список доступных доменов?


Rouse_   (2006-10-03 15:03:00) [1]


> А почему в MSDN такой функции не вижу?

А ты ее ручками можешь написать: LsaOpenPolicy с флагом POLICY_VIEW_LOCAL_INFORMATION + LsaQueryInformationPolicy со вторым параметром PolicyPrimaryDomainInformation и получишь структуру типа:
typedef struct _POLICY_PRIMARY_DOMAIN_INFO {  
 LSA_UNICODE_STRING Name;  
 PSID Sid;
} POLICY_PRIMARY_DOMAIN_INFO, *PPOLICY_PRIMARY_DOMAIN_INFO;


Игорь Шевченко   (2006-10-03 14:51:00) [2]

clickmaker ©   (03.10.06 14:38) [17]

Ошибся наверное, когда писал. Бывает :)


clickmaker   (2006-10-03 14:38:00) [3]


> function NetApiNotImplemented : Integer;
> begin
>  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
>  Result := ERROR_PROC_NOT_FOUND;
> end;

Хм... а зачем 2 разных кода?


Игорь Шевченко   (2006-10-03 14:34:00) [4]

Чапаев ©   (03.10.06 14:29) [15]


> А почему в MSDN такой функции не вижу?


NtCreateNamedPipeFile ты там тоже не видишь, однако ж она есть.

unit HSNetApi;

interface
uses
 Windows;

function NetApiBufferFree (lpBuffer : Pointer) : Integer; stdcall;
function NetpGetDomainName (lpBuffer : Pointer) : Integer; stdcall;
function NetpGetComputerName (lpBuffer : Pointer) : Integer; stdcall;

implementation
uses
 SysUtils;

{ NETAPI32.DLL functions }
type
 TNetApiBufferFree =
   function (lpBuffer : Pointer) : Integer; stdcall;
 TNetpGetDomainName =
   function (lpBuffer : Pointer) : Integer; stdcall;
 TNetpGetComputerName =
   function (lpBuffer : Pointer) : Integer; stdcall;

const
 netapidllname = 'netapi32.dll';

var
 NetApiDllHandle: THandle;
 _NetApiBufferFree : TNetApiBufferFree;
 _NetpGetDomainName : TNetpGetDomainName;
 _NetpGetComputerName : TNetpGetComputerName;

function InitNetApi : Boolean;
begin
 if NetApiDllHandle = 0 then
   if Win32Platform = VER_PLATFORM_WIN32_NT then begin
     NetApiDllHandle := LoadLibrary(NetApidllname);
     if NetApiDllHandle <> 0 then begin
       @_NetApiBufferFree := GetProcAddress(NetApiDllHandle,
         'NetApiBufferFree');
       @_NetpGetDomainName := GetProcAddress(NetApiDllHandle,
         'NetpGetDomainName');
       @_NetpGetComputerName := GetProcAddress(NetApiDllHandle,
         'NetpGetComputerName');
     end;
   end;
 Result := (NetApiDllHandle <> 0);
end;

function NetApiNotImplemented : Integer;
begin
 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
 Result := ERROR_PROC_NOT_FOUND;
end;

function NetApiBufferFree (lpBuffer : Pointer) : Integer; stdcall;
begin
 if InitNetApi and Assigned(_NetApiBufferFree) then
   Result := _NetApiBufferFree(lpBuffer)
 else
   Result := NetApiNotImplemented;
end;

function NetpGetDomainName (lpBuffer : Pointer) : Integer; stdcall;
begin
 if InitNetApi and Assigned(_NetpGetDomainName) then
   Result := _NetpGetDomainName(lpBuffer)
 else
   Result := NetApiNotImplemented;
end;

function NetpGetComputerName (lpBuffer : Pointer) : Integer; stdcall;
begin
 if InitNetApi and Assigned(_NetpGetComputerName) then
   Result := _NetpGetComputerName(lpBuffer)
 else
   Result := NetApiNotImplemented;
end;

initialization
finalization
 if NetApiDllHandle <> 0 then
   FreeLibrary(NetApiDllHandle);
end.


Чапаев   (2006-10-03 14:29:00) [5]

> [14] Игорь Шевченко ©   (03.10.06 13:52)

А почему в MSDN такой функции не вижу? Ни Net pGetDomainName, ни NetGetDomainName.


Игорь Шевченко   (2006-10-03 13:52:00) [6]

В NETAPI32.DLL есть масса интересных функций.

Например, для ответа на первый вопрос одна из функций так и называется:

NetpGetDomainName


Чапаев   (2006-10-03 12:47:00) [7]

> HKEY_CURRENT_USER\Volatile Environment - USERDNSDOMAIN

Понадобилось NetBIOS-имя. Прочёл DNS-имя, затем в HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DomainCache нашёл соответствие NetBIOS<->DNS. Насколько это идеологически правильно?


Чапаев   (2006-08-25 18:15:00) [8]

Хорошо... Заблокированные, в принципе, не нужны. Хотя и не помешают.


BiN   (2006-08-25 18:02:00) [9]


> Чапаев ©   (25.08.06 17:06) [9]
>
> > перечислить всех пользователей домена
>
> Первоначально собирался это делать с помощью NetUserEnum().
>  Сработало бы?

Прекрасно работает. Просто в качестве servername нужно указывать имя контроллера домена (см. NetGetDCName, DsGetDcName или NetGetAnyDCName)
Заблокированных тоже показывает.


Rouse_   (2006-08-25 17:54:00) [10]

NetUserEnum? Хм, не знаю не проверял... Наверное заблокированных бы не отобразило, хотя фиг знает, нужно проверять :)


Чапаев   (2006-08-25 17:06:00) [11]

> перечислить всех пользователей домена

Первоначально собирался это делать с помощью NetUserEnum(). Сработало бы?


Чапаев   (2006-08-25 17:05:00) [12]

> [6] Rouse_ ©   (25.08.06 16:44)

Спасибо. Заодно и решает следующий вопрос -- как перечислить всех пользователей домена. :-)


Чапаев   (2006-08-25 17:03:00) [13]

> а чем пункт 2) в [1] не устраивает?

Устраивает! И работает, что немаловажно. :-) Я просто сначала решил, что это второй вариант решения первого вопроса...


Rouse_   (2006-08-25 16:44:00) [14]

http://rouse.front.ru/domaininfo.zip
Там есть получение имени домена, контроллера домена, DNS имя и доверенных доменов.


BiN   (2006-08-25 16:30:00) [15]


> Чапаев ©   (25.08.06 16:21) [4]
>
>
> А насчёт перечисления доступных доменов есть идеи?
>

а чем пункт 2) в [1] не устраивает?


Чапаев   (2006-08-25 16:21:00) [16]

> Проще всего через GetUserNameEx

Точно, работает. Я просто с ней малость неправильно работал вначале, в результате психанул и задал вопрос в форум. :-)


> HKEY_CURRENT_USER\Volatile Environment - USERDNSDOMAIN

Спасибо, тоже хороший вариант.

А насчёт перечисления доступных доменов есть идеи?


clickmaker   (2006-08-25 16:02:00) [17]

HKEY_CURRENT_USER\Volatile Environment - USERDNSDOMAIN


Тфьу   (2006-08-25 15:22:00) [18]

Еще можно через ADO. Раньше так писал. К сожалению, сейчас не вспомню синтаксис.


BiN   (2006-08-25 15:18:00) [19]


> Чапаев ©   (25.08.06 15:03)  
>
> Как получить имя домена, в который в данный момент залогинен
> пользователь? Как получить список доступных доменов?


1) Проще всего через GetUserNameEx, а также можно через маркеры безопасности.
2) С грехом пополам через WNetEnumResource или же IDsBrowseDomainTree.


Наверх

Титульная страница Поиск, карта сайта Написать письмо