从Windows API获取计算机的域名

时间:2009-05-18 16:44:21

标签: c++ winapi

在我的应用程序中,我需要知道计算机是否是域的主域控制器,因此我需要知道计算机的域以调用NetGetDCName函数。

感谢。

编辑:问题与DCOM身份验证有关,因此如果需要使用计算机的本地身份验证数据库,我需要知道在PDC或COMPUTER \ USERNAME的情况下使用DOMAIN \ USERNAME的域。

6 个答案:

答案 0 :(得分:13)

NetWkstaGetInfo()函数返回计算机的域名或工作组,因此不是确定计算机是否为域成员的可靠方法。

GetComputerNameEx()函数将与ComputerNameDnsDomain参数一起使用,如下所示。如果计算机位于工作组中,则将返回空字符串,或域的DNS名称:

DWORD bufSize = MAX_PATH;
TCHAR domainNameBuf[ MAX_PATH ];

GetComputerNameEx( ComputerNameDnsDomain, domainNameBuf, &bufSize );

答案 1 :(得分:7)

我会考虑使用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 :(得分:2)

您可以使用NetWkstaGetInfo功能执行此操作。

如果为计算机名传入null,则返回有关本地计算机的信息。

它将返回一个WKSTA_INFO_100实例,其中包含域名。

答案 3 :(得分:2)

如果您只是想知道代码运行的机器是否是主域控制器,我认为您最好的选择是NetServerGetInfo。如果您将 101 作为级别参数传递,则会返回SERVER_INFO_101 structure。然后查找 sv101_type 成员:

  

<强> sv101_type

     
    

计算机运行的软件类型。该成员可以是以下值之一。

         
      

(...)

             

SV_TYPE_DOMAIN_CTRL:主域控制器。

    
  

答案 4 :(得分:1)

具有确定工作站的加入状态的特定功能。 https://docs.microsoft.com/en-gb/windows/desktop/api/lmjoin/nf-lmjoin-netgetjoininformation

此级别可以是3状态,“加入”到工作组(良好的旧Windows 3.0网络)状态== NetSetupWorkgroupName,或加入域状态== NetSetupDomainName 或未加入(独立)状态== NetSetupUnjoined

因此,如果您知道这一点,则可以可靠的方式调用相应的所需功能。

答案 5 :(得分: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);
    }
}

感谢所有人:)