用NetServerEnum这个API来作。以下是个以前自己作的测试的例子拿到所有的SQLSERVER服务器。添加在List里,因改有所帮助 #include <Lm.h> void EnumSqlServer(CListCtrl &list) { LPSERVER_INFO_101 pBufDomain = NULL;// the buffer to store server information LPSERVER_INFO_101 pTmpBufDomain; // the temp buffer use to read buffer context LPSERVER_INFO_101 pBufDomain1 = NULL; LPSERVER_INFO_101 pTmpBufDomain1;
#include <Lm.h>
void EnumSqlServer(CListCtrl &list)
{
LPSERVER_INFO_101 pBufDomain = NULL;// the buffer to store server information
LPSERVER_INFO_101 pTmpBufDomain; // the temp buffer use to read buffer context
LPSERVER_INFO_101 pBufDomain1 = NULL;
LPSERVER_INFO_101 pTmpBufDomain1;
DWORD dwLevel = 101;//use LPSERVER_INFO_101 must set this value to 101
DWORD dwPrefMaxLen = -1;
DWORD dwEntriesRead = 0;
DWORD dwTotalEntries = 0;
DWORD dwTotalEntries1 = 0; DWORD dwTotalCount = 0;
DWORD dwServerType = SV_TYPE_SQLSERVER; // all sql servers
DWORD dwServerType1 = SV_TYPE_DOMAIN_ENUM;//all domain controler
DWORD dwResumeHandle = 0;
LPTSTR pszServerName = NULL; DWORD dwTotalSql = 0;//Total sql server number if(NERR_Success == NetServerEnum((unsigned short *)pszServerName,
dwLevel,
(LPBYTE *) &pBufDomain,
dwPrefMaxLen,
&dwEntriesRead,
&dwTotalEntries,
dwServerType1,
NULL,
&dwResumeHandle))
{
pTmpBufDomain = pBufDomain;
for(DWORD i=0; i<dwTotalEntries; i++)
{
char name[MAX_PATH];
memcpy(name,pTmpBufDomain->sv101_name,MAX_PATH);
for(int j=1; j<MAX_PATH; j++)
{
name[j] = name[j*2];
if(name[j+1] == -85)
break;
}
if(NERR_Success == NetServerEnum((unsigned short *)pszServerName,
dwLevel,
(LPBYTE *) &pBufDomain1,
dwPrefMaxLen,
&dwEntriesRead,
&dwTotalEntries1,
dwServerType,
(unsigned short*)pTmpBufDomain->sv101_name,
&dwResumeHandle))
{
pTmpBufDomain1 = pBufDomain1;
for(DWORD i=0; i<dwTotalEntries1; i++)
{
char name1[MAX_PATH];
//memcpy(name1,pTmpBufDomain1->sv101_name,MAX_PATH);
memcpy(name1,pTmpBufDomain1->sv101_name,MAX_PATH);
for(int j=1; j<MAX_PATH; j++)
{
name1[j] = name1[j*2];
if(name1[j+1] == -85)
break;
}
CString tempServer, tempDomain;
tempServer.Format(_T("%s"), name1);
tempDomain.Format(_T("%s"), name);
list.InsertItem(dwTotalSql, tempServer,0);
list.SetItemText(dwTotalSql,1,tempDomain);
dwTotalSql++;
pTmpBufDomain1++;
}
}
else
{
::MessageBox(NULL,_T("Enum sql server faild!"), _T("Net Worning"),MB_ICONERROR);
break;
}
pTmpBufDomain++;
}
}
else
{
::MessageBox(NULL,_T("Enum domain controler faild!"), _T("Net Worning"),MB_ICONERROR);
}
NetApiBufferFree(pBufDomain);
NetApiBufferFree(pBufDomain1); return;
}