Alle PC-Namen eines Netzwerkes erhalten
gibt es im delphi eine möglichkeit, eine liste mit allen ans netzwerk angeschlossene PCs zu erhalten?
|
Moin Illuminator,
such' mal hier noch WNetEnumResource. Das hatten wir schon. |
Hiho ...
hier hab ich maln Code dafür:
Code:
type
PNetResourceArray = ^TNetResourceArray; TNetResourceArray = array[0..100] of TNetResource; function CreateNetResourceList(ResourceType: DWord; NetResource: PNetResource; out Entries: DWord; out List: PNetResourceArray): Boolean; var EnumHandle: THandle; BufSize: DWord; Res: DWord; begin Result := False; List := Nil; Entries := 0; if WNetOpenEnum(RESOURCE_GLOBALNET, ResourceType, 0, NetResource, EnumHandle) = NO_ERROR then begin try BufSize := $4000; // 16 kByte GetMem(List, BufSize); try repeat Entries := DWord(-1); FillChar(List^, BufSize, 0); Res := WNetEnumResource(EnumHandle, Entries, List, BufSize); if Res = ERROR_MORE_DATA then begin ReAllocMem(List, BufSize); end; until Res <> ERROR_MORE_DATA; Result := Res = NO_ERROR; if not Result then begin FreeMem(List); List := Nil; Entries := 0; end; except FreeMem(List); raise; end; finally WNetCloseEnum(EnumHandle); end; end; end; procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: TStrings); procedure ScanLevel(NetResource: PNetResource); var Entries: DWord; NetResourceList: PNetResourceArray; i: Integer; begin if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try for i := 0 to Integer(Entries) - 1 do begin if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or (NetResourceList[i].dwDisplayType = DisplayType) then begin List.AddObject(NetResourceList[i].lpRemoteName, Pointer(NetResourceList[i].dwDisplayType)); end; if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then ScanLevel(@NetResourceList[i]); end; finally FreeMem(NetResourceList); end; end; begin ScanLevel(Nil); end;
Code:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, ListBox1.Items); end; hoffe es klappt bei dir! Bei mir klappts zumindest! ^^ cu Trouble_Maker |
Re: Alle PC-Namen eines Netzwerkes erhalten
Hi zusammen!
Ich habe ein Pronlem... Mein Informatiklehrer hat gemeint, dass keiner aus unserer Klasse das schaft, sich die Netzwerk-PCs unseres Internetraums in einer ListBox anzeigen zu lassen. Doch ich habe gesagt, dass ich's schaffe (blöd von mir!) Jetzt habe ich den obigen Code verwendet, aber mein Programm listet mir nur folgendes auf: \\EASYSERVER, obwohl mind. 10 PC angeschaltet sind. Was mache ich falsch?? :x Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
ich hab' den Code eben mal ausprobiert, der tut's einwandfrei. Kannst Du aus Windows heraus die anderen Rechner in der Netzwerkumgebung sehen? Wenn für die Workstations das Browsing abgeschaltet ist, werden sie dort nämlich auch nicht angezeigt. |
Re: Alle PC-Namen eines Netzwerkes erhalten
Hi!
Wenn ich an die Benutzer per Net Send Befehle schicke, dann geht das, falls du das meinst. Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
nein, das meine ich nicht. Das die Rechner mit ihren Namen erreichbar sind, hat nichts damit zu tun, ob man sie in der Netzwerkumgebung sehen kann oder nicht. Das ist so ähnlich wie mit den versteckten Freigaben. Sie sind da, man kann sie sich verbinden, bzw. darauf zugreifen, aber im Explorer sehen kann man sie nicht. Wenn Du in den Explorer gehst, Netzwerkumgebung, und da mal schaust (Netzwerkumgebung, dann in Microsoft Windows-Netzwerk), müssten die Domänen/Arbeitsgruppen zu sehen sein, soweit verfügbar, und darin wieder die einzelnen Rechner. Deshalb meine Frage: Sind die Rechner da zu sehen? Wenn nicht, hat sich euer Lehrer nämlich eine "kleine Gemeinheit" einfallen lassen ;-) |
Re: Alle PC-Namen eines Netzwerkes erhalten
Ich bin grad nicht in der Schule, aber ich glaube in der Netzwerkumgebung sind die Rechner nicht aufgeführt. Heißt das, mein Lehrer hatte Recht, als er sagte, das könne niemand von uns proggen?
|
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
wenn sie da nicht zu sehen sind, melden sie sich nicht beim Browserdienst (hat nichts mit dem Webbrowser zu tun). Dann dürfte es mit den WNetxxx Funktionen nicht machbar sein. Aber es gibt auch noch andere ;-) Auf welchem Betriebbsystem soll das Programm laufen? |
Re: Alle PC-Namen eines Netzwerkes erhalten
Na ja, es gäbe immernoch die BruteForce-Methode. Also alle erdenklichen Namen bilden und einen Verbindungsversuch starten. Könnte allerdings ein paar Tage dauern :mrgreen:
|
Re: Alle PC-Namen eines Netzwerkes erhalten
Hi!
Auf Windows 2000 Prof, wäre gut, wenn's auch unter XP laufen würde, aber das müsste es dann ja eigentlich. Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Chewie,
da würde ich lieber die IP-Adress Ranges durchpingen, und dann im Stile von Ping -a die zugehörigen Namen ermitteln. Wäre auch Brute Force, aber etwas gezielter ;-) |
Re: Alle PC-Namen eines Netzwerkes erhalten
Wenn das nicht Tage dauert, sondern nur wenige Minuten, dann wäre ich euch dankbar, wenn ich den Code für mich ändern könntet.
|
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
dann ist es ja gut. Entscheidend war für mich jetzt, dass es auf der NT Schiene (NT 4.0/W2K/XP...) läuft. Ich versuch' mal was zusammenzubasteln. |
Re: Alle PC-Namen eines Netzwerkes erhalten
Das wär echt genial, danke.
Heute schaffst du das nicht mehr, oder? Ich weiß, ich hab's euch recht spät gesagt, aber morgen habe ich wieder Informatik. (*zitter*) |
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
die Deklarationen:
Delphi-Quellcode:
Der Aufruf:
// mit xxx.H sind die Header Dateien von Microsoft gemeint,
// in denen die jeweiligen Dinge deklariert wurden const // aus LMCONS.H MAX_PREFERRED_LENGTH = DWORD(-1); // Alles was da ist raussuchen // aus LMERR.H NERR_Success = 0; // Funktion erfolgreich ausgeführt // aus LMSERVER.H SV_TYPE_ALL = $FFFFFFFF; // Alle Rechner (Server, Workstations) type // LMCONS.h NET_API_STATUS = DWORD; // aus LMSERVER.H // Datenstruktur für die zu ermittelnden Werte PSERVER_INFO_100 = ^SERVER_INFO_100; SERVER_INFO_100 = packed record sv100_platform_id : DWORD; sv100_name : PWideChar; end; // aus LMSERVER.h // Funktion die alle (bei prefmaxlen = MAX_PREFERRED_LENGTH) Rechner des Typs // servertype zurückliefert function NetServerEnum( const servername : PWideChar; const level : DWORD; const bufptr : Pointer; const prefmaxlen : DWORD; const entriesread : PDWORD; const totalentries : PDWORD; const servertype : DWORD; const domain : PWideChar; const resume_handle : PDWORD ) : NET_API_STATUS; stdcall; external 'netapi32.dll'; // aus LMAPIBUF.h // Da die Netxxx Funktionen unter NTff den Buffer selber reservieren // muss dieser mit dieser Funktion freigegeben werden function NetApiBufferFree( const Buffer : Pointer ) : NET_API_STATUS; stdcall; external 'netapi32.dll';
Delphi-Quellcode:
Wichtig:
procedure TfrmMAIN.Button1Click(Sender: TObject);
var pBuffer : PSERVER_INFO_100; // Pointer auf die zu ermittelnden Daten // da für die Freigabe des Buffers der Wert des Originalpointers erhalten // bleiben muss, dient diese Variable zum Abarbeiten des Buffers pWork : PSERVER_INFO_100; dwEntriesRead : DWORD; dwTotalEntries : DWORD; i : integer; dwResult : NET_API_STATUS; begin ListBox1.Items.Clear; // 1. Paramter muss nil sein // 2. Parameter = Daten des Typs 100 abrufen // 3. Parameter = Adresse (!!!) einer Variablen, die den Pointer auf den Buffer erhält // 4. Parameter = alle Rechner die dem Typ in Parameter 6 entsprechen auflisten // 5. Parameter = So viele Einträge wurden ausgelesen // 6. Parameter = So viele Einträge gäbe es // (muss gleich 4. sein, wenn MAX_PREFERRED_LENGTH angegeben wurde) // 7. Parameter = Alle Rechner // 8. Parameter = nil > In der primären Domäne (Arbeitsgruppe) suchen. // ggf. kann hier auch eine Domäne angegeben werden. // 9. Parameter muss 0 sein dwResult := NetServerEnum(nil,100,@pBuffer,MAX_PREFERRED_LENGTH,@dwEntriesRead,@dwTotalEntries,SV_TYPE_ALL,nil,0); if dwResult = NERR_SUCCESS then begin try pWork := pBuffer; for i := 1 to dwEntriesRead do begin // Die Namen der gefundenen Rechner in die ListBox schreiben ListBox1.Items.Add(pWork.sv100_name); // Da pWork typisiert ist, wird intern automatisch im die Länge der // der Struktur erhöht, deshalb reicht ein einfacher inc inc(pWork); end; finally NetApiBufferFree(pBuffer); end; end else begin MessageBox(self.Handle,PChar('NetServerEnum Fehler: '+IntToStr(dwResult)+#13#10#13#10+SysErrorMessage(dwResult)),'Fehler',MB_ICONERROR); end; end; Das funktioniert nicht unter 9x/ME, da hier die Funktionen anders aufgebaut sind, und sich in einer anderen DLL befinden. Da ich die Funktionen hier statisch eingebunden habe, würde das Programm unter 9x/ME nicht einmal starten. Ob man auf diesem Wege die ansonsten unsichtbaren Rechner erwischt weiss ich leider auch nicht. Mit den sichtbaren klappt's auf jeden Fall. [EDIT] Das sollte übrigens unabhängig von den Userrechten funktionieren. [/EDIT] |
Re: Alle PC-Namen eines Netzwerkes erhalten
Hey! Vielen Dank! :mrgreen: :mrgreen:
Da hast du dir aber viel Mühe gemacht, alle Achtung. Ich binde das jetzt in mein Prog ein und poste morgen, ob's geklappt hat. Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
bitte gerne. [EDIT] Ich bin auch mal zur Schule gegangen ;-) Leider gab's Informatik da noch nicht als Fach. [/EDIT] Allzuviel Mühe war's auch nicht, da ich die ganzen Deklarationen schon vor längerer Zeit mal übersetzt hatte. Das aufwendigste waren die Kommentare ;-) Was ich eben noch vergessen hatte: Es gibt die Deklartionen u.a. auch fertig von den JEDIs, aber da diese die Funktionen Delphi-Like importieren (also mit var Parametern) würden die sich mit meinen nicht vertragen. |
Re: Alle PC-Namen eines Netzwerkes erhalten
Hallo Chris!
Also, nochmals danke! Informatik ist bei uns auch freiwillig und nehme es jetzt auch in Klasse 12. Aber auch nur, weil programmieren mit Delphi wirklich Spaß macht. (im Gegensatz zu QBasic, was ich davor hatte :mrgreen: ). Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
ich jetzt mal auf das Ergebnis gespannt. Schau doch bitte auch auf jeden Fall mal nach, ob die Rechner wirklich nicht in der Netzwerkumgebung auftauchen (durften sie eigentlich nicht). |
Re: Alle PC-Namen eines Netzwerkes erhalten
Hi Chris!
Wenn ich in der Netzwerkumgebung auf gesamtes Netzwerk klicke, dann seh ich gar nichts. So ein Mist! Heißt das, dass ich das nicht programmieren kann? Falls du weißt, wie so etwas geht, dann hilf mir bitte dabei. Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
Hi Chris, bitte hilf mir (oder auch jemand anderes). :chat: :chat:
|
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
das heisst also, dass NetServerEnum auch nicht funktioniert hat? |
Re: Alle PC-Namen eines Netzwerkes erhalten
Hi!
Das stimmt, ja! Naja im Notfall gebe ich meinem Lehrer Recht... Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
schade :? Schön wär's gewesen... Eine Idee, die hier schon angeklungen ist hab' ich allerdings noch. Wann hast Du denn wieder Info, und könntest es probieren? |
Re: Alle PC-Namen eines Netzwerkes erhalten
Vor den Sommerferien habe ich nur noch morgen die Möglichkeit, im Notfall mach's ich halt dann erst im September.
|
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
ich versuch' dann gleich mal die Idee umzusetzen. Wenn's länger wird häng ich das als Attachement dran ;-) |
Re: Alle PC-Namen eines Netzwerkes erhalten
Servus!
Das ist nett von dir, danke! :mrgreen: Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
Zieh dir mal IPEye von http://www.ntsecurity.nu und starte es. Checke mal die Ports der umliegenden Rechner. Wenn 137 zu ist, kannste nix machen.
Es ist aber sehr wohl möglich an einzelne Rechner zu verbinden (quasi durch probieren) und dann den Rechnernamen zu ermitteln. Das ist sowas wie ein Share ... Ich kann aber sowas frühestens nach Donnerstag bieten. Nachtrag: An Port 137 ist der NetBIOS-Name Service. Wenn der zu ist, werden Broadcasts mit Namenanfragen (sowas wird geschickt wenn du in der Netzwerkumgebung Refresh machst) beantwortet ... so kommen die Namen in die Netzwerkumgebung. PS: Als ich auf der ersten Seite gelesen habe, hab ich auch sofort an NetServerEnum gedacht. Sag doch mal, was die anderen Rechner für Systeme oben haben! |
Re: Alle PC-Namen eines Netzwerkes erhalten
Hallo!
Alle anderen Rechner sind die selben. Alle haben Windows 2000 Prof. Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
Und die Ports?
|
Re: Alle PC-Namen eines Netzwerkes erhalten
Sorry! Das weiß ich nicht.
|
Re: Alle PC-Namen eines Netzwerkes erhalten
LOL ... und du kannst es natürlich auch nicht rausbekommen?
Das wäre das Mindeste um dir eine Prognose zu bieten, ob du überhaupt eine Chance hast. |
Re: Alle PC-Namen eines Netzwerkes erhalten
Servus!
Ich weiß erstens nicht, wie man das rausbekommt und zweitens habe ich erst wieder Anfang September Schule. Gruß Matze |
Re: Alle PC-Namen eines Netzwerkes erhalten
*nachobenschieb*
Geht das nicht ohne die Ports zu wissen und angenommen Port 137 ist zu, geht's dann gar nicht?? :gruebel: |
Re: Alle PC-Namen eines Netzwerkes erhalten
@Christian Seehase:
Du kennst dich doch auf diesem Gebiet so gut aus, geht das dann gar nicht? :gruebel: |
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
ich denk' noch mal drüber nach, auf welchem Wege das eventuell getrickst werden kann. Welche Berechtigungen bestehen denn für den Account mit dem das Programm laufen soll im Netzwerk? |
Re: Alle PC-Namen eines Netzwerkes erhalten
Ich bin halt kein Admin, sondern ein ganz normaler User mit eingeschränkten Rechten. Falls du das gemeint hast. :?
|
Re: Alle PC-Namen eines Netzwerkes erhalten
Moin Matze,
ja, das meinte ich. Je mehr Rechte, umso leichter kann's werden. ;-) Was auch immer mir vielleicht einfallen sollte: Ich werd's nicht unbedingt testen können... |
Re: Alle PC-Namen eines Netzwerkes erhalten
Ich bin offen für jeden Vorschlag, testen kann ich sie ja. ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz