![]() |
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 |
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!! |
Re: Freigegebene Festplatten eines PCs ermitteln
Wird das gleiche sein, wie beim Usermanager:
Zitat:
Zitat:
|
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; |
Re: Freigegebene Festplatten eines PCs ermitteln
Zitat:
Was knallt denn? Hast Du uns nicht wenigstens mal ne Fehlermeldung? |
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. |
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; |
AW: Re: Freigegebene Festplatten eines PCs ermitteln
Ich kürze das mal hier ab. Ich glaube diese Zeile macht mir Probleme:
Zitat:
Ich bekomme jedenfalls immer eine "c0000005 ACCESS_VIOLATION" Meldung angezeigt. Im Debugger wird eine Zeile markiert:
Code:
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?
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; |
AW: Freigegebene Festplatten eines PCs ermitteln
@MicMic:
Definiere mal das record nicht als
Delphi-Quellcode:
. 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
Delphi-Quellcode:
waren die Zugriffsverletzungen dann verschwunden.
packed
Grüße Dalai |
AW: Freigegebene Festplatten eines PCs ermitteln
Zitat:
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 21:10 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-2025 by Thomas Breitkreuz