Какие папки составляют профиль пользователя - PullRequest
0 голосов
/ 23 апреля 2019

Короткая версия

Существует ли IShellItem , который соответствует всему профилю пользователя?

Или с учетом всех известных констант KNOWNFOLDER:

  • есть ли способ узнать, является ли константа KNOWNFOLDER частью профиля пользователя
  • есть ли способ перечислить константы KNOWNFOLDER, которые еще не были изобретены, поэтому я не пропускаю ни одной?

Длинная версия

Если бы я хотел сделать резервную копию всего профиля пользователя, конечно, я бы начал с

SHGetFolderPath(CSIDL_PROFILE): "C:\Users\Ian"

это очевидно. Эта папка обычно будет содержать:

C:\Users\Ian
╰── AppData
    ├── Local
    ├── LocalLow
    ╰── Roaming

Некоторые из этих других папок уже существуют как собственные CSIDL константы

C:\Users\Ian          CSIDL_Profile
╰── AppData               
    ├── Local         
    ├── LocalLow      CSIDL_Local_AppData 
    ╰── Roaming       CSIDL_AppData 

Существуют также другие папки профиля, которые иногда появляются в папке Профиль :

C:\Users\Ian          CSIDL_Profile
├── Desktop           CSIDL_DesktopDirectoy
├── Documents         CSIDL_Personal
├── Pictures          CSIDL_MyPictures
├── Music             CSIDL_MyMusic
├── Video             CSIDL_MyVideo
├── Favorites         CSIDL_Favorites
╰── AppData               
    ├── Local         
    ├── LocalLow      CSIDL_Local_AppData 
    ╰── Roaming       CSIDL_AppData 

Но эти папки не обязательно должны быть под% USERPROFILE%

Windows позволяет пользователям настраивать определенные специальные папки для перемещения в пользовательские места:

enter image description here

Это означает, что определенные папки могут фактически существовать вне папки "Profile" :

C:\Users\Ian          CSIDL_Profile
╰── AppData               
    ├── Local         CSIDL_Local_AppData 
    ╰── LocalLow      

D:\Users\Ian
├── Desktop           CSIDL_DesktopDirectoy
├── Documents         CSIDL_Personal
├── Pictures          CSIDL_MyPictures
├── Music             CSIDL_MyMusic
├── Video             CSIDL_MyVideo
├── Favorites         CSIDL_Favorites
╰── AppData    
    ╰── Roaming       CSIDL_AppData 

И есть целый ряд CSIDL значений, которые я не знаю, могут ли они или не могут, либо через пользовательский интерфейс, групповую политику, либо иным образом перемещаться в другие места:

C:\Users\Ian                                            CSIDL_Profile
╰── AppData               
    ├── Local                                           CSIDL_Local_AppData 
    │   ├── Microsoft\Windows\History                   CSIDL_HISTORY          
    │   ├── Microsoft\Windows\Temporary Internet Files  CSIDL_INTERNET_CACHE
    │   ╰── Microsoft\Windows\Burn\Burn1                CSIDL_CDBURN_AREA
    ╰── LocalLow                       

D:\Users\Ian
├── Desktop           CSIDL_DesktopDirectoy
├── Documents         CSIDL_Personal
├── Pictures          CSIDL_MyPictures
├── Music             CSIDL_MyMusic
├── Video             CSIDL_MyVideo
├── Favorites                                     CSIDL_Favorites
╰── AppData    
    ╰── Roaming                                   CSIDL_AppData 
        ╰── Microsoft
            ╰── Windows               
                ├── Recent                        CSIDL_RECENT
                ├── Send To                       CSIDL_SENDTO
                ├── Start Menu                    CSIDL_STARTMENU
                │   ╰── Programs                  CSIDL_PROGRAMS
                │       ├── Startup               CSIDL_STARTUP
                │       ├── Startup               CSIDL_ALTSTARTUP
                │       ╰── Administrative Tools  CSIDL_ADMINTOOLS
                ├── Templates                     CSIDL_TEMPLATES
                ╰── Cookies                       CSIDL_TEMPLATES

Я не хочу пропустить папки

Со всеми этими значениями CSIDL я мог бы пропустить некоторые папки, которые составляют профиль пользователя. В моем идеальном фэнтезийном мире был бы IShellItem , который соответствует практически всему в профиле пользователя.

