Computer.FileSystem.DirectoryExists gibt fehlerhaftes Ergebnis

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ISliceUrPanties.

    Computer.FileSystem.DirectoryExists gibt fehlerhaftes Ergebnis

    Moin,

    ich will prüfen ob ein Verzeichnis im Stammbaum von Windows\System32\GroupPolicyUsers existiert.
    Auf meinem PC gibt es nur ein Unterverzeichnis und dies ist auch richtig so. Leider sagt er mir immer, dass es mehr als nur dieses eine Verzeichnis gibt.

    VB.NET-Quellcode

    1. ​For ZählerVariable = 0 To WinUser.Count - 1
    2. Dim pfad As String = Environment.GetFolderPath(Environment.SpecialFolder.System) & "\GroupPolicyUsers\" & WinUser.Keys(ZählerVariable).ToString
    3. If My.Computer.FileSystem.DirectoryExists(pfad) Then
    4. Console.WriteLine(pfad)
    5. End If
    6. Next


    Es gibt nur den Ordner C:\WINDOWS\system32\GroupPolicyUsers\S-1-5-21-567655562-3077545477-2947820896-1002. Trotzdem führt er den Befehl Console.WriteLine jedesmal aus, was ja eigentlich nicht sein dürfte.
    Haltepunkt habe ich hier auch eingesetzt und der Wert von pfad stimmt auch.

    Kann mir das jemand erklären oder habe ich einen Schnitzer im Code?
    @ThomasG82 Gibt es einen Unterschied, wenn Du das Programm als Admin und Nicht-Admin ausführst?
    Nicht-Admins sehen die Verzeichnisse / Daten der anderen User nämlich nicht.
    Und:
    Schmeiß den VisualBasic-Namespace raus, nimm System.IO { .Directory, .File, .Path }.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja auf den Gedanken mit den Admin-Rechten bin ich beim Rauchen auch gerade gekommen.
    Muss ich gleich mal ausprobieren, ist aber vermutlich wirklich das Problem.

    Das mit VB6 ja stimmt ich wurschtel da immer so ein paar Dinger rein. Ich gelobe Besserung (zumal ich oben sogar Imports System.IO stehen habe)
    @RodFromGermany - ich hab es als Admin getestet - funktioniert genauso wenig.
    Er sagt immer, dass es die Verzeichnisse gibt obwohl sie nicht existieren.

    VB.NET-Quellcode

    1. If Not Directory.Exists(pfad) Then
    2. Console.WriteLine(pfad)
    3. End If


    Jetzt habe ich es mal umgekehrt und gesagt, dass WENN das Verzeichnis existiert DANN soll er Console.WriteLine ausführen. Klappt aber irgendwie genauso wenig. Dann macht er gar nichts mehr.

    VB.NET-Quellcode

    1. If Directory.Exists(pfad) Then
    2. Console.WriteLine(pfad)
    3. End If


    Ich weiß echt nicht woran das liegen könnte
    Bilder
    • Screenshot 2021-02-10 135045.jpg

      24,91 kB, 822×188, 70 mal angesehen
    Naja halt nicht, das ist ja das Problem.
    Wenn die Verzeichnisse nicht existieren if not] reagiert er auch wenn das Verzeichnis existiert.
    Wenn er kontrollieren soll ob die Verzeichnisse existieren if reagiert er gar nicht, auch nicht beim existierenden Verzeichnis.
    Und das dürfte ja nicht sein. Allerdings ist auch nur die letzte Stelle unterschiedlich aber das müsste er ja trotzdem hinbekommen. Er wird ja wohl nicht nur 11 Zeichen kontrollieren
    Lass dir mal die Pfade alle anzeigen die da in der Schleife erzeugt werden ohne zu prüfen ob diese existieren. Dann prüfe diese manuell (im explorer) ob sie existieren.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo - ja hab ich schon gemacht. Die Pfade, die mit pfad generiert werden sind alle richtig.
    @Akanel - da hab ich auch gerade dran gedacht. Das Verzeichnis, welches ich suche ist nicht sichtbar - könnte das der Fehler sein? Wenn ja wie kann ich denn ein ausgeblendetes/verstecktes Verzeichnis finden/suchen? Das sind Systemverzeichnisse und ich kann die nicht auf jedem System, auf dem das Tool später läuft, einfach sichtbar machen

    Ich habe es jetzt mal mit dem DirectoryInfo probiert aber auch dort der selbe Effekt.
    Habe mal aus dem Netz DirectoryInfo Klasse | Microsoft Docs das Beispiel genutzt aber der gleiche Effekt. Es wird immer als Ergebnis FALSE ausgegeben obwohl das Verzeichnis existiert, der Inhalt der Variablen richtig ist und das Verzeichnis testweise nicht mehr versteckt ist.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ThomasG82“ ()

    ThomasG82 schrieb:

    einfach sichtbar machen
    Lass Dir im Explorer die unsichtbaren Verzeichnisse / Dateien anzeigen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Lass Dir im Explorer die unsichtbaren Verzeichnisse / Dateien anzeigen.

    Was genau meinst du damit? Alles was da ist kann ich mir ja anzeigen lassen aber was nicht da ist geht im Explorer auch nicht auf. :huh:

    Ich habe es jetzt auch mit DirectoryInfo und GetDirectorys versucht und nach Ordnern gesucht welche "100" im Dateinamen enthalten. Aber selbst da findet er nichts obwohl ja mindestens 1 Ordner sichtbar ist und 1 Ordner unsichtbar ist (siehe Anhang)

    VB.NET-Quellcode

    1. Dim di As DirectoryInfo = New DirectoryInfo(Environment.SystemDirectory & "\GroupPolicyUsers\")
    2. Try
    3. Dim dirs As DirectoryInfo() = di.GetDirectories("*100*")
    4. Console.WriteLine("The number of directories containing the number 100 is {0}.", dirs.Length)
    5. Dim diNext As DirectoryInfo
    6. For Each diNext In dirs
    7. Console.WriteLine("The number of files in {0} is {1}", diNext, diNext.GetFiles().Length)
    8. Next
    9. Catch e As Exception
    10. Console.WriteLine("The process failed: {0}", e.ToString())
    11. End Try


    Anmerkung: Ich habe jetzt mal ein wenig rumprobiert. Das Verzeichnis in dem er suchen soll "C:\Windows\System32\GroupPolicyUsers" ist selbst versteckt - also der Ordner "GroupPolicyUsers". Liegt das daran? Kann ich gar nicht in "versteckten" Ordnern arbeiten mit Befehlen? Irgendwie muss man die doch durchsuchen können oder muss ich die 'händich' per Befehl erst sichtbar machen?

    Anmerkung 2: Daran liegt es wohl auch nicht - habe ihn sichtbar gemacht aber trotzdem kommt als Ergebnis für darin enthaltene Ordner immer 0 raus. Und das ist ja falsch
    Bilder
    • Screenshot 2021-02-10 135045.jpg

      29,5 kB, 715×219, 60 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ThomasG82“ ()

    versuchs mal damit:

    VB.NET-Quellcode

    1. Directory.GetDirectories(YourRootPath, "*", SearchOption.AllDirectories)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hallo,
    auch wenn es absurd klingt aber verwendest du ein 64bit Windows und hast du evtl. eingestellt, dass du eine 32bit Anwendung baust? Evtl. wird deine Anfrage auf das Verzeichnis

    Quellcode

    1. System32
    intern nach

    Quellcode

    1. %windir%\SysWOW64\
    umgeleitet.
    Du kannst mal probieren, ob du mit diesem Code weiterkommst und der Pfad erfolgreich ermittelt wird.

    VB.NET-Quellcode

    1. Dim directory As String = String.Empty
    2. If Environment.Is64BitOperatingSystem Then
    3. directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "Sysnative", "GroupPolicyUsers")
    4. Else
    5. directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "GroupPolicyUsers")
    6. End If
    @ISliceUrPanties - das könnte es tatsächlich sein. Werde ich morgen mal beides durch testen und bescheid geben. Im Prinzip mache ich AnyCPU aber mit Vorrang 32-bit. Vielleicht liegt es wirklich an solchen kleinen Unterschieden
    Finde es nur komisch, dass das nirgendwo erwähnt wird, jedenfalls ist mir nichts aufgefallen

    ThomasG82 schrieb:

    Was genau meinst du damit?
    Do was:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany - ja das hatte ich aber es brachte die selben fehlerhaften Ergebnisse.

    Moin, so ich habe mal das von @ISliceUrPanties genutzt und JUHU es klappt.
    Es liegt wirklich daran, dass es ein 64-bit System ist und im 32-bit System der Zugriff im Sande verläuft und ein fehlerhaftes Ergebnis auswirft. (Darauf muss man erstmal kommen)
    Dann ist es auch egal ob die Verzeichnisse versteckt sind oder nicht. Fraglich ist nur warum überhaupt Ergebnisse kommen obwohl es ja, aufgrund der Verschiebung der Verzeichnisse, eigentlich einen Fehler auslösen müsste.

    Das mit dem Sysnative habe ich so noch nie gehört oder gesehen - da mal ein riesiges Danke für!!!

    Naja jetzt läuft es - hab es wie folgt gebastelt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For ZählerVariable = 0 To WinUser.Count - 1
    2. If Windows64 = True Then
    3. If Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "Sysnative", "GroupPolicyUsers", WinUser.Keys(ZählerVariable))) Then
    4. ...meineAnweisungen...
    5. DirectCast(Untermenue_sichern.GB_WinUser.Controls("RB_WinUser" & ZählerVariable), RadioButton).Enabled = False
    6. ...meineAnweisungen...
    7. Else
    8. ...meineAnweisungen...
    9. DirectCast(Untermenue_sichern.GB_WinUser.Controls("RB_WinUser" & ZählerVariable), RadioButton).Enabled = False
    10. ...meineAnweisungen...
    11. End If
    12. Else
    13. If Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "GroupPolicyUsers", WinUser.Keys(ZählerVariable))) Then
    14. ...meineAnweisungen...
    15. DirectCast(Untermenue_sichern.GB_WinUser.Controls("RB_WinUser" & ZählerVariable), RadioButton).Enabled = True
    16. ...meineAnweisungen...
    17. Else
    18. ...meineAnweisungen...
    19. DirectCast(Untermenue_sichern.GB_WinUser.Controls("RB_WinUser" & ZählerVariable), RadioButton).Enabled = False
    20. ...meineAnweisungen...
    21. End If
    22. End If
    23. Next
    Schön, dass es funktioniert :thumbup: . Aber noch zur Klarstellung. Der Zugriff verläuft nicht im Sande, sondern wird intern umgeleitet und betrifft nur 32bit-Anwendungen, die auf 64bit-Systemen ausgeführt werden. Deine AnyCPU Konfiguration sollte eigentlich gewährleisten, dass auf 64bit Systemen auch die 64bit dlls usw. verwendet werden. Du kannst ja zum Testen (aus Spaß an der Freude :) ) den Code noch mal ausbauen, bzw. deine Version wiederherstellen, ein explizites 64bit Kompilat erzeugen und schauen, ob es dann auch funktioniert.

    Hier ist das über die interne Weiterleitung noch nachzulesen:
    docs.microsoft.com/en-us/windo…64/file-system-redirector