Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Netzwerk Infos (https://www.delphipraxis.net/487-netzwerk-infos.html)

theomega 29. Jul 2002 22:31


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

Christian Seehase 29. Jul 2002 23:05

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:
  1. Viele der Netxxx Funktionen gibt es nur unter NT ff
  2. Wenn es die Funktionen auch unter 9x/Me gibt, so unterscheiden sich die Deklarationen der Funktionen und Datentypen

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.

theomega 30. Jul 2002 10:51

Ich wollte ja nur ob Passwort und nicht wiePasswort.

Christian Seehase 30. Jul 2002 11:05

Moin TheOmega,

die Frage lautete

Zitat:

2. Wie kann ich mehr Informationen über eine Freigabe ("\\Computer\Freigabe") erhalten. z.B. Passwort...
war also sehr wohl die Frage nach dem wie, und nicht nach dem ob :twisted:

;-)

theomega 30. Jul 2002 11:21

Also richtiG:
2. Wie kann ich mehr Informationen über eine Freigabe ("\\Computer\Freigabe") erhalten. z.B. ob ein Passwort vorhanden ist.

Christian Seehase 30. Jul 2002 11:42

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)

theomega 30. Jul 2002 12:11

also: erstes Problem:

habe eine Struktur definiert:
Code:
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;
dann habe ich die funktion engebunden:
Code:
function NetShareGetInfo(SeverName, NetName: PWideChar; Level: DWORD; Buf: Pointer): LongInt; stdcall; external 'netapi32.dll';
und habe jetzt folgende procedure bentutz:
Code:
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;
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?

Christian Seehase 30. Jul 2002 13:03

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;

theomega 30. Jul 2002 14:21

Wo ist das NERR_Success definiert?
Ich habe mal vereinfacht folgendes geschrieben:
Code:
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;
Jetzt bekomme ich einen Runtimerror. Was mache ich falsch? Und warum haßt du für den Computernamen ein NIL eingesetzt?

Christian Seehase 30. Jul 2002 14:49

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.
Seite 1 von 2  1 2      

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