如何快速查找服务器IP地址?

chenylin 2006-06-21 11:14:59
知道了MSSQL2000的用户名和密码(比如是SA和123456),通讯端口是1433,如何快速的查找到该服务器的IP地址?
...全文
2339 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiirii 2006-06-21
  • 打赏
  • 举报
回复
function SQLFreeHandle(HandleType: SQLSMALLINT; Handle: SQLHANDLE): SQLRETURN;
stdcall; external 'odbc32.dll' name 'SQLFreeHandle';

const
SQL_HANDLE_ENV = 1;
SQL_HANDLE_DBC = 2;
SQL_NULL_HANDLE = LongInt(0);
SQL_SUCCESS = 0;
SQL_ERROR = -1;
SQL_ATTR_ODBC_VERSION = 200;
SQL_OV_ODBC3 = ULONG(3);
SQL_NTS = -3;


function GetODBCInfo(var AList: TStrings; InfoType: TInfoType): Boolean;
const
ConnStrOutMax = 4824;
SplitterStr = '={';

var
HENV: SQLHENV;
HDBC: SQLHDBC;
RetCode: SQLRETURN;
ConnStrOut: PSQLCHAR;
cbConnStrOut: SQLSMALLINT;
ConnStrIn, TmpStr: string;
TmpPos: Integer;
begin

case InfoType of
itServer: ConnStrIn := 'Driver={SQL Server}';
itDatabase, itLanguage: ConnStrIn := 'Driver={SQL Server};SERVER=(local);UID=sa;PWD=';
end;

Result := False;
try
// 分配 ODBC 环境句柄
RetCode := SQLAllocHandle(SQL_HANDLE_ENV, SQLPOINTER(SQL_NULL_HANDLE), @HENV);

if RetCode = SQL_ERROR then
Exit;

// 设置 ODBC 版本

RetCode := SQLSetEnvAttr(HENV, SQL_ATTR_ODBC_VERSION, SQLPointer(SQL_OV_ODBC3), 0);

if RetCode <> SQL_SUCCESS then
Exit;



// 分配数据库连接句柄

RetCode := SQLAllocHandle(SQL_HANDLE_DBC, HENV, @HDBC);
if RetCode <> SQL_SUCCESS then
Exit;

GetMem(ConnStrOut, ConnStrOutMax);

RetCode := SQLBrowseConnect(HDBC, PSQLCHAR(ConnStrIn), SQL_NTS, ConnStrOut,
ConnStrOutMax, @cbConnStrOut);


if RetCode <> SQL_ERROR then
begin
TmpStr := PChar(ConnStrOut);

if InfoType = itLanguage then
Delete(TmpStr, 1, AnsiPos('};', TmpStr) + 1);

Delete(TmpStr, 1, AnsiPos(SplitterStr, TmpStr) + 1);
Delete(TmpStr, AnsiPos('}', TmpStr), Length(TmpStr));
while TmpStr <> '' do
begin
TmpPos := AnsiPos(',', TmpStr);
if TmpPos > 0 then
AList.Add(Copy(TmpStr, 1, TmpPos - 1))
else
begin
AList.Add(TmpStr);
TmpStr := '';
end;
Delete(TmpStr, 1, TmpPos)
end;
Result := True;
end;
FreeMem(ConnStrOut, ConnStrOutMax);

finally
if Assigned(HDBC) then
begin
SQLDisconnect(HDBC);
SQLFreeHandle(SQL_HANDLE_DBC, HDBC);
HDBC := nil;
end;

if Assigned(HENV) then
begin
SQLFreeHandle(SQL_HANDLE_ENV, HENV);
HENV := nil;
end;
end;

end;

张伟(Alan) Alan@cnvcl.org

转载请注明出处并保持完整性!

