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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Beitrag von AND51 »

Hallo!

Ich habe gerade eine Procedure geschrieben, die alle sichtbaren Computer im LAN Netzwerk auflistet, funktioniert unter Windows NT, 2000, XP und Vista, benötigt PB 4 oder höher.

Ich weiß, das gibt es schon. Ich habe mich an dem im Codearchiv vorhandenen Code orientiert. Jedoch ist dieser Code in 3.94er-Manier geschrieben, d. h. 'EnableExplicit' funktioniert schon mal nicht.

Noch etwas ganz wichtiges: blbltheworm benutzt beispielsweise WideCharToMultiByte_(), ich ersetze das einfach durch PeekS(). Auch benutze ich weniger Variablen und benötigte Konstanten und Strukturen werden nur definiert, wenn sie noch nicht definiert worden sind (Defined()).
  • Code: Alles auswählen

    Procedure.l getLanComputer(list.s()) ; by AND51, Mar/2007
    	Protected *buffer, found.l, n.l, result.l
    	CompilerIf ~Defined(MAX_PREFERRED_LENGTH, #PB_Constant)
    		#MAX_PREFERRED_LENGTH=-1
    	CompilerEndIf
    	CompilerIf ~Defined(SV_TYPE_ALL, #PB_Constant)
    		#SV_TYPE_ALL=$FFFFFFFF
    	CompilerEndIf
    	CompilerIf ~Defined(SERVER_INFO_100, #PB_Structure)
    		Structure SERVER_INFO_100
    			platform_id.l
    			name.l
    		EndStructure
    	CompilerEndIf
    	Protected infoblock.SERVER_INFO_100
    	
    	result=NetServerEnum_(0, 100, @*buffer, #MAX_PREFERRED_LENGTH, @found, @n, #SV_TYPE_ALL, 0, 0)
    	
    	For n=0 To found-1
    		CopyMemory(*buffer+SizeOf(SERVER_INFO_100)*n, @infoblock, SizeOf(SERVER_INFO_100))
    		AddElement(list())
    			list()=PeekS(infoblock\name, -1, #PB_Unicode)
    	Next
    	
    	NetApiBufferFree_(*buffer)
    	ProcedureReturn result
    EndProcedure
    
    
    NewList computer.s()
    getLanComputer(computer())
    ForEach computer()
    	Debug computer()
    Next
    Benötigt PB 4.00 oder höher. Auf XP SP2 erfolgreich getestet.

Handhabung: Man beglücke die Procedure nur mit einer LinkedList vom Typ String, das war's. Es werden nur die Hostnamen zurückgegeben (z. B. "HomePC"), zu denen kann man sofort eine Verbindung herstellen (OpenNetworkConnection("HomePC", 1234)).

Wer ausführlichere Informationen wünscht, stellt die Structure um von 'Structure_Info_100' auf 'Structure_Info_101' (siehe MSDN).


@ Andre: Können wir eventuell das vorhandene Beispiel im CodeArchiv durch meines ersetzen?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Mal ein Echo.

Funktioniert :allright:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Vielen Dank! :D
Auf welchem System hast du den Code getestet? Auch XP?

Ach ja: Ich vergaß zu erwähnen, dass die Procedure 0 zurückgibt, wenn alles OK ist. Es gibt noch 2 anderere Ferhlercodes, dazu einfach mal in der MSDN zu dem Befehl "NetServerEnum" nachschauen.


Tipp/Trick: Nachdem die Procedure eure LinkedList gefüttert hat, könnt ihr mit CountList() zählen, wie viele Computer gefunden wurden. :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Funktioniert (XP,SP2) :allright:

> Wer ausführlichere Informationen wünscht, stellt die Structure um von 'Structure_Info_100' auf 'Structure_Info_101' (siehe MSDN).

Was genau sind das für Informationen? Wie frage ich die ab?
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Du kannst den von mir verwendeten Befehl "NetServerEnum" so modifizieren, dass du beim Parameter "servertype" angibst, welche Arten von Computer du abfragen möchtest. Ich mache das so, dass möglichst alle rechner erfasst werden, du kannst aber auch sagen, dass nur bestimmte Server-Arten angezeigt werden (Domain-Server, Backup-Server, SQL-Server, ...).
Wenn du noch ausführlichere Informationen haben willst, ändere die Structure von 100 auf 101 (siehe MSDN, den Link, den ich gegeben habe).

Dann kannst du u. a. folgende Informationen zu jedem Rechner erhalten:
  • verwendete Windows-Version
  • Kommentar (Kurzbeschreibung des Rechners)
  • Server-Typ
Hier steht, wie die Struktur 101 zu definieren ist: http://msdn2.microsoft.com/en-us/library/aa370903.aspx

Viel Spaß! :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Hallo Leute,

ich habe gerade mal etwas mit der 101 Structur rumgespielt. Da die sv101_type variable 23 Funktionen beschreibt, habe ich diese einfach nur als HEX Wert angezeigt. Nachzulesen sind die Funktionen im "WIN 32 Programmers Reference" Text (WIN32.hlp)...

Gruß Michael

Code: Alles auswählen

Procedure.s getLanVersion (LanMajorVersion.l,LanMinorVersion.l,Platform.l) 
   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 :       GetLanVersionString = "WIN VISTA"
        EndSelect
      Case 600 : GetLanVersionString = "OSF"
      Case 700 : GetLanVersionString = "VMS"
   EndSelect

   ProcedureReturn GetLanVersionString
EndProcedure 


Procedure.l getLanComputer(list.s()) ; by AND51, Mar/2007 
   Protected *buffer, found.l, n.l, result.l 
   CompilerIf ~Defined(MAX_PREFERRED_LENGTH, #PB_Constant) 
      #MAX_PREFERRED_LENGTH=-1 
   CompilerEndIf 
   CompilerIf ~Defined(SV_TYPE_ALL, #PB_Constant) 
      #SV_TYPE_ALL=$FFFFFFFF 
   CompilerEndIf 
   CompilerIf ~Defined(SERVER_INFO_101, #PB_Structure) 
      Structure SERVER_INFO_101 
         platform_id.l 
         name.l
         version_major.l
         version_minor.l
         type.l 
         comment.l
      EndStructure 
   CompilerEndIf 
   Protected infoblock.SERVER_INFO_101 
    
   result=NetServerEnum_(0, 101, @*buffer, #MAX_PREFERRED_LENGTH, @found, @n, #SV_TYPE_ALL, 0, 0) 
       
   For n=0 To found-1 
      CopyMemory(*buffer+SizeOf(SERVER_INFO_101)*n, @infoblock, SizeOf(SERVER_INFO_101)) 
      AddElement(list()) 
      list()=PeekS(infoblock\name, -1, #PB_Unicode)
      list() = list() +" / " + getLanVersion (infoblock\version_major.l, infoblock\version_minor.l,infoblock\platform_id)
      list() = list() +" / Type: " + Hex(infoblock\type.l) + " / " + PeekS(infoblock\comment, -1, #PB_Unicode)
   Next 
    
   NetApiBufferFree_(*buffer) 
   ProcedureReturn result 
EndProcedure 

NewList computer.s() 
getLanComputer(computer()) 
ForEach computer() 
   Debug computer() 
Next
Working on :lol: - LibSGD - MP3D Engine - 8)
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 »

Hallo,
hatte genau das gesucht, lief aber vom Syntax her mit PB4.51 nicht. Dank PB-Hilfe war´s aber schnell korrigiert.
Deshalb nun hier die angepassten Versionen von AND51 :allright: und mpz :allright: , vielleicht nutzt´s ja dem einen oder anderen ....

AND51 neu:

Code: Alles auswählen

Procedure.l getLanComputer(List LanComputer.s())    ; by AND51, Mar/2007
   Protected *buffer, found.l, n.l, result.l
   CompilerIf ~Defined(MAX_PREFERRED_LENGTH, #PB_Constant)
      #MAX_PREFERRED_LENGTH=-1
   CompilerEndIf
   CompilerIf ~Defined(SV_TYPE_ALL, #PB_Constant)
      #SV_TYPE_ALL=$FFFFFFFF
   CompilerEndIf
   CompilerIf ~Defined(SERVER_INFO_100, #PB_Structure)
      Structure SERVER_INFO_100
         platform_id.l
         name.l
      EndStructure
   CompilerEndIf
   Protected infoblock.SERVER_INFO_100
   
   result=NetServerEnum_(0, 100, @*buffer, #MAX_PREFERRED_LENGTH, @found, @n, #SV_TYPE_ALL, 0, 0)
   
   For n=0 To found-1
      CopyMemory(*buffer+SizeOf(SERVER_INFO_100)*n, @infoblock, SizeOf(SERVER_INFO_100))
      AddElement(LanComputer())
      LanComputer() = PeekS(infoblock\name, -1, #PB_Unicode)
   Next
   
   NetApiBufferFree_(*buffer)
   ProcedureReturn result
EndProcedure

NewList computer.s()
getLanComputer(computer())
ForEach computer()
   Debug computer()
Next
End
mpz neu: (und rudimentär mit Win7 Meldung ergänzt)

Code: Alles auswählen

Procedure.s getLanVersion (LanMajorVersion.l,LanMinorVersion.l,Platform.l)
   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.l getLanComputer(List LanComputer.s())   ; by AND51, Mar/2007
   Protected *buffer, found.l, n.l, result.l
   CompilerIf ~Defined(MAX_PREFERRED_LENGTH, #PB_Constant)
      #MAX_PREFERRED_LENGTH=-1
   CompilerEndIf
   CompilerIf ~Defined(SV_TYPE_ALL, #PB_Constant)
      #SV_TYPE_ALL=$FFFFFFFF
   CompilerEndIf
   CompilerIf ~Defined(SERVER_INFO_101, #PB_Structure)
      Structure SERVER_INFO_101
         platform_id.l
         name.l
         version_major.l
         version_minor.l
         type.l
         comment.l
      EndStructure
   CompilerEndIf
   Protected infoblock.SERVER_INFO_101
   
   result=NetServerEnum_(0, 101, @*buffer, #MAX_PREFERRED_LENGTH, @found, @n, #SV_TYPE_ALL, 0, 0)
       
   For n=0 To found-1
      CopyMemory(*buffer+SizeOf(SERVER_INFO_101)*n, @infoblock, SizeOf(SERVER_INFO_101))
      AddElement(LanComputer())
      LanComputer()=PeekS(infoblock\name, -1, #PB_Unicode)
      LanComputer() = LanComputer() +" / " + getLanVersion (infoblock\version_major.l, infoblock\version_minor.l,infoblock\platform_id)
      LanComputer() = LanComputer() +" / Type: " + Hex(infoblock\type.l) + " / " + PeekS(infoblock\comment, -1, #PB_Unicode)
   Next
   
   NetApiBufferFree_(*buffer)
   ProcedureReturn result
EndProcedure

NewList computer.s()
getLanComputer(computer())
ForEach computer()
   Debug computer()
Next
End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Beitrag von ts-soft »

Enthält immer noch dieselben Fehler wie von Anfang an :mrgreen:
Sieht den keiner die Unlogik? Bei jedem CompilerIf Defined fehlt das = 0 am Ende:
Ihr wollt den Konstanten einen Wert geben, falls Sie existiert :mrgreen:
bzw. die Structure erstellen, aber nur wenn Sie bereits existiert :mrgreen:

Code: Alles auswählen

   CompilerIf Defined(MAX_PREFERRED_LENGTH, #PB_Constant) = 0
      #MAX_PREFERRED_LENGTH=-1
   CompilerEndIf
   CompilerIf Defined(SV_TYPE_ALL, #PB_Constant) = 0
      #SV_TYPE_ALL=$FFFFFFFF
   CompilerEndIf
   CompilerIf Defined(SERVER_INFO_100, #PB_Structure) = 0
      Structure SERVER_INFO_100
         platform_id.l
         name.l
      EndStructure
   CompilerEndIf
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Beitrag von CSHW89 »

Siehst du denn das '~' vor den 'Defined's nicht :mrgreen:

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Beitrag von ts-soft »

CSHW89 hat geschrieben:Siehst du denn das '~' vor den 'Defined's nicht :mrgreen:

lg kevin
Nein, und der Code funktioniert nicht.

Hab aber gerade bemerkt, das Greasemonkey das verursacht.
Trotzdem, unmöglicher Stil.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten