Сначала немного фона:
Наш продукт должен интегрироваться с клиентом 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
Я, вероятно, могу это закодировать, но это кажется немного хрупким, и потенциально есть много способов, как это может пойти не так.
У кого-нибудь есть более "официальный" подход?