Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Freigegebene Festplatten eines PCs ermitteln (https://www.delphipraxis.net/4623-freigegebene-festplatten-eines-pcs-ermitteln.html)

lord 22. Jun 2005 17:38

Re: Freigegebene Festplatten eines PCs ermitteln
 
Sorry das ich den verstaubten Thread hier nochmal ausgrabe, aber wo finde ich denn die WNetOpenEnum Demo, von der Salomon sprach? Bei Google habe ich neben dem Thread hier noch ein paar russische (mir nichtssagende) Seiten und diesen Thread (den ich vor der Suche schon kannte :wink: ) gefunden.

für sachdienliche Hinweise wäre ich sehr dankbar
mfg lord

vegdoen 11. Jul 2005 15:25

Re: Freigegebene Festplatten eines PCs ermitteln
 
Hallo Leute,

könnte jemand mal den ganzen Quelltext posten!!!!! :mrgreen: Bitte!!! Ich hab zwar Ahnung von Delphi, aber ich habe jetzt schon mehrmals versucht das Prog selbst zu compilieren, bin aber immer gescheitert, immer an anderen Stellen. :oops: Währe also jmd so freundlich den Quelltext zu posten, am besten die Ausgabe in einer ListBox.

vielen Dank im Vorraus!!!111!!

Luckie 11. Jul 2005 15:39

Re: Freigegebene Festplatten eines PCs ermitteln
 
Wird das gleiche sein, wie beim Usermanager:
Zitat:

Zitat von XP Usermanager Hilfe
Einschränkungen
Der Usermanger erlaubt es auch lokale Benutzer auf anderen Rechnern im Netzwerk zu verwalten. Bevor auf den remote Rechner zugegriffen wird, wird nun erst eine Freigabe erstellt. Dabei hat man die Möglichkeit bei der Auswahl eines Computers die Freigabe über ein Benutzerkonto zu erstellen durch die Eingabe von Benutzernamen und Passwort.

Da Windows XP Home keinen remote Zugriff zulässt, ist es nicht möglich in einem Netzwerk remote auf einen Rechner mit Windows XP Home zuzugreifen.

Unter Umständen kann es auch Probleme mit XP Professional geben, hierfür gibt es aber eine einfache Problemlösung. Der Grund dafür liegt in der aktivierten ForceGuest-Einstellung die man aber abstellen kann, indem man in der lokalen Sicherheitsrichtlinien "Netzwerkzugriff: Modell für gemeinsame Nutzung und Sicherheitsmodell für lokale Konten" auf "Klassisch" stellt. Die andere Möglichkeit ist, den Wert direkt über die Registrierung zu ändern (dieser befindet sich unter "HKLM\SYSTEM\CurrentControlSet\Control\Lsa -> Schlüssel: forceguest, Wert: 0 (deaktiviert)).

Wichtig: Diese Einstellung ist unter XP standardmäßig aktiv und kann nicht so einfach geändert werden, da sie die Sicherheit des Systems gefährden kann! Ist diese Funktion deaktiviert so kann ein Angreifer leicht auf das System zugreifen, wenn das Administrator-Konto nicht passwortgeschützt ist. Sie sollten sich also bewusst sein, was Sie tun, wenn sie diese Einstellung ändern!

Desweitern musst du dich an dem Remoterechner erst authentifizieren. Ich habe das beim Usermanager so gelöst, dass ich eine Freigabe auf dem Rechner erzeuge:
Zitat:

Zitat von XP Usermanager Hilfe
Hinweis: Wollen Sie auch Änderungen an Konten auf dem remote Rechner vornehmen, ist es erforderlich, dass Sie sich mit einem Benutzerkonto authentifizieren, welches der Administratorengruppe auf dem remote Rechner angehört.

Das bedingt aber dass du die Freigabe mit einem Administratorkonto auf dem Remoterechner erzeugst, desweiteren muss dieses Konto ein Passwort haben. Dsa heißt, du musst Bneutzername und Passwort eines Administrators auf dem Remoterechner angeben und diese muss ein Passwort haben.

Troelli 24. Jun 2008 15:19

Re: Freigegebene Festplatten eines PCs ermitteln
 
Hallo erstmal :)
Ist schon länger her das diese Threat beschrieben wurde. Aber ich stehe jetzt vor dem Problem das ich meine Shares im Netzwerk abrufen möchte. Nach dem hier veröffentlichten Quellcode geht es auch teilweise bis zur stelle wo man einen anderen Rechner ansprechen will. Dann knallts.
Hat einer eine Idee worann es liegen kann?

Delphi-Quellcode:
unit Unit3;

interface
uses
  Windows, SysUtils, Classes ,Dialogs ;

const
  NERR_Success        = 0;
  MAX_PREFERRED_LENGTH = DWORD(-1);

  type
    NET_API_STATUS = DWORD;
    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;

  PSHARE_INFO_2  = ^SHARE_INFO_2;
  Procedure EnumNetwork (var EnumNetworkStringlist :TStringlist;Computername_or_IP:String);


  function NetShareEnum(ServerName  : PWideChar;
                        Level       : DWORD;
                        bufptr      : Pointer;
                        PrefMaxLen  : DWORD;
                        EntriesRead : PDWORD;
                        TotalEntries : PDWORD;
                        Resume_Handle: PDWORD):NET_API_STATUS;
                        stdcall; external 'NetAPI32.dll' name 'NetShareEnum';
  function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS;
                        stdcall; external 'NetAPI32.dll' name 'NetApiBufferFree';



implementation

Procedure EnumNetwork (var EnumNetworkStringlist :TStringlist;Computername_or_IP:String);
const
  MAX_PREFERRED_LENGTH = -1;
  NERR_SUCCESS        = 0;
var
  ER : DWORD; // enries read
  TE : DWORD; // total entries
  ResHandle : DWORD;
  ShareInfo : PSHARE_INFO_2;
  p        : pChar;
  fResult  : NET_API_STATUS;
  i        : Integer;
  share, path : string;
  myWideString : WideString;
  myWideCharPtr : PWideChar;
begin
  ResHandle := 0;
  fResult := NetShareEnum(nil, 2, @ShareInfo, DWORD(MAX_PREFERRED_LENGTH), @ER, @TE, @ResHandle);
  if(fResult <> NERR_SUCCESS)then
   Exit;
  p := Pointer(ShareInfo);
  for i := 0 to TE - 1 do
  begin
    share := WideCharToString(PSHARE_INFO_2(p)^.shi2_netname);
    path := WideCharToString(PSHARE_INFO_2(p)^.shi2_path);
    if path<>'' then path:=', '+path;
    EnumNetworkStringlist.Add(share+path);
    p := p + SizeOf(SHARE_INFO_2);
  end;
  NetApiBufferFree(@ShareInfo);
end;
end.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Computerressourcen:TStringlist;
begin
Computerressourcen:=tstringlist.Create;
Computerressourcen.Add('Testobgeht');

EnumNetwork(Computerressourcen,'192.168.178.1');
ListBox1.Items:= Computerressourcen;
showmessage('fertig');
end;

Phoenix 24. Jun 2008 15:28

Re: Freigegebene Festplatten eines PCs ermitteln
 
Zitat:

Zitat von Troelli
Dann knallts.

:roll: Dann mach Deine Lautsprecher leiser :roll:
Was knallt denn? Hast Du uns nicht wenigstens mal ne Fehlermeldung?

Troelli 24. Jun 2008 16:21

Re: Freigegebene Festplatten eines PCs ermitteln
 
Ok ... Das knallen^^ konnte ich abstellen. Hatte eine Variable falsch deklariert.
Meine Ressourcen auf Meinem Rechner werden dargestellt. Jedoch nicht die Ressorcen der anderen Rechner im Netzwerk. Das sind normale Freigaben ohne Passwort und Schreibschutz.

NetShareEnum(nil, 2, @ShareInfo, DWORD(MAX_PREFERRED_LENGTH), @ER, @TE, @ResHandle) <<< funktioniert

NetShareEnum(andereIPadresse, 2, @ShareInfo, DWORD(MAX_PREFERRED_LENGTH), @ER, @TE, @ResHandle)<<<< funktioniert nicht.

Es wird gar nichts angezeigt. Kein Fehler keine Daten.
Wenn ich jetzt den Userlevel ändere in 1 oder 0 gibt es eine Exception EAccesViolation.

Christian Seehase 24. Jun 2008 20:09

Re: Freigegebene Festplatten eines PCs ermitteln
 
Moin Troelli,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Hattest Du den Code selber geschrieben, oder kopiert?

Da ich mit den Lanmanager Funktionen schon einiges gemacht habe, hab' ich es mal angepasst, und kommentiert.
So funktioniert es bei mir auch bei anderen Rechnern:

Delphi-Quellcode:
const
  NERR_Success         = 0;
  MAX_PREFERRED_LENGTH = DWORD(-1); // Einmal deklarieren reicht ;-)

type
  NET_API_STATUS = DWORD;
  PSHARE_INFO_2  = ^SHARE_INFO_2; // kann zwar auch danach deklariert werden,
                                  // aber davor ist halt üblich
  SHARE_INFO_2   = packed record // Auch wenn es hier keine Rolle spielt:
                                  // packed ist bei API-Funktionen meist besser
    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;

  // Beides auf const geändert
  // Die Strings werden ja nicht in der Prozedur erzeugt, sondern gefüllt: da reicht const
  // Nimmt man TStrings kann man auch, z.B., ListBox.Items, und sonstige von TStrings
  // abgeleitete Listen übergeben
  // Für den Namen/Adresse kann auch nil angegeben werden: Geht ohne const nicht
  Procedure EnumNetwork (const EnumNetworkStringlist :TStrings;const Computername_or_IP:PWideChar);

  // Auch alles auf const geändert, da man so besser die Beispiele (meist in C geschrieben)
  // besser nachvollziehen kann
  function NetShareEnum(const ServerName  : PWideChar;
                        const Level       : DWORD;
                        const bufptr      : Pointer;
                        const PrefMaxLen  : DWORD;
                        const EntriesRead : PDWORD;
                        const TotalEntries : PDWORD;
                        const Resume_Handle: PDWORD):NET_API_STATUS;
                        stdcall; external 'NetAPI32.dll' name 'NetShareEnum';
  function NetApiBufferFree(const Buffer: Pointer): NET_API_STATUS;
                        stdcall; external 'NetAPI32.dll' name 'NetApiBufferFree';


implementation

{$R *.dfm}

Procedure EnumNetwork (const EnumNetworkStringlist :TStrings;const Computername_or_IP:PWideChar);

var
  dwEntriesRead : DWORD;
  dwTotalEntries : DWORD;
  dwResHandle   : DWORD;
  LShareInfo    : PSHARE_INFO_2;
  LsiWork       : PSHARE_INFO_2; // Auch die Arbeitsvariable sollte den Typ haben
  dwResult      : NET_API_STATUS;
  i             : Integer;

begin
  EnumNetworkStringlist.Clear;
  dwResHandle := 0;
  dwResult := NetShareEnum(Computername_or_IP,2,@LShareInfo,MAX_PREFERRED_LENGTH,@dwEntriesRead,@dwTotalEntries,@dwResHandle);
  if(dwResult <> NERR_SUCCESS)then begin
    // Im Fehlerfalle einfach mal sehen, was es war
    ShowMessage(SysErrorMessage(dwResult));
    Exit;
  end;
  try
    LsiWork := LShareInfo; // Arbeitsvariable füllen
    for i := 1 to dwEntriesRead do begin // Lieber die tatsächlich gelesenen Einträge nehmen
                                         // auch wenn man bei MAX_PREFERRED_LENGTH alle
                                         // erwischen sollte
      EnumNetworkStringlist.Add(LsiWork.shi2_netname+', '+LsiWork.shi2_path);
      Inc(LsiWork); // Da der Typ jetzt dem der Struktur entspricht reicht inc
    end;
  finally
    // Hier nicht die Adresse (@) der Variablen übergeben, sondern die
    // durch den Aufruf von NetShareEnum reservierten Buffer, sonst
    // knirscht es ;-)
    // Gilt bei allen Lanmanger Funktionen, die den Buffer selber reservieren
    NetApiBufferFree(LShareInfo);
  end;
end;

MicMic 16. Jan 2021 23:13

AW: Re: Freigegebene Festplatten eines PCs ermitteln
 
Ich kürze das mal hier ab. Ich glaube diese Zeile macht mir Probleme:
Zitat:

Zitat von Christian Seehase (Beitrag 795462)
Code:
  Inc(LsiWork); // Da der Typ jetzt dem der Struktur entspricht reicht inc

Ich hatte auch mal ähnliches benutzt, wo die Variable mit SizeOf() hochgezählt wurde. Dies ging ebenfalls nicht aber ein Test mit der hälfte (größe div 2) ging dann wiederum. Aber man kann ja nicht (ohne Plan) irgendwas machen ;-)
Ich bekomme jedenfalls immer eine "c0000005 ACCESS_VIOLATION" Meldung angezeigt. Im Debugger wird eine Zeile markiert:
Code:
function _PWCharLen(P: PWideChar): Integer;
{$IFNDEF LEGACY_PWCHARLEN}
begin
  Result := 0;
  if P <> nil then
    while P[Result] <> #0 do  // <- diese hier wird markiert (ist aus der system.pas)
      Inc(Result);
