![]() |
Netzwerk Infos
Hallo: habe ein Paar Fragen:
1. Wie mache ich aus einem Computer Namen ("\\Computer") seine IP? 2. Wie kann ich mehr Informationen über eine Freigabe ("\\Computer\Freigabe") erhalten. z.B. Passwort, Größe, Anzahl der Dateien, Aktuelle Anzahl der Benutzer usw Gruß bdominik |
Moin TheOmega,
das meiste kannst Du über die Netxxx Funktionen der LanManager API auslesen, oder über die WNetxxx Funktionen. Die Einzelheiten dazu stehen im PSDK (es gibt zig-Netxxx Funktionen ;-)) In Delphi sind nur die WNetxxx Funktionen deklariert, die anderen müsstest Du Dir selber aus den Headern übersetzen, oder Du nutzt schon existierende Übersetzungen. Was noch wichtig wäre:
Das angenehme an den Netxxx Funktionen: Sie reservieren den erforderlichen Buffer selber. Man muss ihn nur nach Gebrauch wieder freigeben. Die Anzahl der Dateien geht dann immer "zu Fuss" also FindFirst/FindNext (mir fällt zumindest auf Anhieb keine API dafür ein. NetShareGetInfo gibt das, z.B. nicht her ;-)) Ach so: Immer wieder gern gefragt, wie ich sehe: :mrgreen: Passworte kannst Du nicht auslesen. |
Ich wollte ja nur ob Passwort und nicht wiePasswort.
|
Moin TheOmega,
die Frage lautete Zitat:
;-) |
Also richtiG:
2. Wie kann ich mehr Informationen über eine Freigabe ("\\Computer\Freigabe") erhalten. z.B. ob ein Passwort vorhanden ist. |
Moin TheOmega,
war auch nicht böse gemeint ;-) Über die Frage nach PW auslesen bin ich halt nur öfter in diesem Zusammenhang gestolpert. Solltest Du Probleme mit den Infos aus dem PSDK haben sag' bescheid. Mit den Netxxx Funktionen hab' ich schon öfter gearbeitet (zumindest unter W2K) |
also: erstes Problem:
habe eine Struktur definiert:
Code:
dann habe ich die funktion engebunden:
type PUSER_INFO_1 = ^USER_INFO_1;
USER_INFO_1 = record shi2_netname: PWideChar; shi2_type: DWORD; shi2_remark: PWideChar; shi2_permissions: DWORD; shi2_max_uses: DWORD; shi2_current_uses: DWORD; shi2_path: PWideChar; shi2_passwd: PWideChar; end;
Code:
und habe jetzt folgende procedure bentutz:
function NetShareGetInfo(SeverName, NetName: PWideChar; Level: DWORD; Buf: Pointer): LongInt; stdcall; external 'netapi32.dll';
Code:
Wenn ich jetzt auf den Button drücke bekomm ich eine leere Messagebox. Mir ist nicht ganz klar, was hier rauskommen sollte, aber irgwndwas sollte ja schon. Und was muß der zweite Parameter von NetShareGetInfo sein? die Arbeitsgruppe?
procedure TForm1.Button1Click(Sender: TObject);
var buf:PUSER_INFO_1; begin; GetMem(Buf, Sizeof(Buf)); NetShareGetInfo('Computernamen','weisnichtwashierhersoll',2,pointer(buf)); showmessage(buf.shi2_path); end; |
Moin TheOmega,
der zweite Parameter gibt den Namen des Shares an, von dem die Info abgefragt werden soll. Warum hast Du eigentlich die SHARE_INFO_2 Struktur USER_INFO_1 genannt? (Copy & Paste Problem? ;-)) Wie weiter oben schon erwähnt: Die Netxxx Funktionen unter NT ff reservieren sich den Platz selber, also ist GetMem überflüssig. Worauf man, gerade wenn man noch nicht mit diesen Funktionen gearbeitet hat leicht reinfallen kann: Da die Funktionen den Buffer selber reservieren, muss nicht der Pointer, sondern die Adresse des Pointers übergeben werden (siehe Muster). So geht's:
Code:
var
pBuffer : PSHARE_INFO_2; begin if NetShareGetInfo(nil,'c$',2,@pBuffer) = NERR_Success then begin try ShowMessage(pBuffer.shi2_path); finally NetApiBufferFree(pBuffer); end; end; end; |
Wo ist das NERR_Success definiert?
Ich habe mal vereinfacht folgendes geschrieben:
Code:
Jetzt bekomme ich einen Runtimerror. Was mache ich falsch? Und warum haßt du für den Computernamen ein NIL eingesetzt?
type PSHARE_INFO_2 = ^SHARE_INFO_2;
SHARE_INFO_2 = record shi2_netname: PWideChar; shi2_type: DWORD; shi2_remark: PWideChar; shi2_permissions: DWORD; shi2_max_uses: DWORD; shi2_current_uses: DWORD; shi2_path: PWideChar; shi2_passwd: PWideChar; end; ... function NetShareGetInfo(SeverName, NetName: PWideChar; Level: DWORD; Buf: Pointer): LongInt; stdcall; external 'netapi32.dll'; procedure NetApiBufferFree(Buf: Pointer) stdcall; external 'netapi32.dll'; procedure TForm1.Button1Click(Sender: TObject); var buf:PSHARE_INFO_2; begin; NetShareGetInfo('\\Computernamen','Freigabenamen',2,@buf); ShowMessage(buf.shi2_path); NetApiBufferFree(buf); end; |
Moin TheOmega,
ändere doch mal die Deklaration von NetApiBufferFree von procedure auf function. In der API gibt es keine Prozeduren. Ausserdem würde ich auch noch den Namen der Funktionen jeweils mit angeben. Nerr_Success ist in der LMERR.H definiert, und hat einfach den Wert 0. Du kannst auch ERROR_SUCCESS nehmen. Sollte der Fehler jetzt immer noch auftauchen, dann wäre es ganz hilfreich zu wissen, welcher, und wo er auftritt. Ach ja: nil sagt der Funktion, dass sie den lokalen Rechner benutzen soll. |
Danke local (mit NIL) funzt es jetzt, aber wie funktionier das im Netzwerk? muß der Computernamen "\\Computer" oder "Computer" sein, weil beides funktioniert bei mir nicht. Muß der andere Computer ein bestimmtes OS haben? (aktuell: Win ME, ich Win XP)
|
Hi,
nachdem ja dieses Thema in diesem Forum schon mehrfach besprochen wurde habe ich mich dazu entschieden diesen Thread fortzusetzen. Mein Problem ist genau das gleiche wie in diesem Thread. Meine Bitte: Kann jemand die letzte Frage von theOmega beantworten (auf meinem PC (mit nil) funktioniert das auch Super. Aber auch ich habe das Problem das es nicht auf anderen PC´s geht. MfG |
Moin st,
erst einmal herzlich willkommen hier in der Delphi-Praxis. Leider ist mir die letzte Frage von The Omega entgangen, oder ich hatte damals keine Idee :oops: NetShareGetInfo wird auf 9x/Me wohl nur mit Level 50 funktionieren, denn eine andere Struktur ist für diese Betriebssysteme nicht vorgesehen. Allerdings habe ich mit Systemübergreifenden Funktionen keinerlei Erfahrung, so dass ich hier auf Vermutungen angewiesen bin. Evenutell wäre man dann bei gemischten Systemen mit WNetEnumResource besser bedient. |
Hi,
ich krieg´s einfach nicht gebacken. Sämtliche Funktionen der netapi32 funktionieren wunderbar auf meinem Rechner (egal ob mit nil oder dem Servernamen) wenn ich jedoch einen anderen Rechner als Servernamen angebe (egal ob mit IP oder Servername) kriege ich einen Fehlermeldung. Was mach ich nur falsch? Bitte helft mir. MfG |
Moin st,
und welche Fehlermeldung? Wie rufst Du die Funktion(en) auf, und welche Betriebssysteme sind beteiligt? |
Der Fehler, der bei all diesen Funktionen immer der gleiche ist, lautet:
EAccessViolation ... Zugriffsverletzung bei Adresse (blabla) |
Moin st,
und wie rufst Du die Funktionen auf? Ein paar Beispiele wären gut (Variablendeklaration inklusive), denn wenn's lokal geht, und nur mit Serverangabe nicht, dann muss auch da der Fehler zu suchen sein. |
Hi,
ich rufe die Funktionen genau wie in diesem Thread, auf Seite 1, beschrieben auf. Mit NetShareGetInfo beispielsweise: NetShareGetInfo(nil,'c$',2,@buf); so funktioniuert es wunderbar. Setze ich jetzt anstellen des nil meinen Computernamen 'MeinPuter' dann funzt auch das Super. Nun aber einen anderen Name 'IrgendeinPuter' geht nicht. Auch geht nicht '\\IrgendeinPuter' oder '111.111.111.111' (mit IP) oder '\\111.111.111.111' egal was ich auch eingebe es geht nicht. alles funktioniert nur lokal. Mein Rechner hat WinXP, komplett freigebeben mit Passwort. Der andere Rechner hat genau das gleiche. Ich hab keinen Plan warum das nicht klappt. MfG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz