从Windows API获取计算机的域名

5
在我的应用程序中,我需要知道计算机是否是域的主域控制器,因此我需要知道计算机所在的域来调用NetGetDCName函数。
谢谢。
编辑:问题与DCOM身份验证有关,因此我需要知道域以便在PDC的情况下使用DOMAIN\USERNAME,或者在需要使用计算机本地身份验证数据库时使用COMPUTER\USERNAME。

1
C++和WinAPI的标签尚未编辑,以使其不涉及编程? - Robin Day
1
这似乎与编程有关,只是一个非常简单的问题,可能会被误认为与编程无关。 - Stefan Thyberg
我需要使用WinAPI获取名称,因此这与编程有关。我想是这样的:s。 - Jesus Fernandez
移除标签。我还无法编辑问题以充实内容,这有点令人沮丧... - Michael Petrotta
这个问题真的与编程无关,还是应该提供更多细节?“如何以实用的方式获取计算机的域名?” - Dan Adams
1
实用主义很好,但我更喜欢以编程方式实现。 :-) - Stefan Thyberg
6个回答

17
NetWkstaGetInfo()函数返回计算机的域名或工作组,因此不是确定计算机是否属于域的可靠方式。
可以使用GetComputerNameEx()函数和ComputerNameDnsDomain参数来确定计算机所在的域或工作组。如果计算机在工作组中,则返回空字符串;否则返回域的DNS名称。
DWORD bufSize = MAX_PATH;
TCHAR domainNameBuf[ MAX_PATH ];

GetComputerNameEx( ComputerNameDnsDomain, domainNameBuf, &bufSize );

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...
}

3
你可以使用NetWkstaGetInfo函数来实现此功能。
如果你将计算机名称设为null,它会返回关于本地计算机的信息。
它将返回一个WKSTA_INFO_100实例,其中包括域名。

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

sv101_type

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

(...)

SV_TYPE_DOMAIN_CTRL: 主域控制器。


我需要知道计算机是否为PDC以及域的名称。谢谢。 - Jesus Fernandez

2

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);
    }
}

感谢大家 :)


我在本地机器上也遇到了ACCESS_DENIED的问题。它需要管理员权限才能正常工作。 - ssamko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接