end;
Hier beim schreiben... ich habe den Code gerade mal unter Win32 ausgeführt. Ist mir gerade so eingefallen. Da geht es. Zurück auf Win64 und schon ist der Fehler wieder da. Weiß jemand, wie ich das anpasse, damit es bei 32 sowie auch bei 64 Bit geht?

Dalai 17. Jan 2021 10:15

AW: Freigegebene Festplatten eines PCs ermitteln
 
@MicMic:
Definiere mal das record nicht als
Delphi-Quellcode:
packed
. Vor einigen Jahren hatte ich auch mit diversen Problemen, vor allem Zugriffsverletzungen, zu kämpfen, als es um Win64 ging. Mit der Entfernung der Anweisung
Delphi-Quellcode:
packed
waren die Zugriffsverletzungen dann verschwunden.

Grüße
Dalai

MicMic 17. Jan 2021 17:51

AW: Freigegebene Festplatten eines PCs ermitteln
 
Zitat:

Zitat von Dalai (Beitrag 1481072)
@MicMic:
Definiere mal das record nicht als
Delphi-Quellcode:
packed
. Vor einigen Jahren hatte ich auch mit diversen Problemen, vor allem Zugriffsverletzungen, zu kämpfen, als es um Win64 ging. Mit der Entfernung der Anweisung
Delphi-Quellcode:
packed
waren die Zugriffsverletzungen dann verschwunden.

Grüße
Dalai

Ja Super... jetzt geht es mit 32 und 64. Danke
Habe zur Ansicht:
ADMIN$, C$, D$, E$, IPC$ und einen freigegebenen Ordner

Was kann denn da alles so drin stehen?
Noch andere spezielle Sachen? In der "LsiWork.shi2_remark" Variable habe ich bei mir "Remoteverwaltung, Standardfreigabe und Remote-IPC" stehen. Ein freigegebenen Ordner hat bei mir kein Kommentar im "remark" stehen. Frage mich auch gerade wie ich einen hinzugefügten freigegebenen Ordner identifizieren kann. Das Dollarzeichen zu überprüfen, bringt wohl nicht viel, weil ein Ordner selber auch ein "$" Zeichen haben kann.

Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 Uhr.
Seite 3 von 4     123 4      

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