Вопрос

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

У меня есть пользователь с Vista, для которого CreateFile () возвращает ошибку 5 (доступ запрещен). Было бы полезно, если бы я знал, где CreateFile () на самом деле пытается создать файл, чтобы мы могли проверить права доступа к его папке. Проблема с Vista (UAC) заключается в том, что он не пытается создать файл в каталоге, в котором я прошел. Он также может находиться в каталоге VirtualStore. Еще одним источником путаницы является то, что этот пользователь является немецким, и хотя SHGetSpecialFolderPath () возвращает " C: \ Program Data \ blah blah " как путь, я не думаю, что на самом деле это путь. Я думаю, что в немецкой Vista используется немецкое слово «Program Data». Я хотел бы иметь возможность сообщить пользователю " Это точный путь, по которому мы пытаемся создать файл. Проверьте свои разрешения в этой папке. & Quot;

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

Это было полезно?

Решение

Запустите Process Monitor и посмотрите, что он делает: http://technet.microsoft.com/en-us/sysinternals/bb896645. ASPX

Другие советы

Если в UAC используются не те пути, которые вы хотите, значит, перенаправление действует. Чтобы убедиться, что перенаправление не происходит, добавьте манифеста для вашего приложения, которое указывает Vista, что ваше приложение правильно закодировано и знает об ограничениях доступа (т.е. вы не пишете, например, в HKLM или папку программ, если Ваше приложение не требует прав администратора для запуска).

Но ваше приложение должно иметь возможность записи в папку APPDATA (если это то, что вы действительно используете).

Убедитесь, что вы используете CSIDL_APPDATA, а не CSIDL_COMMON_APPDATA (последний доступен только с правами администратора).

Чтобы найти реальный путь (тот, который вы ожидаете), попросите пользователя ввести% APPDATA% в панель обозревателя (или нажмите Windows + R, затем введите% APPDATA%, введите). Откроется проводник в этой папке.

Насколько я понимаю, ProgramData используется Vista для записи файлов, которые пытались записать в C: \ Program Files, но потерпели неудачу, поскольку, если вы не запускаете приложение от имени администратора, вы не можете записывать внутри программных файлов. Возможно, вам следует попробовать сохранить файлы в папке AppData под текущим пользователем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top