我想根据IP地址或计算机名取得它所在的工作组???不知哪位能提供一下源代码,为了我的作业啊,请各位高手不要吝啬啊!如果可以的话,我还想取得那台机此刻登录的用户名。
十分紧急!

解决方案 »

  1.   

    //我拷贝的,你看看吧。可能还要改改。
    如何使用WinAPI来查找LAN中所有的计算机? 
     回答:
      调用FindComputers,返回WinAPI错误代码(如果有的话)。这个函数将会在TStringList类型的Computers对象中填入计算机名称。
      
      以下代码是在Delphi5上开发的,但是应该是向后兼容的。
      
      Answer:
      
      
      unit FindComp;
      
      interface
      
      uses
        Windows, Classes;
      
      function FindComputers: DWORD;
      
      var
        Computers: TStringList;
      
      implementation
      
      uses
        SysUtils;
      
      const
        MaxEntries = 250;
      
      function FindComputers: DWORD;
      
      var
        EnumWorkGroupHandle, EnumComputerHandle: THandle;
        EnumError: DWORD;
        Network: TNetResource;
        WorkGroupEntries, ComputerEntries: DWORD;
        EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
        EnumBufferLength: DWORD;
        I, J: DWORD;
      
      begin
      
        Computers.Clear;
      
        FillChar(Network, SizeOf(Network), 0);
        with Network do
        begin
          dwScope := RESOURCE_GLOBALNET;
          dwType := RESOURCETYPE_ANY;
          dwUsage := RESOURCEUSAGE_CONTAINER;
        end;
      
        EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumWorkGroupHandle);
      
        if EnumError = NO_ERROR then
        begin
          WorkGroupEntries := MaxEntries;
          EnumBufferLength := SizeOf(EnumWorkGroupBuffer);
          EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, EnumBufferLength);
      
          if EnumError = NO_ERROR then
          begin
            for I := 1 to WorkGroupEntries do
            begin
              EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer[I], EnumComputerHandle);
              if EnumError = NO_ERROR then
              begin
                ComputerEntries := MaxEntries;
                EnumBufferLength := SizeOf(EnumComputerBuffer);
                EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, EnumBufferLength);
                if EnumError = NO_ERROR then
                  for J := 1 to ComputerEntries do
                    Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));
                WNetCloseEnum(EnumComputerHandle);
              end;
            end;
          end;
          WNetCloseEnum(EnumWorkGroupHandle);
        end;
      
        if EnumError = ERROR_NO_MORE_ITEMS then
          EnumError := NO_ERROR;
        Result := EnumError;
      
      end;
      
      initialization
      
        Computers := TStringList.Create;
      
      finalization
      
        Computers.Free;
      
      end. 
    如何查找工作组中所有计算机? 
     回答:
      
      var
        Computer                 : Array[1..500] of String[25];
        ComputerCount            : Integer;
      
      
      procedure FindAllComputers(Workgroup : String);
      Var
        EnumHandle                : THandle;
        WorkgroupRS               : TNetResource;
        Buf                       : Array[1..500] of TNetResource;
        BufSize                   : Integer;
        Entries                   : Integer;
        Result                    : Integer;
      
      begin
        ComputerCount := 0;
      
        Workgroup := Workgroup + #0;
      
        FillChar(WorkgroupRS, SizeOf(WorkgroupRS) , 0);
        With WorkgroupRS do begin
          dwScope := 2;
          dwType := 3;
          dwDisplayType := 1;
          dwUsage := 2;
          lpRemoteName := @Workgroup[1];
        end;
      
        WNetOpenEnum( RESOURCE_GLOBALNET,
                      RESOURCETYPE_ANY,
                      0,
                      @WorkgroupRS,
                      EnumHandle );
      
        Repeat
          Entries := 1;
          BufSize := SizeOf(Buf);
      
          Result :=
           WNetEnumResource( EnumHandle,
                             Entries,
                             @Buf,
                             BufSize );
         If (Result = NO_ERROR) and (Entries = 1) then begin
            Inc( ComputerCount );
            Computer[ ComputerCount ] := StrPas(Buf[1].lpRemoteName);
          end;
        Until (Entries <> 1) or (Result <> NO_ERROR);
      
        WNetCloseEnum( EnumHandle );
      end;  { Find All Computers }