2009-07-06 4 views
2

Я начал стать хорошим гражданином, согласно этому вопросу здесь:Пользователи/Публикация не может быть записана в Windows 7: где я помещаю данные пользователя?

Domain compatibility: where should shared data be written?

Моя пользовательская информация теперь записывается в переменную окружения:

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 

, а затем присоединяя каталог там. Если каталог не существует, программа автоматически создает его, а затем вся информация кросс-пользователя (файлы журнала, данные захвата, параметры настройки и т. Д.) Все хранится в этом файле. Мое понимание этого файла заключается в том, что он должен быть полностью доступен для пользователя, независимо от настройки машины.

В Windows XP при подключении к домену нет проблем; этот файл обнаружен и написан правильно. В Windows 7 программа не работает. Теперь каталог пользователя C: \ ProgramData \ MyFolder, и эта папка создается только как прочитанная (гений! Почему бы не сделать ее просто прочитанной, в конце концов, никто не хочет писать в место CommonApplicationData!).

Какую директорию я должен использовать? Эта специальная папка предназначена для той задачи, которая мне нужна, но, похоже, эта папка не может быть записана пользователем.

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

ответ

2

В соответствии с Vista compatibility guidelines ваше приложение должно создать папку для своих файлов под CommonApplicationsData в установщике (я упоминал, что он также должен иметь установщик?) И назначить соответствующие разрешения для этой папки.

+0

ok, так как я могу использовать FileSystemAccessRule для всех пользователей? Вызов функции имеет только конкретный идентификатор пользователя. – mmr

+0

Этот идентификатор пользователя может быть «Everyone», который представляет собой группу, к которой принадлежит любой пользователь Windows. Вы не должны жестко указывать имя, хотя оно зависит от локализованных версий Windows. Вместо этого используйте что-то вроде этого: SecurityIdentifier every = new SecurityIdentifier (WellKnownSidType.WorldSid, null); FileSystemAccessRule rule = new FileSystemAccessRule (все, ...); –