列出远程机器的共享目录,要包括隐藏的共享目录 (200分)

  • 主题发起人 主题发起人 未来107
  • 开始时间 开始时间

未来107

Unregistered / Unconfirmed
GUEST, unregistred user!
net share可以列出本机的隐藏共享如admin$ c$等,但是不能列出远程机器的隐藏共享,delphi有个
共享入侵的代码,也不能列出隐藏的共享!
 
倒霉,我不会Delphi,用C的话我倒是有代码。到我主页上找吧。
http://nowcan.yeah.net
 
用 NetShareEnum 如:
var
cbBuffer,EntriesRead, TotalAvail: longint;
p:PSHARE_INFO1_NT;
....
ServerName ='xxx.xxx.xxx.xxx';
cbBuffer:= $0ffffff;
hEnum:=0;
res:=NetShareEnum(ServerName,1,p,cbBuffer,EntriesRead,TotalAvail,hEnum);
if (res=0) or (res=234) then
if EntriesRead>0 then
for i:=0 to EntriesRead-1 do
begin
list.add(string(p^.netname)+' '+string(p^.remark));
inc(p);
end;
 
下面这段代码,可以检测本机的共享信息,但是却不能检测远程机器的共享列表。

procedure TForm1.NetShareEnum1(ServerName:pwchar);
var
cbBuffer,EntriesRead, TotalAvail: longint;
i:integer;
c:NET_API_STATUS;
hEnum:HWND;
p,bufter:pShareInfo502;
ss:String;
begin
memo1.lines.Clear;
cbBuffer:=0;
hEnum:=0;
c:=NetShareEnum(ServerName, 502, p, cbBuffer, EntriesRead,TotalAvail,hEnum);
if (c = ERROR_SUCCESS ) and (c = ERROR_MORE_DATA) then exit;
if EntriesRead>0 then begin
for i:=0 to EntriesRead-1 do
begin
memo1.lines.Add(string(p^.shi502_netname)+'/'+
string(p^.shi502_remark)+'/'+
intToStr(p^.shi502_max_uses)+'/'+
intToStr(p^.shi502_current_uses)+'/'+
string(p^.shi502_path) );
inc(p);
end;
end;
end;

不知道什么原因?
 
原因一般是权限不够,最好不要用等级502,用等级1已经可以获得足够的信息了。
另外,在调用这个函数之前要先用WNetAddConnection2建立一个空连接,及用户和密码都是""。
之后就可以了,而且还可以获得对方的用户名列表等等。
 
{=================================================================
功 能: 返回网络中的共享资源
参 数:
IpAddr: 机器Ip
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
WNetOpenEnum function starts an enumeration of network
resources or existing connections.
WNetEnumResource function continues a network-resource
enumeration started by the WNetOpenEnum function.
版 本:
1.0 2002/10/03 07:30:00
=================================================================}
Function TPub.NetGetUserResource(IpAddr: string; var List: TStringList): Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
i: Integer;
Buf: Pointer;
Temp: TNetResourceArray;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWord;
Begin
Result := False;
List.Clear;
if copy(Ipaddr,0,2) <> '//' then
IpAddr := '//'+IpAddr; //填充Ip地址信息
FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息
NetResource.lpRemoteName := @IpAddr[1];//指定计算机名称
//获取指定计算机的网络资源句柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);
if Res <> NO_ERROR then exit;//执行失败
while True do//列举指定工作组的网络资源
begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取指定计算机的网络资源名称
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕
if (Res <> NO_ERROR) then Exit;//执行失败
Temp := TNetResourceArray(Buf);
for i := 0 to Count - 1 do
begin
//获取指定计算机中的共享资源名称,+2表示删除"//",
//如//192.168.0.1 => 192.168.0.1
List.Add(Temp^.lpRemoteName + 2);
Inc(Temp);
end;
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then exit;//执行失败
Result := True;
FreeMem(Buf);
End;

