Windows: Как найти каталог LocalAppData для каждого пользователя на определенном компьютере? - PullRequest
1 голос
/ 25 марта 2009

Сначала немного фона:

Наш продукт должен интегрироваться с клиентом Lotus Notes путем добавления или обновления строки в файле NOTES.INI.

У нас нет проблем, если мы имеем дело с однопользовательской установкой Notes (то есть, если на компьютере несколько пользователей Windows, все они будут использовать одну и ту же конфигурацию Notes). В этом случае в каталоге установки Notes есть один файл NOTES.INI.

Однако при многопользовательской установке Notes (где каждый пользователь Windows имеет свою собственную конфигурацию Notes), каждый пользователь имеет свой собственный файл NOTES.INI, который хранится в каталоге LocalAppData пользователя, например C: \ Documents and Settings \ Имя пользователя \ Локальные настройки \ Данные приложения \ Lotus \ Notes.

Так вот в чем проблема: Если наш продукт устанавливается на компьютер с многопользовательской установкой клиента Notes, мы должны иметь возможность обновить файл NOTES.INI в профиле каждого пользователя на этом компьютере.

Мы можем сделать это, запустив программу при входе пользователей в систему, которая проверяет, был ли обновлен файл NOTES.INI этого пользователя, и если нет, обновляет его. Однако процесс удаления для нашего приложения должен иметь возможность отменить эти изменения для всех пользователей на компьютере.

Отсюда возникает вопрос: предполагая, что наш код работает с правами локального администратора, есть ли какой-нибудь способ, которым мы можем перебирать профиль каждого пользователя и находить его каталог LocalAppData, чтобы мы могли внести необходимые изменения?

Любые предложения с благодарностью: -)

РЕДАКТИРОВАТЬ 2009-03-25 16:52 GMT:
Похоже, у меня есть возможный подход (спасибо Martin C):

    For each subkey of <b>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList</b>:
      If it's a "real" user (determined somehow):
        Remember the subkey name - that's the user's SID
        Read the ProfileImagePath value
        If the user's Registry hive is not already loaded (i.e. there is no subkey of <b>HKEY_USERS</b> with the appropriate SID):
          Enable the <b>SE_BACKUP_NAME</b> and <b>SE_RESTORE_NAME</b> privileges
          Load the hive from <b>ProfileImagePath\NtUser.dat</b> using RegLoadKey
        Try to find the user's LocalAppData folder using each of the following Registry keys in turn:
          <b>HKEY_USERS\<SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders</b>
          <b>HKEY_USERS\<SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders</b>
          <b>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders</b>
          <b>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders</b>
        Expand environment variables in the resulting path if necessary (presumably just expanding %USERPROFILE% to the ProfileImagePath we got earlier)
        Use the path to find the user's NOTES.INI file and make the appropriate changes
        If we had to load the hive:
          Unload the hive using RegUnLoadKey

Я, вероятно, могу это закодировать, но это кажется немного хрупким, и потенциально есть много способов, как это может пойти не так. У кого-нибудь есть более "официальный" подход?

1 Ответ

3 голосов
/ 25 марта 2009

Вы можете перечислить подключи

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Каждый подраздел содержит «ProfileImagePath», который будет указывать на базовый путь профиля. В зависимости от версии ОС и языковых настроек вы можете определить местоположение LocalAppData (будьте осторожны, оно зависит от языка!).

Редактировать: Возможная отправная точка для дальнейшего движения может быть

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

К сожалению, это может варьироваться от пользователя к пользователю, и HKEY_USERS содержит только ключи пользователей, которые загрузили профили. Вы можете попробовать, если вы можете каким-либо образом загрузить профили (может быть, кто-то может прикрепить реестр пользователя, если он еще не загружен в HKEY_USERS?).

...