Delphi-PRAXiS

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.

theomega 30. Jul 2002 17:39

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)

st18061974 5. Feb 2003 21:31

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

Christian Seehase 5. Feb 2003 22:53

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.

st18061974 8. Feb 2003 16:16

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

Christian Seehase 8. Feb 2003 17:15

Moin st,

und welche Fehlermeldung?

Wie rufst Du die Funktion(en) auf, und welche Betriebssysteme sind beteiligt?

st18061974 8. Feb 2003 19:35

Der Fehler, der bei all diesen Funktionen immer der gleiche ist, lautet:

EAccessViolation ... Zugriffsverletzung bei Adresse (blabla)

Christian Seehase 9. Feb 2003 02:23

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.

st18061974 9. Feb 2003 12:36

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