Ağdaki bilgisayarların ad ve ip nolarını listeleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mhizar
Üye
Mesajlar: 78
Kayıt: 30 May 2005 11:06

Ağdaki bilgisayarların ad ve ip nolarını listeleme

Mesaj gönderen mhizar »

Arkadaşlar.Bir bilgisayarın bağlı bulunduğu lokal ağdaki pclerin adlarını ve ip nolarını listeletmek istiyorum.Belki çok basittir ama yapamayınca zor. :oops: Bununlar ilgili arama yaptım ama bulamadım?yardımcı olacak arkadaşlara şimdiden teşekkür ederim.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Aşağıdaki kodları bir unit olarak kaydedin,

Kod: Tümünü seç

unit findcomp;

interface

uses
  Windows, Classes;

function FindComputers: DWORD;
function HostToIPAddr(Name: string; var Ip: string): Boolean;

var
  Computers: TStringList;

implementation

uses
  SysUtils, winsock;

const
  MaxEntries = 500;


function HostToIPAddr(Name: string; var Ip: string): Boolean;
var
  wsdata : TWSAData;
  hostName : array [0..255] of char;
  hostEnt : PHostEnt;
  addr : PChar;
begin
  WSAStartup ($0101, wsdata);
  try
    gethostname (hostName, sizeof (hostName));
    StrPCopy(hostName, Name);
    hostEnt := gethostbyname (hostName);
    if Assigned (hostEnt) then
      if Assigned (hostEnt^.h_addr_list) then begin
        addr := hostEnt^.h_addr_list^;
        if Assigned (addr) then begin
          IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
          byte (addr [1]), byte (addr [2]), byte (addr [3])]);
          Result := True;
        end
        else
          Result := False;
      end
      else
        Result := False
    else begin
      Result := False;
    end;
  finally
    WSACleanup;
  end
end;


function FindComputers: DWORD;

var
  EnumbilgHandle, EnumWorkGroupHandle, EnumComputerHandle: THandle;
  EnumError: DWORD;
  Network: TNetResource;
  bilgEntries, WorkGroupEntries, ComputerEntries: DWORD;
  EnumbilgBuffer, EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
  bilgEnumbufferlength, workEnumbufferlength, compEnumBufferLength: DWORD;
  k,I, J: DWORD;
  st : string;

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;
          workEnumBufferLength := SizeOf(EnumWorkGroupBuffer);
          EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, workEnumBufferLength);
          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;
                                   compEnumBufferLength := SizeOf(EnumComputerBuffer);
                                   EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, compEnumBufferLength);
                                   if EnumError = NO_ERROR then
                                      begin
                                           for j := 1 to computerEntries do
                                               begin
                                                    Computers.Add(EnumcomputerBuffer[j].lpRemoteName);

                                                    EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumcomputerBuffer[J], EnumbilgHandle);
                                                    if EnumError = NO_ERROR then
                                                       begin
                                                            bilgEntries := MaxEntries;
                                                            bilgEnumBufferLength := SizeOf(EnumbilgBuffer);
                                                            EnumError := WNetEnumResource(EnumbilgHandle, bilgEntries, @EnumbilgBuffer, bilgEnumBufferLength);
                                                            if EnumError = NO_ERROR then
                                                               for k := 1 to bilgEntries do
                                                                   begin
                                                                        st := EnumbilgBuffer[k].lpRemoteName;
                                                                        delete(st,1,2);
                                                                        Computers.Add('  '+st);
                                                                   end;
                                                            WNetCloseEnum(EnumbilgHandle);
                                                       end;
                                               end;
                                      end;

                                   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.

sonra projenizin uses kısmına bunu ekleyin.
Meselâ bir buton ve listbox koyun,butonclik e yazın

Kod: Tümünü seç

FindComputers;
listbox.items:=Computers;
Listboxta ağdaki PCleri göreceksiniz.

Aynı unit içindeki HostToIPAddr fonksiyonu adını verdiğiniz bilgisayarın IP nosunu gönderir, örneğin bir başka butan daha ekleyip listboxtan seçtiğiniz bilgisayr adının IP sini showmessage olarak gösterilim,

Kod: Tümünü seç

var
IP:String;
begin
HostToIPAddr(ListBox1.Items[ListBox1.ItemIndex],IP);
ShowMessage(IP);
end;
Kolay gelsin.
Volkan KAMADAN
www.polisoft.com.tr
mhizar
Üye
Mesajlar: 78
Kayıt: 30 May 2005 11:06

Mesaj gönderen mhizar »

@vkamadan çok teşekkür ederim.bu kod pcleri çok güzel bir şekilde listeletiyor.Ayrıca @mrmarman'ında bu konuda bir kodunu buldum forumda.Ancak şöyle bir sorun var.Her iki durumda da.

Bu bilgisayar adlarını listelerttikten sonra bu kod ip numaralarını döndürmüyor.

Aşağıdaki kodda @mrmarmanın verdiği kod.Bu ip numaralarını veriyor.Ancak bilgisayar paylaşıma açık değilse ip numarasını null döndürüyor.Yani sadece ağdaki bilgisayarların paylaşıma açık olanlarının ip numaralarını döndürüyor.Acaba paylaşıma açık olmasada ip numarasını alabilirmiyiz.
Teşekkürler....

Kod: Tümünü seç

function GetAddressByName(name : string) : string;
var
wsdata : TWSAData;
  he : PHostEnt;
  ss : pchar;
  ip : TInAddr;
begin
WSAStartup(MakeWord(1, 1), wsdata);
  he := gethostbyname(pchar(name));
  if he<>nil then
  begin
   ip.S_addr := integer(pointer(he^. h_addr_list^)^);
     ss := inet_ntoa(ip);
     Result := string(ss);
  end;
  WSACleanup();