Точно так же, как если вы посмотрите на папку This PC (CSIDL_DRIVES) (, ранее известную как My Computer ) , это виртуальная оболочка, содержащая:

This PC
├── 3D Objects
├── Desktop
├── Documents
├── Downloads
├── Music
├── Pictures
╰── Videos

Это прекрасно; это виртуальная папка, содержащая папки, которые составляют профиль пользователя (независимо от того, где эти папки могут быть на самом деле).

enter image description here

К сожалению, у этого есть два недостатка:

  • он пропускает некоторые папки профиля (например, CSIDL_Foving)
  • затем он продолжает включать все Мой компьютер (урожд. Этот ПК )

    This PC
    ├── 3D Objects
    ├── Desktop
    ├── Documents
    ├── Downloads
    ├── Music
    ├── Pictures
    ├── Videos
    ├── OS (C:)
    ├── Develop (D:)
    ├── DVD RW Drive (E:)
    ├── BD ROM Drive (F:)
    ╰── Local Disk (X:)
    

«Так что просто сделайте резервную копию всех CSIDL, которые представляют папки для каждого пользователя»

Полагаю, тогда я мог бы просто посмотреть на каждый CSIDL, отбросить любые IShellItem , которые являются потомками другого IShellItem (todo: выяснить, как это сделать), а затем только резервное копирование тех:

CSIDL_PROFILE             C:\Users\ian 
CSIDL_LOCAL_APPDATA       C:\Users\ian\AppData\Local 
CSIDL_APPDATA             C:\Users\ian\AppData\Roaming 
CSIDL_NETHOOD             C:\Users\ian\AppData\Roaming\Microsoft\Windows\Network Shortcuts 
CSIDL_PRINTHOOD           C:\Users\ian\AppData\Roaming\Microsoft\Windows\Printer Shortcuts 

CSIDL_DESKTOP             D:\Users\ian\Desktop 
CSIDL_DESKTOPDIRECTORY    D:\Users\ian\Desktop 
CSIDL_PERSONAL            D:\Users\ian\Documents 
CSIDL_MYPICTURES          D:\Users\ian\Pictures 
CSIDL_MYMUSIC             D:\Users\ian\Music 
CSIDL_MYVIDEO             D:\Users\ian\Videos 
CSIDL_FAVORITES           D:\Users\ian\Favorites 
CSIDL_COMMON_FAVORITES    D:\Users\ian\Favorites 
CSIDL_RECENT              d:\Users\ian\AppData\Roaming\Microsoft\Windows\Recent 
CSIDL_SENDTO              d:\Users\ian\AppData\Roaming\Microsoft\Windows\SendTo 
CSIDL_STARTMENU           d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu 
CSIDL_PROGRAMS            d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs 
CSIDL_STARTUP             d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 
CSIDL_ALTSTARTUP          d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 
CSIDL_ADMINTOOLS          d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools 
CSIDL_TEMPLATES           d:\Users\ian\AppData\Roaming\Microsoft\Windows\Templates
CSIDL_COOKIES             d:\Users\ian\AppData\Roaming\Microsoft\Windows\Cookies

CSIDL_HISTORY             d:\Users\ian\AppData\Local\Microsoft\Windows\History
CSIDL_INTERNET_CACHE      d:\Users\ian\AppData\Local\Microsoft\Windows\Temporary Internet Files
CSIDL_CDBURN_AREA         C:\Users\ian\AppData\Local\Microsoft\Windows\Burn\Burn1

Проблема в том, что CSIDL являются неполными (и устарели). Например:

  • CSIDL для отсутствует * Загрузки
  • нет CSIDL для 3D-объектов

Хорошо, я переключусь на современные ЗНАНИЯ .

Таким образом, я получу:

  • FOLDERID_AccountPictures
  • FOLDERID_AppDataDesktop
  • FOLDERID_AppDataFavorites
  • FOLDERID_AppDataProgramData
  • FOLDERID_OriginalImages
  • отрывок 34
  • FOLDERID_Ringtones

Кроме KnownFolders не помогает

Моя схема перечисления всех известных KNOWNFOLDER сбоев по двум причинам.

Любые константы, которые изобрели после написания моего приложения, будут пропущены - пропущено резервное копирование данных профиля пользователя. Не очень хорошая работа для приложения резервного копирования.

