2009-05-18 3 views
4

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

Спасибо.

EDIT: проблема связана с аутентификацией DCOM, поэтому мне нужно знать домен, чтобы использовать DOMAIN \ USERNAME в случае PDC или COMPUTER \ USERNAME, если мне нужно использовать локальную базу данных аутентификации компьютера.

+1

C++ и WinAPI теги еще отредактированный сделать не программирование связанных? –

+1

Кажется, что это связано с программированием, просто очень простой вопрос, который может быть ошибочно принят за не связанное с программированием. –

+0

Мне нужно получить имя с помощью winapi, так что это связано с программированием.Я думаю: s –

ответ

6

Я хотел бы использовать 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... 
} 
+0

Я собираюсь попробовать это. –

2

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

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

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

2

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

sv101_type

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

(...)

SV_TYPE_DOMAIN_CTRL: Первичный контроллер домена.

+0

Мне нужно знать, является ли компьютер PDC и именем домена. Благодарю. –

0

Наконец я использовал этот код. Он работает на локальной машине, выполненной удаленно. 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); 
    } 
} 

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

12

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

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

DWORD bufSize = MAX_PATH; 
TCHAR domainNameBuf[ MAX_PATH ]; 

GetComputerNameEx(ComputerNameDnsDomain, domainNameBuf, &bufSize); 
Смежные вопросы