AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Freigegebene Festplatten eines PCs ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Freigegebene Festplatten eines PCs ermitteln

Ein Thema von Salomon · begonnen am 6. Mai 2003 · letzter Beitrag vom 18. Jan 2021
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von lord
lord

Registriert seit: 11. Mai 2005
Ort: Bonn
16 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: Freigegebene Festplatten eines PCs ermitteln

  Alt 22. Jun 2005, 18:38
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 ) gefunden.

für sachdienliche Hinweise wäre ich sehr dankbar
mfg lord
  Mit Zitat antworten Zitat
vegdoen

Registriert seit: 3. Jul 2005
Ort: Kaiserslautern
4 Beiträge
 
#22

Re: Freigegebene Festplatten eines PCs ermitteln

  Alt 11. Jul 2005, 16:25
Hallo Leute,

könnte jemand mal den ganzen Quelltext posten!!!!! 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. Währe also jmd so freundlich den Quelltext zu posten, am besten die Ausgabe in einer ListBox.

vielen Dank im Vorraus!!!111!!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#23

Re: Freigegebene Festplatten eines PCs ermitteln

  Alt 11. Jul 2005, 16:39
Wird das gleiche sein, wie beim Usermanager:
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 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Troelli

Registriert seit: 1. Mai 2003
15 Beiträge
 
Delphi 7 Enterprise
 
#24

Re: Freigegebene Festplatten eines PCs ermitteln

  Alt 24. Jun 2008, 16:19
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.dllname 'NetShareEnum';
  function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS;
                        stdcall; external 'NetAPI32.dllname '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;
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#25

Re: Freigegebene Festplatten eines PCs ermitteln

  Alt 24. Jun 2008, 16:28
Zitat von Troelli:
Dann knallts.
Dann mach Deine Lautsprecher leiser
Was knallt denn? Hast Du uns nicht wenigstens mal ne Fehlermeldung?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Troelli

Registriert seit: 1. Mai 2003
15 Beiträge
 
Delphi 7 Enterprise
 
#26

Re: Freigegebene Festplatten eines PCs ermitteln

  Alt 24. Jun 2008, 17:21
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#27

Re: Freigegebene Festplatten eines PCs ermitteln

  Alt 24. Jun 2008, 21:09
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.dllname 'NetShareEnum';
  function NetApiBufferFree(const Buffer: Pointer): NET_API_STATUS;
                        stdcall; external 'NetAPI32.dllname '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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#28

AW: Re: Freigegebene Festplatten eines PCs ermitteln

  Alt 17. Jan 2021, 00:13
Ich kürze das mal hier ab. Ich glaube diese Zeile macht mir Probleme:
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?
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#29

AW: Freigegebene Festplatten eines PCs ermitteln

  Alt 17. Jan 2021, 11:15
@MicMic:
Definiere mal das record nicht als 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 packed waren die Zugriffsverletzungen dann verschwunden.

Grüße
Dalai
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#30

AW: Freigegebene Festplatten eines PCs ermitteln

  Alt 17. Jan 2021, 18:51
@MicMic:
Definiere mal das record nicht als 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 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.
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