Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Beitrag von Nino »

PMV hat geschrieben::lol:

Und als was steht Defined() hinter CompilerIf? Als einer der beiden
Ausdrücke, die der Compiler auswertet :wink:
Ja, so hatte ich es geschrieben.
PMV hat geschrieben:Das Defined() intern natürlich als Ergebnis ein "Rückgabewert" hat, der mit
dem 2. Audruck verglichen wird ... ist ja wohl klar :?
So steht's jedenfalls in der Dokumentation:
Ergebnis = Defined(Name, Typ)
Schön, dass Du auch dieser Ansicht bist. :allright:
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Beitrag von TheCube »

Nanu, was ist denn hier los ? :o Hatte die orginalen Compilerdirektiven für meinen Code eh´rausgeschmissen, weil nicht benötigt.
Gäbe es denn an folgender Lösung mit PB-Boardmitteln was auszusetzen ? (In real-life natürlich ohne Debug ...)

Code: Alles auswählen

   ....
   CompilerIf Defined(MAX_PREFERRED_LENGTH, #PB_Constant)
      Debug "Konstante bekannt"
      CompilerElse
      Debug "Konstante war unbekannt"
      #MAX_PREFERRED_LENGTH=-1
   CompilerEndIf
   ....
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Beitrag von Max_der_Held »

Wahrscheinlich gefällt jemandem dein "CodeStil" nicht :D:D
das Compilerelse ist eingerückt so hässlich ;P

(wenn jemand code postet ist das normal die erste Antwort.. räum dein Code auf!. ;P)

aber: nein, der ist voll Funktionstüchtig und Einsatzbereit!

mir gefällt er sogar :)

im Elektronikerforum sehen Codes... "anders"... aus..

guten Rutsch!!
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Beitrag von Bisonte »

Und wieder ontopic ;)
Da ich gerade die etwas ausführlicheren Fehlernummern brauchte, eine etwas erweiterte Version. (Hab mir das als Userlib gebastelt...)
Im Grunde nichts weltbewegendes, aber für "tippfaule" die gesamten SV_TYPE_ Konstanten ;)
und halt mit expliziter Suchauswahl ... z.B. nur Novell Rechner usw.

Code: Alles auswählen

EnableExplicit