{=================================================================
功 能: 返回网络中的工作组
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
版 本:
1.0 2002/10/03 08:00:00
=================================================================}
Function TPub.NetGetGroupList( var List : TStringList ) : Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
NetResource: TNetResource;
Buf: Pointer;
Count,BufSize,Res: DWORD;
lphEnum: THandle;
p: TNetResourceArray;
i,j: SmallInt;
NetworkTypeList: TList;
Begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
if Res <> NO_ERROR then exit;//Raise Exception(Res);//执行失败
//获取整个网络中的网络类型信息
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//记录各个网络类型的信息
begin
NetworkTypeList.Add(p);
Inc(P);
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then exit;
for j := 0 to NetworkTypeList.Count-1 do //列出各个网络类型中的所有工作组名称
begin//列出一个网络类型中的所有工作组名称
NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
if Res <> NO_ERROR then break;//执行失败
while true do//列举一个网络类型的所有工作组的信息
begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR) then break;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//列举各个工作组的信息
begin
List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
Inc(P);
end;
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then break;//执行失败
end;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
End;

 
To NowCan:
我建立了空连接,但是还是不能列出远程机器的共享。另外,我用等级1,出错。
是不是,用等级1,那么结构也要变?如果这样,那这结构怎么定义。

TO 康凌:
你的方法不能不能列出隐藏的共享
 
结构要改变,但我不知道该变成什么,pShareInfo1?
另外,这个和操作系统有关系,98和NT不同。
 
//列出所有共享目录。要用NetShareEnum函数,NT,98不一样:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
lbxShares: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TShareInfo50 = packed record
shi50_netname : array [0..12] of Char;
shi50_type : Byte;
shi50_flags : Word;
shi50_remark : PChar;
shi50_path : PChar;
shi50_rw_password : array [0..8] of Char;
shi50_ro_password : array [0..8] of Char;
end;

type
TShareInfo2 = packed record
shi2_netname : PWChar;
shi2_type : DWORD;
shi2_remark : PWChar;
shi2_permissions : DWORD;
shi2_max_uses : DWORD;
shi2_current_uses : DWORD;
shi2_path : PWChar;
shi2_passwd : PWChar;
end;
PShareInfo2 = ^TShareInfo2;
TShareInfo2Array = array [0..512] of TShareInfo2;
PShareInfo2Array = ^TShareInfo2Array;

var
Form1: TForm1;

NetShareEnum :function (pszServer : PChar;
sLevel : Cardinal;
pbBuffer : PChar;
cbBuffer : Cardinal;
pcEntriesRead,
pcTotalAvail : Pointer ):DWORD; stdcall;

NetShareEnumNT :function (ServerName :PWChar;
Level :DWORD;
Bufptr :Pointer;
Prefmaxlen :DWORD;
EntriesRead,
TotalEntries,
resume_handle:LPDWORD): DWORD; stdcall;

implementation

{$R *.dfm}

function IsNT(var Value: Boolean): Boolean;
var Ver: TOSVersionInfo;
BRes: Boolean;
begin
Ver.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
BRes := GetVersionEx(Ver);
if not BRes then
begin
Result := False;
Exit;
end else
Result := True;
case Ver.dwPlatformId of
VER_PLATFORM_WIN32_NT : Value := True;
VER_PLATFORM_WIN32_WINDOWS : Value := False;
VER_PLATFORM_WIN32s : Result := False;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
FLibHandle : THandle;
ShareNT : PShareInfo2Array;
entriesread,totalentries:DWORD;
Share : array [0..512] of TShareInfo50;
pcEntriesRead,pcTotalAvail:Word;
OS: Boolean;
begin
lbxShares.Items.Clear;
if not IsNT(OS) then Close;
if OS then begin
FLibHandle := LoadLibrary('NETAPI32.DLL');
if FLibHandle = 0 then Exit;
@NetShareEnumNT := GetProcAddress(FLibHandle,'NetShareEnum');
if not Assigned(NetShareEnumNT) then
begin
FreeLibrary(FLibHandle);
Exit;
end;
ShareNT := nil;
if NetShareEnumNT(nil,2,@ShareNT,DWORD(-1),
@entriesread,@totalentries,nil) <> 0 then
begin
FreeLibrary(FLibHandle);
Exit;
end;
if entriesread > 0 then
for i:= 0 to entriesread - 1 do
lbxShares.Items.Add(String(ShareNT^.shi2_netname));
end else begin
FLibHandle := LoadLibrary('SVRAPI.DLL');
if FLibHandle = 0 then Exit;
@NetShareEnum := GetProcAddress(FLibHandle,'NetShareEnum');
if not Assigned(NetShareEnum) then
begin
FreeLibrary(FLibHandle);
Exit;
end;
if NetShareEnum(nil,50,@Share,SizeOf(Share),
@pcEntriesRead,@pcTotalAvail) <> 0 then
begin
FreeLibrary(FLibHandle);
Exit;
end;
if pcEntriesRead > 0 then
for i:= 0 to pcEntriesRead - 1 do
lbxShares.Items.Add(String(Share.shi50_netname));
end;
FreeLibrary(FLibHandle);
end;

