Win2016环境下获取终端用户共享盘提示1707错误.(delphi7) 80C

unction GetUserResource(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);
  Buf:=nil;
  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;

获取终端用户共享盘:

 IpAddr:='\\tsclient';

 Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
  RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);

在win10(win2016)环境下,Res返回1707.(1707 0x000006AB 网络地址无效)

但是在win2003和win2008环境下都正常.(Res返回0)

这个问题如何解决?各位大侠给点建议,谢啦.

2个回答

可能是win10环境变量有问题,设置一下

godnoah
godnoah 这个跟环境变量没任何关系,用VC写的小程序测试正常呢.
接近 2 年之前 回复

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

//获取指定计算机中的共享资源名称,+2表示删除"\",

//如\wangfajun=>wangfajun
List.Add(Temp^.lpRemoteName + 2);
Inc(Temp);
end;

end;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
if Res <> NO_ERROR then exit; //执行失败
Result := True;
FreeMem(Buf);
end;

procedure TForm1.btnGetResourceClick(Sender: TObject);
var
i: Integer;
sUserName: string;
begin
sUserName := edtUserName.Text;
if sUserName[1] + sUserName[2] <> '\' then
sUserName := '\' + sUserName;

if GetUserResource(sUserName, rcList) then
lstRes.Items.Assign(rcList) else
caption := 'Failsed';
end;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!