Но даже больше того, что я не знаю , которые ЗНАНИЯ на пользователя . Например:

  • FOLDERID_AppsFolder
    • GUID : GUID {1e87508d-89c2-42f0-8a7e-645a0f50ca58}
    • Отображаемое имя : Приложения
    • Тип папки : VIRTUAL
    • Путь по умолчанию : Неприменимо - виртуальная папка

Являются ли Приложения для каждого пользователя? То, что папка не имеет пути к файловой системе, не означает, что она не существует, или что я не могу ее прочитать, или что я не могу перечислить ее файлы, или что я не могу сделать резервную копию его содержание

При использовании современного (т. Е. Windows 95) Shell API для перечисления файлов и папок вы можете просто читать эти файлы.

Подключите ваш мобильный телефон через USB к вашему ПК. Вы можете просматривать файлы и перечислять их с помощью IShellItem api - даже если у них нет пути к файловой системе.

Резюме

Существует ли виртуальная папка оболочки, которая соответствует всему , связанному с профилем пользователя?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Я не думаю, что папка со всеми специальными папками пользователей существует, ближайшая к вам папка FOLDERID_UsersFiles, но я думаю, что это почти то же самое, что и просмотр папки профиля.

Известные папки могут быть созданы сторонними приложениями, см. IKnownFolderManager::RegisterFolder:

Используется, в частности, независимыми поставщиками программного обеспечения (ISV), которые добавляют одну из своих собственных папок в известную систему папок.

Это означает, что вы никогда не сможете составить список всех из них, уже изобретенных или иным образом.

Я могу подумать о 3 возможных способах решения этой проблемы, и все они включают использование IKnownFolderManager для перечисления установленных известных папок.

  • IKnownFolder::GetCategory и найдите KF_CATEGORY_PERUSER папки.

    Папки для каждого пользователя - это те, которые хранятся в профиле каждого пользователя и доступны только этому пользователю.

    (я думаю, они действительно имеют в виду папки, которые по умолчанию хранятся в профиле пользователя.)

  • IKnownFolder::GetFolderDefinition, чтобы найти родительскую папку и просмотреть родительское дерево, чтобы увидеть, заканчивается ли оно в FOLDERID_Profile.

  • IKnownFolder::GetPath(KF_FLAG_DEFAULT_PATH,...) и проверьте, находится ли этот путь внутри профиля пользователя. Не вижу смысла выбирать этот метод.

В большинстве случаев первые два метода должны давать одинаковые результаты, но это зависит от того, как они зарегистрированы. Папка для категории пользователя теоретически может находиться вне папки профиля по умолчанию AFAIK, а виртуальная папка может иметь папку профиля в качестве родительской. Использование таких инструментов, как Браузер известных папок или Информация об известных папках может быть полезно для визуализации этих различий.

Это не распространяется на большинство виртуальных папок, таких как FOLDERID_AppsFolder, но я не уверен, что вам нужно создавать резервные копии виртуальных папок.

Виртуальные папки, в которых отображается содержимое, локальное для машины, скорее всего, хранятся где-то в профиле пользователя (% AppData%?) Или в реестре, и вы уже создаете резервные копии этих папок.

Виртуальные папки, отображающие контент с удаленных компьютеров (FTP, WebDAV, Gmail и т. Д.), Могут не быть тем, что вы должны выполнять резервное копирование без специального подтверждения / выбора пользователем?

Виртуальные папки, которые отображают контент с аппаратного обеспечения, подключенного к машине, на самом деле не являются частью профиля пользователя IMHO.

Даже если вы решите, что хотите сделать резервную копию виртуальных папок, как вы собираетесь это сделать? Вы просто собираетесь хранить PIDL? Или вы собираетесь попросить IStream для каждого предмета и сохранить его? Формат PIDL может быть известен только этому конкретному классу IShellFolder, и может быть проблематично разобраться с IStream, когда у вас нет экземпляра этого IShellFolder при просмотре резервных копий данных в программе резервного копирования. , Вы сможете восстановить данные только на компьютере, на котором доступен этот класс IShellFolder, и даже тогда он может не поддерживать запись IStream s.

1 голос
/ 23 апреля 2019

Существует ли виртуальная папка оболочки, которая соответствует всему, что связано с профилем пользователя?

AFAIK, нет, нет.

...