end.
 
这样似乎也不行,它能够列出本地的共享列表,但是不能列出远程的共享列表!
 
以前写过,你可以在下面地址下载,里面有源码
http://service.lonetear.com/delphi/downfile.asp?ID=133
http://service.lonetear.com/delphi/dispdoc.asp?id=133
 
上面这个程序是bcb写的,NowCan也有用bcb写的。我感到很奇怪,用结构Tshareinfo1,等级
为1,并先与目标机器建立了空连接,但是会出错!
 
这是nowcan得bcb代码,很短。能够读取远程机器的隐藏共享:

void EnumShare(TCHAR *lpszServer)
{
PSHARE_INFO_1 BufPtr,p;
NET_API_STATUS res;
DWORD er=0,tr=0,resume=0, i;
//
// Print a report header.
//
printf("Share Share Type: /n");
printf("--------------------------------------------------/n");
//
// Call the NetShareEnum function; specify level 1.
//
do // begin do
{
res = NetShareEnum (lpszServer, 1, (LPBYTE *) &amp;BufPtr, -1, &amp;er, &amp;tr, &amp;resume);
//
// If the call succeeds,
//
if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA)
{
p=BufPtr;
//
// Loop through the entries;
// print retrieved data.
//
for(i=1;i<=er;i++)
{
printf("%-20S",p->shi1_netname);
switch(p->shi1_type)
{
case STYPE_DISKTREE:
printf("%-30s/n","Disk driver");
break;
case STYPE_PRINTQ:
printf("%-30s/n","Printe queue");
break;
case STYPE_DEVICE:
printf("%-30s/n","Communication device");
break;
case STYPE_IPC:
printf("%-30s/n","Interprocess communication (IPC)");
break;
case STYPE_SPECIAL:
printf("%-30s/n","Special share");
break;
default:
printf("%-30s/n","Unknown share");
break;
}

p++;
}
//
// Free the allocated buffer.
//
NetApiBufferFree(BufPtr);
}
else
{
ShowError(res);
}
// Continue to call NetShareEnum while
// there are more entries.
//
}while (res==ERROR_MORE_DATA); // end do
return;
}

大家,看看能否改成delphi的。

他是用shareinfo1这个结构,并且在调用之前先于远程机器建立空连接。并设等级为1。
我按照这个思路去写,却不能取到!


 
没有办法了吗?
 
根据函数参数略改一下不就可以列出远程的了吗?
为什么一定要完全的代码呢?自己钻研一下不就出来了?
这样只等着张口永远也没有多少进步。。。恕我直言。
Var
...
RSName:PWChar;
RemoteMachine:String;
begin
...
RemoteMachine:='aaa';
i:= SizeOf(WideChar)*256;
GetMem(RSName,i);
StringToWideChar(RemoteMachine,RSName,i);
ShareNT := nil;
if NetShareEnumNT(RSName,2,@ShareNT,DWORD(-1),
@entriesread,@totalentries,nil) <> 0 then
begin
...
end;
FreeMem(RSName);
...
 
To delphiland
实际上,我已经改了n次,代码了,就是不成功!
谢谢你的直言!我在试试!
 
后退
顶部