Seite 1 von 3

Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 09.03.2007 20:34
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?

Verfasst: 11.03.2007 14:15
von mk-soft
Mal ein Echo.

Funktioniert :allright:

Verfasst: 11.03.2007 19:33
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:

Verfasst: 11.03.2007 21:07
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?

Verfasst: 11.03.2007 21:28
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ß! :)

Verfasst: 14.03.2007 16:13
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

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 02:58
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

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 07:30
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

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 14:18
von CSHW89
Siehst du denn das '~' vor den 'Defined's nicht :mrgreen:

lg kevin

Re: Alle Computer im LAN auflisten »»» GetComputerNameInLAN

Verfasst: 29.12.2010 15:04
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