_WinAPI_EnumFiles im lokalen Netzwerk

    • Offizieller Beitrag

    Ich würde gern die Funktion "_WinAPI_EnumFiles" einsetzen, um mir Verzeichnisse/Dateien von einer Netzwerk-Freigabe ("\\Server\d\") anzeigen zu lassen, aber damit bekomme ich immer eine Fehlermeldung:
    error: 10 extended: C000000D


    Nun habe ich danach gegoogelt und lt. MSDN bedeutet das: STATUS_INVALID_PARAMETER (An invalid parameter was passed to a service or function.)
    Tja, und jetzt weiß ich nicht weiter. :huh:

    Wenn ich hingegen die Funktion "_FileListToArray" benutze, bekomme ich eine Auflistung der Verzeichnisse/Dateien von der Freigabe. Es liegt also nicht am Netzwerk oder an den Zugriffsrechten.
    Weiß jemand, warum das nicht mit "_WinAPI_EnumFiles" funktioniert?

  • Kann das Problem nicht nachstellen... sowohl mit "normalen" Freigaben als auch mit verstecken Freigaben nicht das geringste Problem.

    Was ist deine Ausgabe, wenn du "\\Server\d\" in die Kommandozeile wirfst? Hast du eventuell zu geringe Rechte auf das Verzeichnis? Ist es vielleicht eine versteckte Freigabe? Eventuell greifst du nicht mit dem Nutzer, mit dem du das Script ausführst auf das Verzeichnis zu? All das würde zu Problemen führen.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • An der Funktion in der aktuellen Version liegt es definitiv nicht, da diese problemlos alle Daten liefert.

    AutoIt
    #include <Array.au3>
    #include <WinAPIFiles.au3>
    Local $aData = _WinAPI_EnumFiles("\\Webserver\htdocs\")
    _ArrayDisplay($aData, '_WinAPI_EnumFiles')
    Local $aData = _WinAPI_EnumFiles("\\Domaenencontroller\oeffentlich$\")
    _ArrayDisplay($aData, '_WinAPI_EnumFiles')

    Öffentliche Freigabe sowie versteckte Freigabe. Beide keinerlei Probleme.

    Hier noch einmal die oben genannten und weitere eventuell relevante Fragen, deren Klärung im Raum stehen:

    1. Was ist die Ausgabe, wenn du versuchst den Server - exakt so wie du ihn der Funktion übergibst - in die Kommandozeile eingibst?
    2. Gibt es eventuell ein Rechteproblem? Nein, du sollst nicht raten, du sollst es noch einmal *explizit* prüfen. Hat der Nutzer, mit dem du aktuell angemeldet bist, Vollzugriff auf den Ordner?
    3. Handelt es sich bei dem Verzeichnis um eines mit versteckter Freigabe, oder ist es eine öffentliche? Ist die versteckt, ist das "$" von elementarer Bedeutung.
    4. Öffnest du den Pfad im Explorer, hast du da einen anderen Nutzer angegeben? Hier spielt die unterschiedliche Programmierung beider Funktionen eine elementare Rolle.
    5. Welche Version von AutoIt verwendest du? Ich kann hier nur mit der aktuellsten testen. Wenn du eine ältere hast, konnte das Problem dort liegen.
    6. Was ist der MD5-Hash deiner WinApiFiles.au3? Eventuell wurde hier was verändert was das Problem verursacht.
    7. Welches Betriebssystem nutzt du - und damit auch das Script? Ich habe mit Windows 7x64 getestet.
    8. Welches Betriebssystem nutzt das Ziel? Getestet auf Windows Server 2012 R2, Windows Server 2008 R2.
    9. Hängt zwischen deinem Gerät und dem Zielgerät eventuell eine Firewall? Auch diese kann WinAPI-Befehle blockieren.

    Es gibt geschätzt noch 90 andere Fragen, die man klären müsste, warum es offensichtlich im Netzwerk normalerweise problemlos funktioniert - bei dir aber eben nicht. Also wie wäre es, wenn wir einfach gemeinsam versuchen das Problem zu ergründen, statt dass du alles was ich sage von Anfang an in Frage stellst.

    Ergänzung:

    Du hast den Fehler "ERROR_BAD_ENVIRONMENT" mit der Spezifikation "STATUS_INVALID_PARAMETER". Das schreit eigentlich nach einer Sache: Du kommst nicht von a) nach b) wenn du nicht über den Explorer gehst- wie es FileListToArray beispielsweise macht. Das könnte 3 Hauptursachen haben:

    1. Dir fehlen die Zugriffsrechte.
    2. Da ist eine Firewall zwischen dir und dem Zielgerät.
    3. Du greifst im Explorer mit einem anderen Nutzer als mit dir selbst auf den Ordner zu.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

    Einmal editiert, zuletzt von Runa (28. August 2015 um 11:58) aus folgendem Grund: Ergänzung.

    • Offizieller Beitrag

    So, ich habe jetzt von v3.3.14.0. noch auf v3.3.14.1 geupdatet.

    Zu Deinen Fragen:
    1. Ich weiß nicht, was Du mit Kommandozeile meinst, aber in einer Eingabeaufforderung kann man das Verzeichnis so nicht eingeben: "Der Befehl "\\localhost\d\" ist entweder falsch geschrieben oder konnte nicht gefunden werden.".
    2. Der Fehler tritt auch auf, wenn ich das Script bei mir auf meinen Rechner (Localhost) aufrufe. Das Laufwerk "D" ist als erweiterte Freigabe (Heimnetzgruppe) mit Berechtigung "Jeder" und "Vollzugriff" freigegeben.
    3. Keine versteckte Freigabe (siehe 2.)
    4. Ich kann den Pfad im Explorer öffnen, mit dem TotalCommander und selbst mit Firefox kann ich auf den Pfad zugreifen.
    5. aktuellste AutoIt-Version v3.3.14.1
    6. MD5-Hash von "WinApiFiles.au3": 869827e8ee7867c597e7925859fdc581
    7. Ich habe ebenfalls Win7, 64 Bit
    8. Ziel ist Localhost
    9. Siehe 8.


    Hier noch das Testscript:


    Der erste Teil schmeißt als Fehler: error: 10 extended: C000000D
    Der zweite Teil gibt mir die Verzeichnisliste aus.

  • So - damit kann ich was anfangen :) Mit deinem Script habe ich nämlich die selbe Fehlermeldung. Ich guck mal, ob ich was rausfinde :)

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • Der Fehler liegt in der Funktion unter

    AutoIt
    $aRet = DllCall('ntdll.dll', 'uint', 'ZwQueryDirectoryFile', 'handle', $hDir, 'ptr', 0, 'ptr', 0, 'ptr', 0, _
    				'struct*', $tIOSB, 'struct*', $pBuffer, 'ulong', 8388608, 'uint', 1, 'boolean', 0, 'ptr', 0, 'boolean', 1)

    Bist du sicher, dass diese Funktion UNC Pfade unterstützt?

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • UEZ: Bereits getestet. Das Problem besteht übrigens seit __HeapAlloc(). Die gibt den Fehlercode 10 zurück.

    Edit: Verbessere: Du hattest recht - hatte mein Test-Return in der If ... -.-'

    Edit2: $aRet[0] ergibt einen ganz krummen Wert - die Funktion erwartet 0 aber es kommt bei mir 3221225485 bei raus. Jetzt müsst ich rausfinden, was das eigentlich heißt...

    Edit3: Zugriffsrechtsproblem ist übrigens "error: 30 extended: 0000052E"

    WinAPI ist der Ansicht, dass der Ordner gar nicht existiert:

    Code
    Global $sPath = '\\localhost\d\'
    
    
    MsgBox(0, @extended, _WinAPI_FileExists($sPath))


    Diesen Fehler gibt er aber bei sämtlichen UNC-Pfaden aus... ich habe da eine Theorie... moment. Gerade mal testen. mhm. Geht hier gerade nicht. Kann mal wer testen, ob der Zugriff auch von anderen Geräten auf diese Freigabe nicht funktioniert, WENN die Freigabe als Netzlaufwerk eingebunden wurde? :)

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

    3 Mal editiert, zuletzt von Runa (28. August 2015 um 21:16)

  • WinAPI ist der Ansicht, dass der Ordner gar nicht existiert:

    Kann es vielleicht sein, dass du die _WinAPI_FileExists() etwas missverstehst? Im Gegensatz zur internen FileExists (die sie auch mit verwendet) gibt die _WinAPI_FileExists() tatsächlich nur eine 1 zurück, wenn der übergebene Pfad eine Datei ist. Bei Ordnern gibt sie prinzipiell 0 zurück - egal ob sie existieren oder nicht.
    Bei existierenden Ordnern gibt sie stattdessen eine 0 zurück und setzt aber dafür @extended auf 1.
    Bei deinem Code, hast du zwar ein @extended verwendet, dieses hat aber so immer den Wert 0, da die _WinAPI_FileExists() erst nach dessen Expansion aufgerufen wird.

    Ansonsten: Bei UNC-Pfaden unter Windows - müsste es da nicht eher \\.\d\ heißen? Bzw. \\.\D:\ wenn es ein Laufwerk ist heißen?

    Einmal editiert, zuletzt von AspirinJunkie (28. August 2015 um 21:45)

  • @AspirinJunkie

    Richtig, habe das Ganze in dem Codestück hier nicht richtig gemacht gehabt. Was solls - bin müde, sorry. Im Code den ich hatte war es aber richtig herum, da da aber noch viel Müll rumgeistert wollte ich nicht per C/P arbeiten ... egal wie glaubhaft das gerade für dich klingen mag. ^^

    Zu "Ansonsten": Nee, das zählt nur für bestimmte Dinge, zu dem Dateipfade nicht gelten. Mit deinem Ansatz findet er die Datei nicht mal, was in einem Error-Code #30 resultiert, statt dem oben beschriebenen #10.

    _WinAPI_CreateFile() kommt problemlos zu dem Pfad...

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

    Einmal editiert, zuletzt von Runa (29. August 2015 um 00:31)

    • Offizieller Beitrag

    Ähm...ich weiß nicht wieso, aber heute klappt der Zugriff auf einen anderen Rechner im lokalen Netzwerk (_WinAPI_EnumFiles liefert mir die Verzeichnis-/Dateiliste).

    Der Zugriff auf Localhost (egal ob über Localhost, Computernamen oder IP) verursacht aber immer noch den Fehler (error: 10 extended: C000000D).

    Das ist alles sehr eigenartig...

    Schade, ich würde gern _WinAPI_EnumFiles nutzen, aber wenn das nicht überall funktioniert, dann muss ich wohl doch auf _FileListToArray ausweichen.

  • AspirinJunkie:

    Habe oben doch schon geschrieben, dass "\\.\" nicht geht. Wenn du "\\?\" verwendest, gibt er auch nur noch einen Fehler aus, dass er die Datei nicht findet.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • @Oscar

    Ich glaube auch nicht, dass er da die Freigabe nimmt - sonst hättest du ja den Freigabenamen angegeben. Mit \\.\d:\ bekommste auch das Laufwerk D:\ - aber eben keine Freigabe.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.