Конференция "Сети" » Как узнать полное имя домена? [WinXP]
 
  • -=Le][=- (24.08.08 16:52) [0]
    С помощью функций WNetOpenEnum и WNetEnumResource возможно получить список доменов, точнее список их псевдонимов. А как узнать полное имя домена? Тоесть вместо mydomian нужно получить mydomian.com.ru (в моем случае mydomian.local).
  • -=Le][=- (25.08.08 18:49) [1]
    Есть у меня сеть (на которой прогу тестю) с двух доменов.
    Вобщем с помощью функций WNetOpenEnum и WNetEnumResource получаю список псевдонимов: MyDomian1, MyDomian2.
    А с помощью функции NetUserEnum можно получить список пользователей, в первый параметр передав имя домена. Но не того что возвращают функции WNetOpenEnum и WNetEnumResource, а полное имя: domian1.com.ru, domian2.local.
    Хотя юзвери и пишутся как MyDomian1\UserName но все они принадлежат домену domian1.com.ru, а MyDomian2\UserName соответственно domian2.local.
    Немогу найти функции для преобразования псевдонима в полное имя.
  • clickmaker © (26.08.08 13:02) [2]
    gethostbyaddr()?
  • -=Le][=- (26.08.08 15:52) [3]

    > gethostbyaddr()?

    1) Не пошло! Говорит ерорр 10093.
    2) Это ж winsock! А у меня WinAPI!

    У меня не инет, а локалка! Два контроллера домена и машины в доменах!
    Задача:
    1) Показать список доменов (сделал)
    2) По указанному имени домена вывести список пользователей (вывести список могу но не по указанному, так как в пункте 1 получаю псевдонимы (сокращенные названия домена, то что видим в сетевом окружении), а нужно полное имя).
    Так что имя машины с DC здесь не причем. Может через Active Directory чтото можно достать?
  • Вариант (27.08.08 06:33) [4]

    > -=Le][=-   (26.08.08 15:52) [3]

    Вызови сперва WSAStartup, а потом уже что-либо из Winsock.
    И кстати, если в google поискать по твоему вопросу - тоже будет куча варинатов.
  • -=Le][=- (27.08.08 11:48) [5]

    > И кстати, если в google поискать по твоему вопросу - тоже
    > будет куча варинатов.

    Ага! Если упомянешь в запросе слово домен выдает кучу ссылок на купи/продай домен!

    > а потом уже что-либо из Winsock.

    А без Winsock никак нельзя?
  • Вариант (27.08.08 12:32) [6]

    > -=Le][=-   (27.08.08 11:48) [5]

    http://forum.sources.ru/index.php?showtopic=84259

    Обрати внимание на функцию DsGetDcName.....
  • Сергей М. © (27.08.08 13:02) [7]

    > У меня не инет, а локалка


    А какая разница ?
    Или ты хочешь сказать, что на TCP/IP в твоей "локалке" наложено табу ?
  • McFly (26.08.09 07:30) [8]
    Пацаны, я себе делал, выложу сюда :

    function TMainForm.GetCurrentUserAndDomain(var AUser,ADomain:String):Boolean;
    type
     _TOKEN_USER = record
      User:TSIDAndAttributes;
      end;
     TTokenUser = _TOKEN_USER;
     TOKEN_USER = _TOKEN_USER;
     PTokenUser = ^TTokenUser;

    var hToken:THandle; ptiUser:PTokenUser; cbti:Dword; snu:SID_NAME_USE;
    pcchUser,pcchDomain:Dword;
    szUser,szDomain:PChar;
    begin

    result:=false;
    hToken:=0;
    ptiUser:=nil;
    szUser:=nil;
    szDomain:=nil;
    cbti:=0;
    try
    // Получаем маркёр доступа вызывающего потока.
    if (not OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, hToken)) then
     begin
     if (GetLastError() <> ERROR_NO_TOKEN) then
      begin
      MainDt.HaveError('Ошибка открытия токена.',0,true);
      exit;
      end;
     end;
    // Если маркёра потока не существует, то запрашиваем маркёр процесса.
    if (not OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hToken)) then
     begin
     MainDt.HaveError('Ошибка открытия токена.',0,true);
     exit;
     end;
    // Получаем размер информации о пользователе в маркёре.
    if (GetTokenInformation(hToken, TokenUser, nil, 0, cbti)) then exit
    else
     begin
     // Если длина буфера равна нулю, то ошибка.
     if (GetLastError()<>ERROR_INSUFFICIENT_BUFFER) then exit;
     // Распределяем буфер для информации о пользователе в маркёре.
     ptiUser:=PTokenUser(HeapAlloc(GetProcessHeap(), 0, cbti));
     if (ptiUser=nil) then exit;

     // Получаем информацию о пользователе из маркёра.
     if (not GetTokenInformation(hToken, TokenUser, ptiUser, cbti, cbti)) then exit;
     // Получаем имя пользователя и имя домена по пользовательскому SID.
     pcchUser:=1024;
     szUser:=PChar(AllocMem(pcchUser));
     pcchDomain:=1024;
     szDomain:=PChar(AllocMem(pcchDomain));
     if (not LookupAccountSid(nil, ptiUser.User.Sid, szUser, pcchUser, szDomain, pcchDomain,snu)) then
      begin
      FreeMem(szUser);FreeMem(szDomain);
      exit;
      end;
     AUSer:=StrPas(szUser);
     ADomain:=StrPas(szDomain);
     result:=true;
     end;
    except on E:Exception do
    begin
    MainDt.HaveError(E.Message,0); exit;
    end; end;
    // Освобождаем ресурсы.
    if (hToken<>0) then CloseHandle(hToken);
    if (ptiUser<>nil) then HeapFree(GetProcessHeap(), 0, ptiUser);
    if szDomain<>nil then FreeMem(szDomain);
    if szUser<>nil then FreeMem(szUser);
    end;

    По существу : Вместо MainDt.HaveError воткните MessageBox.
    Ну и - кому надо, тот разберется.
 
Конференция "Сети" » Как узнать полное имя домена? [WinXP]
Есть новые Нет новых   [134437   +29][b:0][p:0]