CompilerIf Defined(MAX_PREFERRED_LENGTH, #PB_Constant) = 0
#MAX_PREFERRED_LENGTH=-1
CompilerEndIf

CompilerIf Defined(SV_TYPE_WORKSTATION, #PB_Constant) = 0
#SV_TYPE_WORKSTATION        = $00000001;A workstation.
#SV_TYPE_SERVER             = $00000002;A server.
#SV_TYPE_SQLSERVER          = $00000004;A server running With Microsoft SQL Server.
#SV_TYPE_DOMAIN_CTRL        = $00000008;A primary domain controller.
#SV_TYPE_DOMAIN_BAKCTRL     = $00000010;A backup domain controller.
#SV_TYPE_TIME_SOURCE        = $00000020;A server running the Timesource service.
#SV_TYPE_AFP                = $00000040;A server running the Apple Filing Protocol (AFP) file service.
#SV_TYPE_NOVELL             = $00000080;A Novell server.
#SV_TYPE_DOMAIN_MEMBER      = $00000100;A LAN Manager 2.x domain member.
#SV_TYPE_PRINTQ_SERVER      = $00000200;A server that shares a print queue.
#SV_TYPE_DIALIN_SERVER      = $00000400;A server that runs a dial-in service.
#SV_TYPE_XENIX_SERVER       = $00000800;A Xenix Or Unix server.
#SV_TYPE_NT                 = $00001000;A workstation Or server.
#SV_TYPE_WFW                = $00002000;A computer that runs Windows For Workgroups.
#SV_TYPE_SERVER_MFPN        = $00004000;A server that runs the Microsoft File And Print For NetWare service.
#SV_TYPE_SERVER_NT          = $00008000;Any server that is Not a domain controller.
#SV_TYPE_POTENTIAL_BROWSER  = $00010000;A computer that can run the browser service.
#SV_TYPE_BACKUP_BROWSER     = $00020000;A server running a browser service As backup.
#SV_TYPE_MASTER_BROWSER     = $00040000;A server running the master browser service.
#SV_TYPE_DOMAIN_MASTER      = $00080000;A server running the domain master browser.
#SV_TYPE_SERVER_OSF         = $00100000;A computer that runs OSF.
#SV_TYPE_SERVER_VMS         = $00200000;A computer that runs VMS.
#SV_TYPE_WINDOWS            = $00400000;A computer that runs Windows.
#SV_TYPE_DFS                = $00800000;A server that is the root of a DFS tree.
#SV_TYPE_CLUSTER_NT         = $01000000;A server cluster available in the domain.
#SV_TYPE_TERMINALSERVER     = $02000000;A server that runs the Terminal Server service.
#SV_TYPE_CLUSTER_VS_NT      = $04000000;Cluster virtual servers available in the domain. Note : Windows 2000:  This value is Not supported.
#SV_TYPE_DCE                = $10000000;A server that runs the DCE Directory And Security Services Or equivalent.
#SV_TYPE_ALTERNATE_XPORT    = $20000000;A server that is returned by an alternate transport.
#SV_TYPE_LOCAL_LIST_ONLY    = $40000000;A server that is maintained by the browser
#SV_TYPE_DOMAIN_ENUM        = $80000000;A primary domain.
#SV_TYPE_ALL                = $FFFFFFFF;All Computer
CompilerEndIf

CompilerIf Defined(SERVER_INFO_101, #PB_Structure) = 0
Structure SERVER_INFO_101
  platform_id.i
  name.i
  version_major.i
  version_minor.i
  type.i
  comment.i
EndStructure
CompilerEndIf

CompilerIf Defined(SERVER_INFO_PB, #PB_Structure) = 0
Structure SERVER_INFO_PB
  Name.s
  Platform.s
  Type.i
  Comment.s
EndStructure
CompilerEndIf

Procedure.s NetServerEnumError(ErrorCode.i)
  
  Protected Result.s
  
  Select ErrorCode
    Case 5
      Result = "ERROR_ACCESS_DENIED" ;Access was denied.
    Case 87
      Result = "ERROR_INVALID_PARAMETER";The parameter is incorrect.
    Case 234
      Result = "ERROR_MORE_DATA";More entries are available. Specify a large enough buffer To receive all entries.
    Case 6118
      Result = "ERROR_NO_BROWSER_SERVERS_FOUND";No browser servers found.
    Case 50
      Result = "ERROR_NOT_SUPPORTED";The request is Not supported.
    Case 2114
      Result = "NERR_ServerNotStarted";The server service is Not started.
    Case 2184
      Result = "NERR_ServiceNotInstalled";The service has Not been started.
    Case 2138
      Result = "NERR_WkstaNotStarted";The Workstation service has Not been started. The local workstation service is used To communicate With a downlevel remote server.
    Default 
      Result = Chr(34)+Str(ErrorCode)+Chr(34)+" Unknown Error - check http://msdn.microsoft.com/en-us/library/aa370623.aspx For more info"
  EndSelect
  
  ProcedureReturn Result

EndProcedure
Procedure.s getLanVersion(LanMajorVersion.l,LanMinorVersion.l,Platform.l)
   Protected GetLanVersionString.s
   
   Select Platform
      Case 300 : GetLanVersionString = "DOS"
     
      Case 400
         Select LanMajorVersion
           Case 4
                Select LanMinorVersion
                    Case 0  : GetLanVersionString = "WIN95/OSR2"
                    Case 1  : GetLanVersionString = "WIN98/SE"
                    Case 90 : GetLanVersionString = "WIN ME"
                EndSelect
           EndSelect
       Case 500
         Select LanMajorVersion
            Case 4: GetLanVersionString = "WIN NT"
            Case 5
              Select LanMinorVersion
                 Case 0  : GetLanVersionString = "WIN 2000"
                 Case 1  : GetLanVersionString = "WIN XP/SP2"
                 Case 2  : GetLanVersionString = "WIN 2003 Server"
              EndSelect
            Case 6
               Select LanMinorVersion
                 Case 0  : GetLanVersionString = "WIN VISTA"
                 Case 1  : GetLanVersionString = "WIN 7"
               EndSelect                                   
         EndSelect
      Case 600 : GetLanVersionString = "OSF"
      Case 700 : GetLanVersionString = "VMS"
   EndSelect

   ProcedureReturn GetLanVersionString
EndProcedure
Procedure.s GetLanComputer(List Computer.SERVER_INFO_PB(), Searchmask.i = #SV_TYPE_ALL)
  
  Protected Result.i, Found.i, n.i
  Protected infoblock.SERVER_INFO_101
  Protected *Buffer
  
  Result = NetServerEnum_(0, 101, @*buffer, #MAX_PREFERRED_LENGTH, @found, @n, Searchmask, 0, 0)
  
  If Result
    NetApiBufferFree_(*buffer)
    ProcedureReturn NetServerEnumError(Result)
  Else
    For n=0 To Found-1
      CopyMemory(*buffer+SizeOf(SERVER_INFO_101)*n, @infoblock, SizeOf(SERVER_INFO_101))
      AddElement(Computer())
      Computer()\Name     = PeekS(infoblock\name, -1, #PB_Unicode)

      Computer()\Platform = getLanVersion(infoblock\version_major.i, infoblock\version_minor.i,infoblock\platform_id)
      Computer()\Type     = infoblock\type.i
      Computer()\Comment  = PeekS(infoblock\comment, -1, #PB_Unicode)
      
    Next
    NetApiBufferFree_(*buffer)
    ProcedureReturn "Ok."
  EndIf
  
EndProcedure

;##### Beispiel

NewList cc.SERVER_INFO_PB()
GetLanComputer(cc(),#SV_TYPE_ALL)
ForEach cc()
  Debug cc()\Name + " : "+cc()\Platform
Next
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Beitrag von STARGÅTE »

Tachchen,

auch ich verwende eine etwas abgeänderte Variante um die "Computer" im LAN aufzulisten ...

Leider arbeitet die Prozedur aber nur mit meinem "echten LAN" zuhause, ich möchte jedoch auch, das Computer eines virtuelles LANs aufgelistet werden (zB benutzer unter Hamachi) gibt es da eine Möglichkeit ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten