![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 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