如何搜索隐藏的共享资源(即共享名后带$)(100分)

  • 主题发起人 主题发起人 QuickSilver
  • 开始时间 开始时间
Q

QuickSilver

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的代码可以搜索到普通的共享资源,但列不出隐藏的共享资源,如何使隐藏的共享资源一同列出,请指教。

Function GetUserResource( UserName : string ; var List : TStringList ):boolean;
Var
NetResource : TNetResource;
Buf : Pointer;
Count,BufSize,Res : DWord;
Ind : Integer;
lphEnum : THandle;
Temp : TNetResourceArray;
Begin
Result := False;
List.Clear;
FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息
NetResource.lpRemoteName := @UserName[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 Ind := 0 to Count - 1 do
Begin
List.Add(Temp^.lpRemoteName);
Inc(Temp);
End;
End;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
If Res <> NO_ERROR Then exit; //执行失败
Result := True;
FreeMem(Buf);
End;

procedure TForm1.Button1Click(Sender: TObject);
var
List:TstringList;
i:integer;
begin
try
List:=TstringList.Create;
if GetUserResource(edit1.text,List) then
if List.count=0 then //指定计算机下没有找到共享资源
begin
memo1.Lines.Add (edit1.text+'下没有找到共享资源!');
end
else
memo1.Lines.Add (edit1.text+'下的所有共享资源如下:');
for i:=0 to List.Count-1 do
begin
Memo1.lines.Add (List.strings);
end;
finally
List:=TstringList.Create; //如有异常则释放分配的资源
end;
end;

 
我也正想实现,不知哪位高手能帮忙解决。
 
参考一下这个呢:
下面的程序列出Temporary Internet Files所有文件
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,wininet,
StdCtrls, ComCtrls, Buttons;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
BitBtn1: TBitBtn;
ListView1: TListView;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Stop:boolean;
Procedure AddInfo( lpEntryInfo: PInternetCacheEntryInfo;id:integer);
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
lpEntryInfo: PInternetCacheEntryInfo;
hCacheDir: LongWord ;
dwEntrySize, dwLastError: LongWord;
id:integer;
begin
Stop:=false;
id:=0;
ListView1.items.clear;

dwEntrySize := 0;
FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);

GetMem(lpEntryInfo, dwEntrySize);

hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);
if hCacheDir <> 0 then
AddInfo(lpEntryInfo,id);
id:=id+1;
FreeMem(lpEntryInfo);

repeat
dwEntrySize := 0;
FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize);
dwLastError := GetLastError();
if dwLastError = ERROR_INSUFFICIENT_BUFFER then
begin
GetMem(lpEntryInfo, dwEntrySize);
if FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize) then
begin
AddInfo(lpEntryInfo,id);
id:=id+1;
end;
FreeMem(lpEntryInfo);
end;
application.ProcessMessages;
until (dwLastError = ERROR_NO_MORE_ITEMS) or Stop ;
end;

procedure TForm1.AddInfo(lpEntryInfo: PInternetCacheEntryInfo;id:integer);
begin
with ListView1.items do
begin
Try
BeginUpdate;
with Add do
begin
Caption:=IntTostr(id);
subitems.add(lpEntryInfo^.lpszSourceUrlName);
Subitems.add(lpEntryInfo^.lpszLocalFileName);
end;
finally
EndUpdate;
end;
end;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
var
I:integer;
begin
if not Stop then exit;
for i:=ListView1.Items.Count-1 downto 0 do
DeleteUrlCacheEntry(Pchar(ListView1.Items.SubItems[0]));
ListView1.items.clear;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Stop:=false;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Stop:=true;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
var
I:integer;
begin
if not Stop then exit;
for i:=ListView1.Items.Count-1 downto 0 do
if Listview1.Items.Selected then
begin
DeleteUrlCacheEntry(Pchar(ListView1.Items.SubItems[0]));
ListView1.Items.Delete(i);
end;
end;

end.
 
在windows2000下面執行//機器名/共享資源$ 就可以了.然後你把這個弄到delphi中就可以了.注意共享名稱必須包括後面的$字符
 
同意compard的.我的程序就这样用的.
 
答回非问,请注意看题
 
调用dos命令netshare可以否
 


//得到网上的资源

function GetNetRes(IPAddr: string; var ResData: TStrings): integer;
const
Username: array[0..1] of string = ('ADMIN$', 'IPC$');
var
NetRes: TNetResource;
Buf: Pointer;
Count, BufSize, Res: DWord;
Ind: Integer;
lphEnum: THandle;
Temp: TNetResourceArray;
str: string;
i: integer;
NetSource: TNetResource;
begin
ResData := TStringList.Create;
ResData.Clear;
FillChar(NetRes, SizeOf(NetRes), 0); //初始化网络层次信息
netres.lpRemoteName := pchar('//' + IPAddr); //指定计算机名称
//获取指定计算机的网络资源句柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE, @NetRes, lphEnum);

if (Res <> NO_ERROR) then begin
Result := Res;
exit;
end;

Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K
GetMem(Buf, BufSize); //申请内存,用于获取工作组信息

if Win32Platform = VER_PLATFORM_WIN32_NT then //如果是win2000 或 NT 就执行下面代码
begin

with NetSource do
begin
dwType := RESOURCETYPE_ANY;
lpLocalName := ''; // 将 远 程 资 源 映 射 到 此 驱 动 器
//lpRemoteName := pchar('//' + str); // 远 程 网 络 资 源
lpProvider := ''; // 必 须 赋 值, 如 为 空 则 使 用lpRemoteName 的 值。
end;

