我现在想得到同一个网络(可能有多个工作组)中的所有装有SQL的服务器列表,但一直没有找到理想的方法!以前有找到过如下方法,但都不理想:1、列举出整个网络中的SQL服务器名称,返回值为TRUE表示执行成功,参数List中返回服务器(工作组)的名称,但此方法有限制:要求本机装有SQLDMO,不然就不行
function GetSQLServerList(var List: Tstringlist): boolean;
var
  i: integer;
  sRetValue: string;
  SQLServer: Variant;
  ServerList: Variant;
begin
  Result := False;
  List.Clear;
  try
    SQLServer := CreateOleObject('SQLDMO.Application'); //此处要uses ComObj;
    ServerList := SQLServer.ListAvailableSQLServers;
    for i := 1 to Serverlist.Count do
      list.Add(Serverlist.item(i));
    Result := True;
  finally
    SQLServer := NULL;
    ServerList := NULL;
  end;
end;
2、此方法与上面一样可以得到服务器列表,但是局限于本机所在的同一工作组,不能找到别的工作组中的服务器。
const
     SV_TYPE_SQLSERVER           = $00000004;
type
  pDword = ^DWord;
  NET_API_STATUS = DWORD;
  SERVER_INFO_100 = record
     sv100_platform_id : DWord;
     sv100_name        : pwidechar;
  end;  PSERVER_INFO_100  = ^SERVER_INFO_100;
  LPSERVER_INFO_100 = ^SERVER_INFO_100;
  ASERVER_INFO_100  = array of SERVER_INFO_100;  SERVER_INFO_101 = record
    sv101_platform_id   : dword;
    sv101_name          : pwidechar;
    sv101_version_major : Dword;
    sv101_version_minor : Dword;
    sv101_type          : dword;
    sv101_comment       : pchar;
  end;  PSERVER_INFO_101  = ^SERVER_INFO_101;
  LPSERVER_INFO_101 = ^SERVER_INFO_101;
  ASERVER_INFO_101  = array of SERVER_INFO_101;
function NetServerEnum(servername : pchar; level : Dword; var bufptr;
   prefmaxlen : integer; entriesread : pDword; totalentries : pDword;
     servertype : DWord; domain : pwidechar; resume_handle : integer)
:   NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetServerEnum';function NetApiBufferFree (Buffer : pointer) : NET_API_STATUS;
stdcall; external 'netapi32.dll' name 'NetApiBufferFree';
procedure EnumNetwork(ts: TStrings);
var
   pBuf    : pByte;
   aBuf    : ASERVER_INFO_100;
   dwEntriesRead : DWORD;
   dwTotalEntries : DWORD;
   dwServerType : DWORD;
   i : DWORD;
   name : string;
begin
   pBuf := nil;
   dwEntriesRead := 0;
   dwTotalEntries := 0;
   dwServerType := SV_TYPE_SQLSERVER; // all servers   NetServerEnum(nil, 100, pBuf, -1,
     @dwEntriesRead, @dwTotalEntries, dwServerType, nil, 0);   aBuf := ASERVER_INFO_100(pBuf);   for i := 0 to dwEntriesRead - 1 do
     begin
       name := aBuf[i].sv100_name;
       ts.add(name);
       // name is the name of the SQL Server in the network
     end;
   if Assigned(pBuf) then NetApiBufferFree(pBuf);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumNetwork(ListBox1.items);
end;以上两种方法都不理想,有没有更好的?
现求更理想的方法:能找到同一网络中不同工作组中的所有装有SQL的服务器列表。多谢各位帮忙!!在线等!!