Получить доменное имя компьютера из Windows API - PullRequest
4 голосов
/ 18 мая 2009

В моем приложении мне нужно знать, является ли компьютер основным контроллером домена в домене, поэтому мне нужно знать домен компьютера для вызова функции NetGetDCName.

Спасибо.

РЕДАКТИРОВАТЬ: проблема связана с аутентификацией DCOM, поэтому мне нужно знать домен для использования DOMAIN \ USERNAME в случае PDC или COMPUTER \ USERNAME, если мне нужно использовать локальную базу данных аутентификации компьютера.

Ответы [ 6 ]

13 голосов
/ 01 декабря 2012

Функция NetWkstaGetInfo() возвращает имя домена или рабочую группу компьютера и, следовательно, не является надежным способом определить, является ли компьютер членом домена.

Поможет функция GetComputerNameEx(), используемая с параметром ComputerNameDnsDomain, как показано ниже. Это вернет пустую строку, если компьютер находится в рабочей группе, или DNS-имя домена:

DWORD bufSize = MAX_PATH;
TCHAR domainNameBuf[ MAX_PATH ];

GetComputerNameEx( ComputerNameDnsDomain, domainNameBuf, &bufSize );
7 голосов
/ 18 мая 2009

Я хотел бы рассмотреть вопрос об использовании NetWkstaGetInfo () и передать имя локального компьютера в качестве этого первого параметра.

#include <Lmwksta.h>
#include <StrSafe.h>

WCHAR domain_name[256];
WKSTA_INFO_100 info = {0};
if (NERR_Success == NetWkstaGetInfo(L"THIS-COMPUTER", 100, &info) && 
    SUCCEEDED(StringCchCopy(domain_name, ARRAYSIZE(domain_name), info.wki100_langroup))) {
    // use domain_name here...
}
2 голосов
/ 18 мая 2009

Если вы просто хотите узнать, является ли машина, на которой работает код, основным контроллером домена, я думаю, что ваш лучший вариант - NetServerGetInfo . Если вы передадите 101 в качестве параметра level , он вернет структуру SERVER_INFO_101 . Затем найдите его sv101_type member:

sv101_type

Тип программного обеспечения, на котором работает компьютер. Этот член может иметь одно из следующих значений.

(...)

SV_TYPE_DOMAIN_CTRL: основной контроллер домена.

2 голосов
/ 18 мая 2009

Вы можете использовать функцию NetWkstaGetInfo , чтобы сделать это.

Если в качестве имени компьютера вы передадите null, он вернет информацию о локальном компьютере.

Он вернет экземпляр WKSTA_INFO_100, который включает имя домена.

1 голос
/ 05 августа 2018

Существует специальная функция для определения статуса соединения рабочей станции. https://docs.microsoft.com/en-gb/windows/desktop/api/lmjoin/nf-lmjoin-netgetjoininformation

Существует 3 статуса, статус «Присоединен» к рабочей группе (старая добрая сеть Windows 3.0) == NetSetupWorkgroupName или статус домена == NetSetupDomainName или неподключенный (автономный) статус == NetSetupUnjoined

Так что, если вы знаете это, вы можете надежно вызывать соответствующие требуемые функции.

0 голосов
/ 19 мая 2009

Наконец-то я использовал этот код. Работает на локальной машине, выполняется удаленно. NStatus выдает ошибку ACCESS_DENIED.

NET_API_STATUS nStatus;
TOleString oleServerName=strServerName.c_str();
DWORD dwLevel=101;
LPSERVER_INFO_101 pBufServer=NULL;
LPWKSTA_INFO_100 pBufWksta = NULL;

nStatus=NetServerGetInfo(oleServerName, dwLevel,
    (LPBYTE*)&pBufServer);
if(nStatus==NERR_Success &&
    (pBufServer->sv101_type & SV_TYPE_DOMAIN_CTRL))
{
    dwLevel=100;
    nStatus=NetWkstaGetInfo(oleServerName, 100,
        (LPBYTE*)&pBufWksta);

    if(nStatus==NERR_Success)
    {
        AnsiString strDomain(pBufWksta->wki100_langroup);

        m_pgServerConnection->SetDomain(strDomain);
    }
}

Спасибо всем:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...