Файлы в разделе Program Files имеют раздельную личность - PullRequest
2 голосов
/ 30 ноября 2011

У меня есть приложение на Ruby, которое я устанавливаю (вместе с упакованным интерпретатором ruby) в Program Files в Windows 7 с помощью установщика, созданного NSIS. Чтобы отладить его, я отредактировал один из файлов, добавив несколько операторов отладки. После этого я удалил пакет и запустил новую версию установщика, которая включает новую копию отредактированного файла без операторов отладки.

Теперь я не могу получить новую копию для загрузки в ruby. Если я запускаю type <filename> в cmd.exe или открываю файл в Notepad.exe или Firefox, я вижу новую версию. Если я запускаю ruby -e "puts File.read('<filename>')" или открываю файл в emacs, я вижу старую версию.

Если в проводнике Windows я скопирую файл в новое имя файла, все содержимое сможет увидеть новое содержимое в этом имени файла. Если я удаляю исходный файл и переименовываю копию для замены оригинала, возвращается разделенная личность.

Эта ситуация переживает перезагрузку, поэтому дело не в том, что файл случайно остается открытым.

Что здесь происходит? Есть ли какой-то аспект процесса установки, который может быть контрольным указанием файла таким образом, чтобы я мог вернуться или, по крайней мере, отключить его во время отладки установщика?

обновление

Если я запускаю ruby -e "puts File.read('<filename>')" в консоли, которая запускается от имени администратора, я вижу правильное новое содержимое. Как должен управлять этим файлом?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Я думаю, что это связано с виртуализацией файловой системы UAC. Проверьте, существует ли ваш файл в C:\Users\<username>\AppData\Local\VirtualStore. Если это так, удалите его из VirtualStore.

Тот факт, что вы видите правильный файл при запуске консоли администратора, доказывает, что это происходит из-за виртуализации: виртуализация UAC отключена для процессов с повышенными правами.

1 голос
/ 30 ноября 2011

В общем, не помещайте файлы, которые вы планируете изменить, в Program Files.Начиная с Vista, есть интересный способ «позволить» вам писать в защищенный файл, но он действительно сохраняется в каталогах данных вашего приложения, а не в Program Files.Таким образом, утилиты, которые проходят через Windows API, правильно находят «новую» версию файла, а утилиты более низкого уровня (ruby.exe) только находят существующую версию.Если вы перейдете в эту папку, вы увидите кнопку «Файлы совместимости» прямо над содержимым?Нажмите на нее, и вы увидите обновленную версию.

Скотт Хансельман написал хорошую статью об этом , когда она была представлена ​​в Vista.

Запись в реальный файл возможна только при входе в систему с правами администратора.

...