Documents and Settings - Users - Benutzer

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Documents and Settings - Users - Benutzer

    Hallo,

    Die Verzeichnisse

    \Documents and Settings
    \Users oder \Users\myuserid ?
    \Benutzer oder \Benutzer\myuserid ?

    verweisen wohl alle auf das gleiche Verzeichnis.

    Wenn ich es richtig verstanden haben, dann gibt es wohl zwei Arten der Alias Bildung:

    Systemverweise: etwa ersetzen von "Users" durch "Benutzer"

    Links: hier wird ein realer Verzeichnispfad durch einen Link-Namen ersetzt.

    Daneben gibt es wohl noch Bibliotheken, mit denen man mehrere Verzeichnisse virtuell zusammen fasssen kann, die dann aber im Verzeichnisbaum separat ausgewiesen werden.

    In meiner Routine zum Auswerten von Verzeichnissen, verwende ich die Anweisungen:


    VB.NET-Quellcode

    1. strFileList = Directory.GetFileSystemEntries(strPath)
    2. For i = 0 To strFileList.Count - 1
    3. If File.GetAttributes(strFileList(i)) And FileAttributes.Directory Then ...


    Mit diesem Coding werden dann die Ordner \Documents and Settings und \Users so verarbeitet, als wären das ganz verschiedene Verzeichnisse.

    Wie kann ich erkennen, dass es sich um Duplikate handelt und etwa den Alias Namen auslassen?

    LG
    Peter
    Wenn Du auf die "Originale" zugreifen willst, mach es so:

    VB.NET-Quellcode

    1. Dim path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) ' hier das entsprechende Enum auswählen
    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:

    hier das entsprechende Enum auswählen



    Also, das verstehe ich jetzt leider nicht.

    Diese Anweisung gibt mir den Pfad meines "profile folders" zurück. Was fange ich jetzt damit an?

    Also, ich suche eine allgemeine Lösung. Nicht nur eine Lösung für den profile folder.

    LG
    Peter

    Peter329 schrieb:

    Also, das verstehe ich jetzt leider nicht.
    :rolleyes:

    VB.NET-Quellcode

    1. Dim path1 = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
    2. Dim path2 = Environment.GetFolderPath(Environment.SpecialFolder.SystemX86)
    3. Dim path3 = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)
    4. Dim path4 = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
    5. Dim path5 = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic)
    usw.
    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!
    Also ich hoffe, dass du mit mir nachsichtig bist, aber ich verstehe das leider immer noch nicht.

    Mit den fünf oben angebenen Anweisungen erhalte ich fünf Pfade.

    Muss ich diese Anweisungen kodieren? Oder sind die Teil einer Enumeration?

    Sind das dann alle Pfade bei denen Directory Alias Name auftreten können?

    Und was fange ich damit an ...? Mit meinem Programm will ich beliebige Verzeichniss-Strukturen bearbeiten ... und in jedem Fall Alias Namen erkennen. "Document Settings - Users - Benutzer" ist nur ein Beispiel für mein Problem. Ich möchte ganz allgemein erkennen, ob ein Directory Name "real" ist ... oder ob es sich um einen alternativen Alias Namen handelt.

    Ich hoffe, ich habe mein Anliegen verständlich machen können.

    LG
    Peter
    Also, wie ich das verstehe, liefert die "Environment" Anweisung doch nur die Konstruktion von bestimmten Systempfaden durch Systemvariable. Aber mit meinem Problem der Alias Namen hat das doch nichts zu tun.

    Je länger ich mich damit beschäftige, desto mehr erkenne ich, dass ich hier wohl gravierende Wissenlücken in Bezug auf die Verwaltung von Directory Namen unter Windows habe. Und je länger ich mir die Sache ansehe, desto mehr Fragen habe ich:

    Ich habe mal den Verzeichnisbaum C:\Benutzer\myuserid geöffnet. Auf das gleiche Verzeichnis komme ich übrigens auch, wenn ich unter "Desktop" das Verzeichnis "myuserid" anklicke.

    Wieso werden einige Ordner mit einem "normalen" Odner Icon angezeigt, während andere Ordner nur mit einem schwach schattierten Icon angezeigt werden (wie z.B. der Ordner \Users\myuserid\AppData).

    Sehr viele Ordner haben ganz spezielle Icons, z.B. mit einem Pfeil nach unten ( \Users\myuserid\Download ). Daneben gibt es Dutzende von anderen Icons, etwa für "Eigene Musik", "Favoriten", "Kontakte" ... etc. etc.

    Wenn ich das richtig verstehe wird dies über die Datei "desktop.ini" eingerichtet! Bei einigen Verzeichnissen kann ich das bestätigen. Aber nicht bei allen. Etwa in meinem Ordner \Users\Download finde ich diese Datei eben gerade NICHT! Wo und wie wird das denn eingestellt? Stehen die speziellen Icons für irgend eine Funktion?

    Einige Icons haben einen kleinen blauen Pfeil in der linken unteren Ecke. Das sind wohl Links. Den "wahren" Verzeichnisnamen (oder das was ich dafür halte) kann ich mir anzeigen, indem ich mit der rechten Maustaste darauf klicke und dann auf "Sicherheit" klicke. "Cookies" wird dann etwa in "C:\Users\myuserid\Cookies" übersetzt.

    Das klappt aber nicht immer. Der Ordner "Recent" verhält sich ganz anders. Da wird nur die Registerkarte "Allgemein" angezeigt (die gar nichts aussagt) ... obwohl der Ordner im Verzeichnisbaum ganz genauso ausschaut, wie etwa der Ordner "Cookies".

    Der Ordner "RecentPlaces hat das gleiche Erscheinungsbild. Aber in diesem Fall erhält man ein Eigenschaften Window wie für "Cookies". Allerdings wird jetzt unter Sicherheit der Pfad "C:\Users\myuserid\RecentPlaces.lnk" angezeigt. Wieso kriegt dieser Ordner ein ".lnk" während das für "Cookies" nicht der Fall ist ... ?

    Der Link "Eigene Dateien" verweist wohl auf die gleichen Subdirectories wie der Ordner "Eigene Dokumente". Diese Gleichhat kann ich aber nicht aus dem Verzeichnisbaum ersehen. Denn mit dem Eigenschaften Fenster werden unter Sicherheit jeweils die Pfade

    C:\Users\myuserid\Eigene Dateien
    C:\Users\myuserid\Eigene Dokumente

    angezeigt. Woher weiß ich denn jetzt, dass es sich um die gleichen Ordner handelt ohne mir deren Inhalt anzugucken?

    Manmal kann ich auf Order mit einem blauen Pfeil nicht zugreifen, z.B. "C:\Users\Winuser1\Lokale Einstellungen\TemporaryInernetFiles" ... Das Eigenschaftsfenster dieses Ordners hat jetzt zur Abwechslung mal zwei Reiter: "Allgemein" und "Vorgängerversion". Beide helfen mir nicht wirklich weiter, um zu wissen, wo der Ordner nun REAL gespeichert ist.

    Gleich neben diesem Link steht aber der Order "C:\Users\Winuser1\Lokale Einstellungen\Temp" und da gibt es dann einen Subfolder "TemporaryInternetFiles". Ich vermute mal, dass dies der gleiche Ordner ist. Und auf den KANN ich zugreifen! Welche Logik verbirgt sich denn dahinter?

    Irgendwie hab ich das Gefühl, dass ich keine Ahnung mehr habe, wo Windows 7 meine Dateien jetzt abspeichert!

    Kann mir jemand helfen die Kontrolle über MEINE Daten wieder zu erlangen? *g*

    LG
    Peter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()

    Nun bin ich mit meinen "Forschungen" ein wenig weiter gediehen.

    Offensichtlich werden von Windows 7 eine ganze Reihe von "symbolischen Links" verwendet, um früher verwendete Verzeichnisnamen zu erhalten. So z.B. "Dokumente und Einstellungen".Mit diesen symbolischen Namen kann man unter dem alten Namen auf die neue Ressource alternativ zugreifen. Die neue Ressource heißt "Benutzer".

    Außerdem werden intern wohl nur englische Namen verwendet ... die Eindeutschung erfolgt m.W. vom Windows gesteuert automatisch, also ohne irgendwelche sichtbaren Links.

    Die originalen englischen Namen erhält man, indem man in der Adressleiste des Explorers auf das Ordnersymbol klickt. Zurückschalten kann man das nur, indem man in der Verzeichnisliste einen beliebigen Eintrag markiert. (Wie spaßig!)

    Auf welchen Namen der symbolische Link verweist kann man im Explorer m.W. nicht herausfinden. Wer auch immer sich das ausgedacht hat. Sehr spaßig! Aber mit dem guten alten DIR command kann man das dann doch noch anzeigen:

    Quellcode

    1. Microsoft Windows [Version 6.1.7601]
    2. Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.
    3. C:\>dir /a
    4. Verzeichnis von C:\
    5. 17.01.2013 17:54 <DIR> $RECYCLE.BIN
    6. 11.02.2011 19:00 <DIR> Boot
    7. 21.11.2010 05:23 383.786 bootmgr
    8. 11.02.2011 19:00 8.192 BOOTSECT.BAK
    9. 22.05.2013 21:57 <DIR> Config.Msi
    10. 14.07.2009 07:08 <VERBINDUNG> Documents and Settings [C:\Users]
    11. 25.05.2013 09:07 9.648.193.536 hiberfil.sys
    12. 16.01.2013 18:20 <DIR> MSOCache
    13. 19.11.2011 11:21 0 OS
    14. 25.05.2013 09:07 12.864.258.048 pagefile.sys
    15. 14.07.2009 05:20 <DIR> PerfLogs
    16. 22.05.2013 20:32 <DIR> Program Files
    17. 22.05.2013 20:39 <DIR> Program Files (x86)
    18. 22.05.2013 21:52 <DIR> ProgramData
    19. 11.02.2011 21:24 <DIR> Recovery
    20. 16.01.2013 10:43 <DIR> SWSETUP
    21. 25.05.2013 09:11 <DIR> System Volume Information
    22. 16.01.2013 10:42 <DIR> SYSTEM.SAV
    23. 17.01.2013 17:54 <DIR> Users
    24. 22.05.2013 20:33 <DIR> Windows



    Hieran erkennt man, dass "C:\Documents and Settings" ein symbolischer Link ist, der auf "C:\Users" verweist!

    Mit dem Befehl

    VB.NET-Quellcode

    1. strFileList = Directory.GetFileSystemEntries(strPath)


    erhalte ich ALLE Einträge eines Directories und zwar (erfreulicherweise) mit den ENGLISCHEN Namen.

    Mit dem Befehl

    VB.NET-Quellcode

    1. If File.GetAttributes(strFileList(i)) And FileAttributes.Directory Then ...


    erhalte ich daraus alle Directories UND Verbindungsnamen.

    Wie kann ich jetzt erkennen, ob es sich um eine DIRECTORY <DIR> oder einen symbolischen Link <VERBINDUNG> handelt?

    Ich hoffe, dass es mir jetzt gelungen ist, mein Problem klar zu machen.

    LG
    Peter

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

    Du könntest die Attributes auswerten. ReparsePoint steht meines Wissens für die SymLink
    Beispiel:

    VB.NET-Quellcode

    1. Dim dirInfo As New IO.DirectoryInfo("c:\")
    2. Dim linkFolders = (From di In dirInfo.GetDirectories Where (di.Attributes And IO.FileAttributes.ReparsePoint) = IO.FileAttributes.ReparsePoint Select di).ToList
    3. For Each folder In linkFolders
    4. Debug.Print("--------")
    5. Debug.Print(folder.FullName)
    6. Debug.Print(folder.Attributes.ToString)
    7. Next

    Peter329 schrieb:

    oder einen symbolischen Link <VERBINDUNG> handelt?
    Das sollte Dich nicht kümmern. Das ganze ist ja gemacht worden, um bei einem deutschen und einem englischen System im Programm keinen Unterschied haben zu müssen.
    Arbeite mit den symbolischen Namen und gut. Überlass den Rest dem System.
    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!
    Herzlichen Dank erst mal an alle Ratgeber!

    @RodFromGermany

    RodFromGermany schrieb:

    Das sollte Dich nicht kümmern.


    Das kümmert mich sehr wohl! *grins*

    Weil dadurch nämlich das gleiche Verzeichnis in meinem Program ZWEIMAL verarbeitet wird. Einmal als symbolic Link und einmal als originäre Datei. Und das geschieht an Dutzenden von Stellen im Verzeichnisbaum des C-Laufwerks!

    Außerdem würde ich gern wissen, WELCHE meiner Daten WO real gespeichert sind! Das sind nämlich MEINE Daten und nicht die von Microsoft! Ich halte das für eine ausgemachte "Schw**nerei", wenn man den wahren Speicherort eines Verzeichnisses erst durch lange Nachforschungen in Erfahrungen bringen kann. Das sollte der Explorer gefälligst anzeigen! Na ja, das ist nicht der einzige Kritikpunkt, den ich an diesem "wunderbaren" Programmprodukt anzumerken habe. *grins*

    @xtts02

    Das sieht jetzt sehr gut aus. Das bit "ReparsePoint" mit dem Wert 1024 ist wohl genau der Indicator für einen symbolischen Link. Soweit ich das jetzt ausgetestet habe, werden damit die Verzeichnisse in der richtigen Weise verarbeitet.

    Ich will mal hoffen, dass damit alle Überraschungen der Verzeichnisstruktur vorbei sind. *grins*

    LG
    Peter

    Peter329 schrieb:

    Einmal als symbolic Link und einmal als originäre Datei.
    Mit welchem Code?
    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!

    Peter329 schrieb:

    WELCHE meiner Daten WO real gespeichert sind

    Ich finde, dass Microsoft das seit Win7 (oder schon Win Vista?) gut gelöst hat. Es gibt physisch nur noch einen einzigen Ordner -> standardmäßig: %SystemDrive%\Users. Der angezeigte Name hängt letztendlich von der Sprache des Betriebssystem ab und ist eigentlich egal.
    Zugriff für die Anwendung auf solche Ordner soll ohnehin nie über festen Pfad erfolgen, sondern immer über das vom Betriebssystem bereitgestellten Systemvariablen (Environment.SpecialFolder). Von daher verstehe ich dein Problem ist wirklich.

    RodFromGermany schrieb:

    Mit welchem Code?


    Na, mit dem Code, den ich in diesem Thread eingestellt habe. Damit erhalte ich in der Liste sowohl Directories als auch symbolic Links angeliefert. Ohne die Abfrage auf das Attribut "ReparsePoint" würde ich beide verarbeiten. Danke also für deine Hilfe!

    xtts02 schrieb:

    Von daher verstehe ich dein Problem ist wirklich.


    Das habe ich jetzt ja inzwischen verstanden: dass alle Ordner physisch unter dem Ordner "Users" liegen. Nur werden die Daten eben so nicht präsentiert, sondern VOLLKOMMEN CHAOTISCH.

    Ein Beispiel:

    Der Ordner "Dokumente und Einstellungen" heißt in Wahrheit "Documents and Settings" und verweist auf "Users"

    "Users" enthält einen Unterordner "All Users". Der ist als <SYMLINKD> gekennzeichnet (was immer das bedeutet) und verweist auf "ProgramData" wieder im Root Verzeichnis.

    Des nenne ich einen Zugriff durchs Knie in die Brust.

    Im Verzeichnis "ProgrammData" finde ich dann ein Verzeichnis "Desktop" ... wenn ich das anklicke, dann wird mir der Zugriff verwehrt

    Wenn ich Verzeichnis "Desktop" im Root Verzeichnis anklicke, habe ich Zugriff!

    Und natürlich sind wir uns darüber einig, dass es den Ordner "Desktop" weder im Ordner "ProgrammData" noch im Root Verzeichnis gar nicht real gibt, sondern, dass der wieder ein Unterordner von "Users" ist. Obwohl das wiederum nirgendwo angezeigt wird! Wieso kann ich also einmal zugreifen und einmal nicht?

    Also eine chaotischere Darstellung der Dateistruktur habe ich bisher noch nicht gesehen.

    Der Explorer gibt mir in keiner Weise darüber Auskunft, wo und wie meine Daten gespeichert sind! Ich erhalte einen Verzeichnisbaum, der mit der wirklichen Welt kaum noch etwas zu tun hat und wo die realen Namen konsequent vor mir verborgen werden!

    Das ist mein Problem. Und ich weiß nicht, ob nur ich alleine dieses Problem habe!

    Vielleicht kannst du mir ja mal probeweise den Unterschied zwischen <VERBINDUNG> und <SYMLINKD> erklären. Ich bin bisher dahingehend noch nicht schlau geworden. *grins*

    Quellcode

    1. Verzeichnis von C:\users
    2. 17.01.2013 17:54 <DIR> .
    3. 17.01.2013 17:54 <DIR> ..
    4. 14.07.2009 07:08 <SYMLINKD> All Users [C:\ProgramData]
    5. 14.07.2009 09:07 <DIR> Default
    6. 14.07.2009 07:08 <VERBINDUNG> Default User [C:\Users\Default]
    7. 14.07.2009 06:54 174 desktop.ini
    8. 19.11.2011 11:58 <DIR> Public
    9. 19.05.2013 13:11 <DIR> MyUser
    10. 31.03.2013 10:20 <DIR> MyUser1
    11. 1 Datei(en), 174 Bytes
    12. 8 Verzeichnis(se), 361.856.622.592 Bytes frei



    LG
    Peter

    Peter329 schrieb:

    Na, mit dem Code, den ich in diesem Thread eingestellt habe.
    Fein.
    Also bitte noch mal:
    Welchen Code verwendest Du aktuell?
    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!

    VB.NET-Quellcode

    1. Try
    2. strFileList = Directory.GetFileSystemEntries(strPath)
    3. Catch ex As Exception
    4. 'Display Error message ...
    5. Exit Sub
    6. End Try
    7. ...
    8. For i = 0 To strFileList.Count - 1
    9. ...
    10. If File.GetAttributes(strFileList(i)) And FileAttributes.Directory Then
    11. lngDirectoriesCnt += 1
    12. ...
    13. If File.GetAttributes(strFileList(i)) And FileAttributes.ReparsePoint Then
    14. 'Process Link ...
    15. Else
    16. 'Process Directory ...
    17. End If
    18. Else
    19. 'Process File ...
    20. End If
    21. ...
    22. Next


    So sieht mein Code von der Struktur her aus, nachdem ich die von dir erwähnte Sache mit dem ParsePoint eingebaut habe.

    LG
    Peter

    Peter329 schrieb:

    So sieht mein Code von der Struktur her aus
    Gib Deinem Code bitte mal ganz fix Option Strict On.
    Beseitige die Fehler und versuch es dann noch einmal.
    Was soll denn nun wo passieren?
    Wo werden Files so und solch erfasst?
    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

    haaaalt, das Problem mit meinem Programm hab ich doch gelöst! Das läuft jetzt suuuper! Also vielen Dank nochmal für deine Hilfe!

    Der zweite Teil der Diskussion bezog sich auf die Anmerkung von User "xtts02" bezüglich der Klarheit und Strukturiertheit des Windows Explorers. Und da hab ich bemängelt, dass die Sache mit den "symbolic links" total chaotisch ist, weil man keine Ahnung hat, wo man wirklich landet, wenn man ein Directory im Explorer anklickt. Das hat aber mit meinem Programm nix zu tun.

    Alles klar? Also, die Sache mit meinem Coding ist damit erledigt. Nochmalsl vielen Dank für deinen super Hinweis.

    LG
    Peter
    @ErfinderDesRades

    Vielen Dank für deinen Hinweis auf die IO.FileInfo.

    Jetzt hab ich mir deinen Beitrag und die MSN Info angeschaut. Aber da finde ich nicht die Attribute, die ich benötige.

    CreationDate und CreationTime kommen mir sehr gelegen. Was mir fehlt sind jedoch die folgenden Eigenschaften eines Directories :

    Handelt es sich um ein "normales" Directory, einen "symbolic link" oder eine "directory junction". Das Attribut "ParsePoint" unterscheidet leider nicht zwischen symbolic link und directory junction.

    Wenn es sich um einen Link oder eine Junction handelt, dann wüsste ich gern noch den Namen auf den dieser Link verweist. Dieser Name wird durch "dir /A" ausgegeben, aber wie man das mit VB machen kann, habe ich bisher nicht heraus gefunden.

    Irgendwelche Ideen, wo und wie man diese Info auslesen kann?

    LG
    Peter

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