管理系统,管理者要求看到所有开着的机器(通过程序),并且想发送信息,操作系统为windows98,如何实现.

解决方案 »

  1.   

    windows2000
    procedure GetServerList(List: TStrings);
    type
    {$H+}
      PMyRec = ^MyRec;
      MyRec = record
        dwScope: Integer;
        dwType: Integer;
        dwDisplayType: Integer;
        dwUsage: Integer;
        LocalName: string;
        RemoteName: string;
        Comment: string;
        Provider: string;
      end;
      {H-}
    var
      NetResource: TNetResource;
      TempRec: PMyRec;
      Buf: Pointer;
      Count,
        BufSize,
        Res: DWORD;
      lphEnum: THandle;
      p: PNetResourceArr;
      i,
        j: SmallInt;
      NetworkTypeList: TList;
    begin
      // Result := False;
      NetworkTypeList := TList.Create;
      List.BeginUpdate;
      List.Clear;
      GetMem(Buf, 8192);
      try
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
          RESOURCEUSAGE_CONTAINER, nil, lphEnum);
        if Res <> 0 then
          raise Exception(Res);
        Count := $FFFFFFFF;
        BufSize := 8192;
        Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
        if Res = ERROR_NO_MORE_ITEMS then
          Exit;
        if (Res <> 0) then
          raise Exception(Res);
        P := PNetResourceArr(Buf);
        for I := 0 to Count - 1 do
        begin
          New(TempRec);
          TempRec^.dwScope := P^.dwScope;
          TempRec^.dwType := P^.dwType;
          TempRec^.dwDisplayType := P^.dwDisplayType;
          TempRec^.dwUsage := P^.dwUsage;
          TempRec^.LocalName := StrPas(P^.lpLocalName);
          TempRec^.RemoteName := StrPas(P^.lpRemoteName);
          TempRec^.Comment := StrPas(P^.lpComment);
          TempRec^.Provider := StrPas(P^.lpProvider);
          NetworkTypeList.Add(TempRec);
          Inc(P);
        end;
        Res := WNetCloseEnum(lphEnum);
        if Res <> 0 then
          raise Exception(Res);
        for J := 0 to NetworkTypeList.Count - 1 do
        begin
          TempRec := NetworkTypeList.Items[J];
          NetResource := TNetResource(TempRec^);
          Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
            RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
          if Res <> 0 then
            raise Exception(Res);
          while true do
          begin
            Count := $FFFFFFFF;
            BufSize := 8192;
            Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
            if Res = ERROR_NO_MORE_ITEMS then
              Break;
            if (Res <> 0) then
              raise Exception(Res);
            P := PNetResourceArr(Buf);
            for I := 0 to Count - 1 do
            begin
              List.Add(P^.lpRemoteName);
              Inc(P);
            end;
          end;
        end;
        Res := WNetCloseEnum(lphEnum);
        if Res <> 0 then
          raise Exception(Res);
        //Result := True;
      finally
        FreeMem(Buf);
        NetworkTypeList.Destroy;
      end;
      List.EndUpdate;
    end;procedure GetUserList(fServer: string; List: TStrings);
    var
      NetResource: TNetResource;
      Buf: Pointer;
      Count,
        BufSize,
        Res: DWord;
      Ind: Integer;
      lphEnum: THandle;
      Temp: PNetResourceArr;
    begin
      GetMem(Buf, 8192);
      try
        FillChar(NetResource, SizeOf(NetResource), 0);
        NetResource.lpRemoteName := @fServer[1];
        NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;
        NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
        NetResource.dwScope := RESOURCETYPE_DISK;
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
          RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
        if Res <> 0 then
          Exit;
        while True do
        begin
          Count := $FFFFFFFF;
          BufSize := 8192;
          Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
          if Res = ERROR_NO_MORE_ITEMS then
            Exit;
          if (Res <> 0) then
            Exit;
          Temp := PNetResourceArr(Buf);
          for Ind := 0 to Count - 1 do
          begin
            List.Add(Temp^.lpRemoteName + 2);
            { Add all the network usernames to List StringList }
            Inc(Temp);
          end;
        end;
        Res := WNetCloseEnum(lphEnum);
        if Res <> 0 then
          raise Exception(Res);
        //    Result := True;
      finally
        FreeMem(Buf);
      end;
    end;var
    i:integer;
    ServerList, IPList: TStringList;
    begin
      GetServerList(ServerList);
      for I := 0 to ServerList.count - 1 do
        GetUserList(ServerList.Strings[I], IPList);//IPList字符串列表就是你所要的网络上
    上的机器名
    end;
      

  2.   


        //获取工作组中所有计算机
        Function NetGetUsers(GroupName: string; var List: TStringList): Boolean;
    {=================================================================
      功  能: 列举工作组中所有的计算机
      参  数:
              List: 需要填充的List
      返回值: 成功:  True,并填充List 失败: False;
      备  注:
      版  本:
         1.0  2002/10/03 08:00:00
    =================================================================}
    Function TPub.NetGetUsers(GroupName: 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;
      FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息
      NetResource.lpRemoteName := @GroupName[1];//指定工作组名称
      NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)
      NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
      NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息
      //获取指定工作组的网络资源句柄
      Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
                            RESOURCEUSAGE_CONTAINER, @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表示删除"\\",如\\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;