2009-05-18 75 views
4

在我的應用程序中,我需要知道計算機是否是域的主域控制器,因此我需要知道計算機的域以調用NetGetDCName函數。從Windows API獲取計算機的域名

謝謝。

編輯:該問題與DCOM身份驗證有關,因此如果需要使用計算機的本地身份驗證數據庫,則需要知道該域使用PDC或COMPUTER \ USERNAME的情況下的域\用戶名。

+1

C++和WinAPI標記尚未編輯,使無法編程相關? – 2009-05-18 16:47:02

+1

它似乎是編程相關的,只是一個非常簡單的問題,可能會被誤認爲與編程無關。 – 2009-05-18 16:48:42

+0

我需要使用winapi來獲取名稱,編程相關。我認爲:s – 2009-05-18 16:49:35

回答

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

您可以使用NetWkstaGetInfo功能做到這一點。

如果您傳遞null作爲計算機名稱,它將返回有關本地計算機的信息。

它將返回一個包含域名的WKSTA_INFO_100實例。

2

如果您只是想知道代碼運行的機器是否是主域控制器,我認爲您的最佳選擇是NetServerGetInfo。如果您通過作爲級別參數,它將返回SERVER_INFO_101 structure。然後尋找其sv101_type成員:

sv101_type

計算機運行軟件的類型。該成員可以是以下值之一。

(...)

SV_TYPE_DOMAIN_CTRL:一個主域控制器。

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