for i := 67 to 90 do begin
str := IPAddr + '/' + chr(i) + '$';
NetSource.lpRemoteName := pchar('//' + str);
Res := WnetAddConnection2(NetSource, '', '', 0);
if (res = 0) or (Res = 5) then begin
WNetCancelConnection2(pchar('//' + str), CONNECT_UPDATE_PROFILE, False);
if (res = 5) then begin
Res := WnetAddConnection2(NetSource, '', 'Administrator', 0);
if Res = 0 then WNetCancelConnection2(pchar('//' + str), CONNECT_UPDATE_PROFILE, False);
if res = 67 then break;
end;

ResData.Add(str);
end
else begin
break;
end;
end;


for i := 0 to length(Username) - 1 do begin
str := IPAddr + '/' + Username;
NetSource.lpRemoteName := pchar('//' + str);
Res := WnetAddConnection2(NetSource, '', '', 0);
if (res = 0) or (Res = 5) or (Res = 1219) then begin
WNetCancelConnection2(pchar('//' + str), CONNECT_UPDATE_PROFILE, False);
if (res = 5) then begin
Res := WnetAddConnection2(NetSource, '', 'Administrator', 0);
if Res = 0 then WNetCancelConnection2(pchar('//' + str), CONNECT_UPDATE_PROFILE, False);
if res = 67 then break;
end;

ResData.Add(str);
end
else begin
break;
end;
end;

end; //if Win32Platform = VER_PLATFORM_WIN32_NT then

Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if (Res <> NO_ERROR) and (resdata.Count = 0) then begin
Result := Res;
Exit; //执行失败
end;
Temp := TNetResourceArray(Buf);
for Ind := 0 to Count - 1 do
begin
//获取指定计算机中的共享资源名称,+2表示删除"//",
ResData.Add(temp^.lpRemoteName + 2); //把内容加入ResData中!
Inc(Temp); //加1
end;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
if (Res <> NO_ERROR) and (resdata.Count = 0) then begin
Result := Res;
exit; //执行失败
end;
if resdata.Count > 0 then
result := 0
else
Result := Res;
end;
 
用建立映射成功与否来验证管理共享C,D,E,F.....是否存在,但无法列出自定义的隐藏共享,如共享为:QuickSilver$
 
xuexi!!!!!!!!!!
 
用我上面那段代码不成功的话我给你300分
 
jingtao,我没说你上面的代码不成功,只是这只能列出隐藏的管理共享C$,D$,E$....Z$,列不出人为设定的隐藏共享,达不到我的要求的。
 
这个问题。。。
要关注,up!
 
攻击方式与伤害的精确值(摘自老枪 happy提供)
大家都知道星际有三中兵种类型和三种伤害方式,兵种类型分别是大中小,伤害
方式分别是爆炸,震荡,普通
爆炸伤害对大兵种100%杀伤,中兵种75%, 小兵种50%
震荡对大兵种25%杀伤,中兵种50%, 小兵种100%
普通对一切兵种都是100%杀伤
具体哪种兵种是属于哪种类型和什么杀伤属性,我不列表了, 提醒几个容易记住的
只有地雷车和口水怪是中型兵种
只有喷火兵,地雷车,ghost是震荡攻击
除了飞龙,自杀机,航母的小飞机是小型部队外,其他空军全是大型单位
盔甲对伤害的影响: 部队受到的实际伤害等于杀伤力-盔甲级数, 假如盔甲级数大于
等于杀伤力的话, 实际伤害按0.5计算(中两枪才伤一点) 所以盔甲对杀伤力小的部队
有很好效果, 例如一级攻击的机枪兵打全升级的ultralist, 每一枪才伤7-6=1点, 相反坦克炸的话杀伤力是70-6=64点, 机枪兵几乎无效,而坦克还保持大部分效率
protoss的能量盾的算法和盔甲类似, 有一点要注意的, 就是假如能量盾很少,不足抵消 所有的伤害时,能量盾的级数和盔甲的级数是同时发挥作用的, 例如一个三级盾和三级甲的航母,只有1点能量盾,被25杀伤的大和舰击中,它的能量盾全无, 舰体受伤等于25-3(盾的级别)-1(盾的点数)-7(舰体盔甲)=14点 这一枪只对舰体造成14点伤害.
几乎忘了说,第一能量盾是不算兵种类型和杀伤属性的,任何武器打在能量盾上都相当 于普通攻击,其次减盔甲级别的运算是在计算伤害属性前进行的, 就是说先减盔甲级别, 然后再按兵种类型和杀伤属性对伤害打折.
还有一点我没有证实的说法是关于两次攻击的部队,不少部队的攻击都是属于两次攻击 类型,例如狂热者刀子一捅就是当当两下,机器人的对空导弹也是一次发两颗, 喷火兵也是一次发两条火柱, 这种两次攻击的部队它的杀伤力是平均分配在两次攻击上, 每次攻击的效果是显示的杀伤力的一半, 实际上两次攻击都是一定会命中的,不存在只命中一次的情况, 造成的影响是被攻击目标的盔甲级数在两次攻击都会发挥作用, 也就是说盔甲的作用对这些部队来说会大了一倍, 例如0级攻击的狂热者攻击3级甲的狗时只会造成(8-3)x2=10点伤害而不是16-3=13点伤害, 有没有人去证实一下?
另外飞龙两次反弹攻击,每次攻击的威力是上一次的1/3, 0级飞龙是9/3/1, 1级飞龙
是10/3.3/1.1 星际的生命力显示是整数,可是内部是用小数计算的, 所以象3.3这样的 伤害也会被精确计算到,连中3枪的话,前两枪每枪伤3点,第3枪伤4点
(完)
 
有了结果给我发个E——MAILA:WZHHZW@163.NET
 
看不到是Windows自身的限制,只要你还在调用普通的API,就不可能看得到.不过如果你很有一套.可以参考SAMBA的SMBClient
 
后退
顶部