end;
erkankurtaga
Üye
Mesajlar: 62
Kayıt: 04 Oca 2009 06:36

Mesaj gönderen erkankurtaga »

vkamadan yazdı:Aşağıdaki kodları bir unit olarak kaydedin,

Kod: Tümünü seç

unit findcomp;

interface

uses
  Windows, Classes;

function FindComputers: DWORD;
function HostToIPAddr(Name: string; var Ip: string): Boolean;

var
  Computers: TStringList;

implementation

uses
  SysUtils, winsock;

const
  MaxEntries = 500;


function HostToIPAddr(Name: string; var Ip: string): Boolean;
var
  wsdata : TWSAData;
  hostName : array [0..255] of char;
  hostEnt : PHostEnt;
  addr : PChar;
begin
  WSAStartup ($0101, wsdata);
  try
    gethostname (hostName, sizeof (hostName));
    StrPCopy(hostName, Name);
    hostEnt := gethostbyname (hostName);
    if Assigned (hostEnt) then
      if Assigned (hostEnt^.h_addr_list) then begin
        addr := hostEnt^.h_addr_list^;
        if Assigned (addr) then begin
          IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
          byte (addr [1]), byte (addr [2]), byte (addr [3])]);
          Result := True;
        end
        else
          Result := False;
      end
      else
        Result := False
    else begin
      Result := False;
    end;
  finally
    WSACleanup;
  end
end;


function FindComputers: DWORD;

var
  EnumbilgHandle, EnumWorkGroupHandle, EnumComputerHandle: THandle;
  EnumError: DWORD;
  Network: TNetResource;
  bilgEntries, WorkGroupEntries, ComputerEntries: DWORD;
  EnumbilgBuffer, EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
  bilgEnumbufferlength, workEnumbufferlength, compEnumBufferLength: DWORD;
  k,I, J: DWORD;
  st : string;

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;
          workEnumBufferLength := SizeOf(EnumWorkGroupBuffer);
          EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, workEnumBufferLength);
          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;
                                   compEnumBufferLength := SizeOf(EnumComputerBuffer);
                                   EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, compEnumBufferLength);
                                   if EnumError = NO_ERROR then
                                      begin
                                           for j := 1 to computerEntries do
                                               begin
                                                    Computers.Add(EnumcomputerBuffer[j].lpRemoteName);

                                                    EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumcomputerBuffer[J], EnumbilgHandle);
                                                    if EnumError = NO_ERROR then
                                                       begin
                                                            bilgEntries := MaxEntries;
                                                            bilgEnumBufferLength := SizeOf(EnumbilgBuffer);
                                                            EnumError := WNetEnumResource(EnumbilgHandle, bilgEntries, @EnumbilgBuffer, bilgEnumBufferLength);
                                                            if EnumError = NO_ERROR then
                                                               for k := 1 to bilgEntries do
                                                                   begin
                                                                        st := EnumbilgBuffer[k].lpRemoteName;
                                                                        delete(st,1,2);
                                                                        Computers.Add('  '+st);
                                                                   end;
                                                            WNetCloseEnum(EnumbilgHandle);
                                                       end;
                                               end;
                                      end;

                                   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.

sonra projenizin uses kısmına bunu ekleyin.
Meselâ bir buton ve listbox koyun,butonclik e yazın

Kod: Tümünü seç

FindComputers;
listbox.items:=Computers;
Listboxta ağdaki PCleri göreceksiniz.

Aynı unit içindeki HostToIPAddr fonksiyonu adını verdiğiniz bilgisayarın IP nosunu gönderir, örneğin bir başka butan daha ekleyip listboxtan seçtiğiniz bilgisayr adının IP sini showmessage olarak gösterilim,

Kod: Tümünü seç

var
IP:String;
begin
HostToIPAddr(ListBox1.Items[ListBox1.ItemIndex],IP);
ShowMessage(IP);
end;
Kolay gelsin.
vkamadan hocam verdiğiniz kodlar windows 8 de çalışır mı çalışmaz ise ne yapmamız lazım. kolay gelsin.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Ağdaki bilgisayarların ad ve ip nolarını listeleme

Mesaj gönderen vkamadan »

MErhaba ,
Bildiğim kadarıyla Windows 8, alt yapı olarak Windows 7 den ciddi farklılıklar içermiyor, şahsen uzun uzun kullanmadım win 8 i, fakat tüm sistemini win 8 e çevirmiş bir sistemci arkadaşımdan aldığım bilgiye göre win 7 de çalışıp win 8 de çalışmayan program yokmuş.
Volkan KAMADAN
www.polisoft.com.tr
erkankurtaga
Üye
Mesajlar: 62
Kayıt: 04 Oca 2009 06:36

Mesaj gönderen erkankurtaga »

Cevabınız için teşekkürler.
Verdiğiniz kod ile bilgisayarları win7 de bulabiliyorum fakat, win8 bilgisayarları getirmiyor. Sizce sebebi ne olabilir.
Kolay gelsin.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re:

Mesaj gönderen vkamadan »

erkankurtaga yazdı:Cevabınız için teşekkürler.
Verdiğiniz kod ile bilgisayarları win7 de bulabiliyorum fakat, win8 bilgisayarları getirmiyor. Sizce sebebi ne olabilir.
Kolay gelsin.
Programınızı yönetici olarak ve winXP yada Win7 uyumluluk modun da çalıştırdığınız da da sorun devam ediyor mu? Ediyorsa maalesef daha detaylı malumatım yok konu hakkında.
Volkan KAMADAN
www.polisoft.com.tr
Cevapla