谢谢!!

解决方案 »

  1.   

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

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