How to list all installed MS SQL Server Name by Delphi?
procedure FindSQLServers(aList: tStrings); // try an (inofficial) connect to sqlserver on port 1434
var
UDP: tidUDPClient;
IP, T, D, Peer, REC, S: string;
Port: Integer;
ServerName, InstanceName, TCPPort, Version: string;
begin
UDP := tidUDPCLient.Create(nil);
try
S := GStack.LocalAddress;
IP := Fronttoken(S, '.') + '.' + Fronttoken(S, '.') + '.' + Fronttoken(S, '.') + '.255';
UDP.Host := IP;
UDP.Port := 1434;
UDP.BroadcastEnabled := True;
UDP.ReceiveTimeout := 6000;
aList.Clear;
UDP.Send(#2);
repeat
ServerName := '';
InstanceName := '';
REC := UDP.ReceiveString(Peer, Port);
S := Copy(REC, 4, MaxInt);
while length(S) > 0 do
begin
if S = ';' then
begin
s := '';
end
else
begin
T := Fronttoken(S, ';');
D := Fronttoken(S, ';');
if T = 'SERVERNAME' then
Servername := D
else
if T = 'INSTANCENAME' then
InstanceName := D
else
if T = 'TCP' then
TCPPort := D
else
if T = 'VERSION' then Version := D;
end;
end;
if ServerName <> '' then
begin
if InstanceName <> 'MSSQLSERVER' then
S := Servername + '\' + InstanceName
else
S := Servername;
// aList.Add(S+' ('+Peer+'.'+TCPPort+') Version '+Version );
aList.Add(S);
end;
until REC = '';
finally
UDP.Free;
end;
aiirii 2006-06-21
  • 打赏
  • 举报
回复
列表类型:仅列举装有“服务端”的计算机。

适用条件:有NetApi32.dll文件。

速度:快

调用示例:GetSQLServerList(ListBox1.items);

代码:

type
NET_API_STATUS = DWORD;

PServerInfo100 = ^TServerInfo100;

_SERVER_INFO_100 = record
sv100_platform_id: DWORD;
sv100_name: LPWSTR;
end;

{$EXTERNALSYM _SERVER_INFO_100}
TServerInfo100 = _SERVER_INFO_100;
SERVER_INFO_100 = _SERVER_INFO_100;
{$EXTERNALSYM SERVER_INFO_100}

const
NERR_Success = 0;
MAX_PREFERRED_LENGTH = DWORD(-1);
SV_TYPE_SQLSERVER = $00000004;

function NetApiBufferAllocate(ByteCount: DWORD; var Buffer: Pointer):
NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetApiBufferAllocate';

function NetServerEnum(ServerName: LPCWSTR; Level: DWORD; var BufPtr: Pointer;
PrefMaxLen: DWORD; var EntriesRead: DWORD; var TotalEntries: DWORD;
ServerType: DWORD; Domain: LPCWSTR; ResumeHandle: PDWORD): NET_API_STATUS;
stdcall; external 'netapi32.dll' name 'NetServerEnum';


function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall; external
'netapi32.dll' name 'NetApiBufferFree';

function GetSQLServerList(var AList: TStrings; pwcServerName: PWChar = nil;
pwcDomain: PWChar = nil): Boolean;

var
NetAPIStatus: DWORD;
dwLevel: DWORD;
pReturnSvrInfo: Pointer;
dwPrefMaxLen: DWORD;
dwEntriesRead: DWORD;
dwTotalEntries: DWORD;
dwServerType: DWORD;
dwResumeHandle: PDWORD;
pCurSvrInfo: PServerInfo100;
i, j: Integer;
begin
Result := True;

try
dwLevel := 100;
pReturnSvrInfo := nil;
dwPrefMaxLen := MAX_PREFERRED_LENGTH;
dwEntriesRead := 0;
dwTotalEntries := 0;
dwServerType := SV_TYPE_SQLSERVER; //服务器类型
dwResumeHandle := nil;

NetApiBufferAllocate(SizeOf(pReturnSvrInfo), pReturnSvrInfo);

try
NetAPIStatus := NetServerEnum(pwcServerName, dwLevel, pReturnSvrInfo,
dwPrefMaxLen, dwEntriesRead, dwTotalEntries, dwServerType, pwcDomain,
dwResumeHandle);

if ((NetAPIStatus = NERR_Success) or (NetAPIStatus = ERROR_MORE_DATA)) and
(pReturnSvrInfo <> nil) then
begin
pCurSvrInfo := pReturnSvrInfo;

// 循环取得所有SQL Server服务器
i := 0;
j := dwEntriesRead;
while i < j do
begin
if pCurSvrInfo = nil then
Break;

with AList do
Add(pCurSvrInfo^.sv100_name);

Inc(i);
Inc(pCurSvrInfo);
end;
end;
finally
if Assigned(pReturnSvrInfo) then
NetApiBufferFree(pReturnSvrInfo);
end;
except
Result := False;
end;
end;


三、 SQLBrowseConnect

描述:ODBC函数(Microsoft Open Database Connectivity,开放式数据库互接),存在于odbc32.dll文件中;通过SQLBrowseConnect函数可返回连接字符串信息,包括DSN、DRIVER、SERVER、UID、PWD、APP、WSID、DATABASE、LANGUAGE等信息。在函数GetODBCInfo 中传入itServer、itDatabase、itLanguage可分别取得“服务器”、“数据库”及“语言”等信息列表,其中itDatabase、itLanguage默认取本地信息,取远程信息请自行修改“'Driver={SQL Server};SERVER=(local);UID=sa;PWD='”连接字符串。

列表类型:列举装有“客户端”和“服务端”的计算机。

适用条件:由于MDAC 2.6 、2.6 SP1、2.7和Microsoft ODBC Driver for SQL Server 2000 2000.80.194有Bug,因此在这些版本中此函数无法取得Microsoft SQL Server 7.0的服务器。

速度:中

调用示例:GetODBCInfo(ListBox1.items, itServer);

代码:

type

TInfoType = (itServer, itDatabase, itLanguage);

SQLHANDLE = Pointer;
SQLSMALLINT = SHORT;
SQLINTEGER = LongInt;
PSQLHANDLE = ^SQLHANDLE;
SQLHENV = SQLHANDLE;
SQLHDBC = SQLHANDLE;
SQLRETURN = SQLSMALLINT;
SQLCHAR = UCHAR;
PSQLCHAR = ^SQLCHAR;
SQLPOINTER = Pointer;
PSQLSMALLINT = ^SQLSMALLINT;

function SQLAllocHandle(HandleType: SQLSMALLINT; InputHandle: SQLHANDLE;
OutputHandle: PSQLHANDLE): SQLRETURN; stdcall; external 'odbc32.dll' name
'SQLAllocHandle';

function SQLSetEnvAttr(EnvironmentHandle: SQLHENV; Attribute: SQLINTEGER;
Value: SQLPOINTER; StringLength: SQLINTEGER): SQLRETURN; stdcall; external
'odbc32.dll' name 'SQLSetEnvAttr';

function SQLBrowseConnect(hdbc: SQLHDBC; szConnStrIn: PSQLCHAR;
cbConnStrIn: SQLSMALLINT; szConnStrOut: PSQLCHAR;
cbConnStrOutMax: SQLSMALLINT; pcbConnStrOut: PSQLSMALLINT): SQLRETURN;
stdcall; external 'odbc32.dll' name 'SQLBrowseConnect';

function SQLDisconnect(ConnectionHandle: SQLHDBC): SQLRETURN; stdcall; external
'odbc32.dll' name 'SQLDisconnect';

aiirii 2006-06-21
  • 打赏
  • 举报
回复
没有快速的方法,扫描,然后用多线程测试登录

获取SQL Server服务器列表的几种方法

一、 SQL DMO

描述:SQL Distributed Management Objects(SQL分布式管理对象),存在于SQLDMO.dll文件中,实际上是一个COM 对象,通过调用SQL DMO的ListAvailableSQLServers方法取得。

列表类型:列举装有“客户端”和“服务端”的计算机。

适用条件:装有 SQL Server,且有SQLDMO.dll文件。

速度:中

调用示例:GetSQLServerList(ListBox1.items);

代码:

uses
ComObj;

function GetSQLServerList(var AList: TStrings): Boolean;
var
SQLServerApp: Variant;
ServerList: Variant;
i: Integer;
begin
Result := True;

try
SQLServerApp := CreateOleObject('SQLDMO.Application');
ServerList := SQLServerApp.ListAvailableSQLServers;

for i := 1 to ServerList.Count do
AList.Add(ServerList.Item(i));

SQLServerApp := Unassigned;
ServerList := Unassigned;
except
Result := False;
end;
end;


二、 NetServerEnum

描述:网络服务函数,存在于NetApi32.dll文件中;通过NetServerEnum函数可取得装有SQL Server服务端的计算机列表,只装有SQL Server客户端的计算机将不会被列举其中;如果一台计算机的SQL Server服务刚刚启动,那么此函数将会过很久才能取到该计算机。


end;
Rubi 2006-06-21
  • 打赏
  • 举报
回复
学习来
postren 2006-06-21
  • 打赏
  • 举报
回复
扫描一下网内各台机器,看哪个机器开启了1433端口,然后再用ADOConnection用sa和密码连接,如果可以就是了
Rubi 2006-06-21
  • 打赏
  • 举报
回复
1,知道了用户名和密码,是不能根据这个找出对应的服务器;
2,如果要搜索本网络的服务器,那也只能用网络扫描工具俩,如果是在sql server中,可以直接看到服务器的实例
chenylin 2006-06-21
  • 打赏
  • 举报
回复
另外说一个不太相关的话题,目前我还是很固执的用C/S进行开发。看了一些B/S开发的软件,要想实现C/S的方便功能(比如用户定义报表)是困难的。我认为B/S是最大限度的方便了系统管理员,但C/S做好了自动升级,其实也很方便。
chenylin 2006-06-21
  • 打赏
  • 举报
回复
谢谢 aiirii 。
这个主要用在公网上。目前的做法是,一是用“花生壳”,但始终是麻烦,还要一些服务器信息,也不是很安全;二是自己做一个网站进行中转。
其实ADSL上网后,都有一个动态IP分配给服务器,且是有一个IP段。我的问题就是想通过某种方式找出该SQL服务器。
我赶紧试一下,谢谢。

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