![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Имя домена
Чапаев © (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.