Как получить фактический путь к файлу в Vista с UAC? - PullRequest
1 голос
/ 05 января 2009

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

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

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

Ответы [ 3 ]

2 голосов
/ 05 января 2009

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

1 голос
/ 05 января 2009

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

1 голос
/ 05 января 2009

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

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

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

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

...