Обойти ограничения разрешений Windows для папки с программными файлами - PullRequest
2 голосов
/ 03 июля 2010

Я сделал небольшое приложение на C. Он выполняет некоторые манипуляции с файлами, в основном ищет и изменяет имена некоторых файлов. Но если он используется в Win Vista / 7 в папке с программными файлами, программа сообщает, что разрешение отклонено. Есть ли способ обойти это?

Кроме того, может ли Java обойти это?

Ответы [ 7 ]

6 голосов
/ 03 июля 2010

Не обходите, используйте каталог «Application Data».

Program Files предназначен для хранения файлов, которые не изменяются во время работы приложения.Файлы, хранящиеся там, следует изменять только во время установки / обновления.

Файлы, которые необходимо изменить во время запуска приложения (профили, настройки и т. Д.), Должны храниться в каталоге «Данные приложения» в папке пользователя.

Для получения пути используйте передачу функции SHGetFolderPath :
CSIDL_APPDATA - для получения каталога текущего пользователя «Данные приложения»
CSIDL_COMMON_APPDATA - для получения каталога всех пользователей «Данные приложения»
(и в конечном итоге) CSIDL_LOCAL_APPDATA - для получения текущего каталога «Local Application Data» текущего пользователя, который предназначен для хранения информации, относящейся только к локальной машине, которую нельзя переместить на другие машины, в отличие от «Application Data» (также называемой «Roaming Application»).Данные »), где файлы можно свободно перемещать с компьютера на компьютер (т. Е. Вы можете сохранить их во время переустановки ОС).

Если вашему приложению действительно нужно изменить каталог Program Files, то у пользователя запрашивается разрешение:ты должен сделать.Вы можете дать своему приложению специальный манифест, чтобы оно пыталось получить права администратора при каждом запуске.Вы также можете получить привилегии «на лету».

Если вы пишете конкретное приложение, которое практически не мешает ОС, то вы можете создать службу (демон).Каждый раз, когда сервис запускается, он получает привилегии, данные при регистрации сервиса.Для получения дополнительной информации см. «DLL, процессы и потоки -> Службы» в MSDN

// РЕДАКТИРОВАНИЕ
Вы также можете легко создать службу в .NET (C # наиболее подходит).Сервисное приложение может общаться с клиентским приложением, написанным на другом языке.Но для регистрации услуги вам понадобятся права администратора.С этим типом приложения вы должны рассмотреть все вопросы безопасности.

6 голосов
/ 03 июля 2010

Не было бы особого смысла в правах доступа к файлам, если бы их можно было легко обойти.

Вы можете обойти их, если вы написали драйвер ядра, который напрямую обращался к блокам диска, но тогда вам все равно нужно быть администратором, чтобы установить драйверы ядра.

В конце концов, единственный способ «обойти» разрешения на доступ к файлам - запустить вашу программу от имени администратора.

3 голосов
/ 03 июля 2010

Как уже говорили многие, вы не должны пытаться обойти ограничения , налагаемые операционной системой.

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

В Vista / Win7 / Server2k8, например, вы можете использовать UAC . Я не привожу здесь конкретные API, потому что есть разные способы повышения или получения привилегий через UAC. Важно отметить, что UAC полагается на взаимодействие с пользователем для предоставления этого , и это является положительным моментом: -)

Надеюсь, это поможет вам и другим в правильном направлении.

3 голосов
/ 03 июля 2010

Есть ли способ обойти это?

Вы не должны этого делать.Даже если есть способ, то это дыра в безопасности, и со временем она будет исправлена.

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

Так что если вы не можете переименовать файлы из-заpermissions, сообщить пользователю «access denied».Позвольте пользователю справиться с ситуацией.Молча обходить разрешения (даже если это возможно) чрезвычайно опасно - в конце концов, какой-нибудь не очень умный пользователь убьет систему, используя ваше программное обеспечение, и обвинит ВАС в своих проблемах.

1 голос
/ 02 апреля 2011

Если вы спрашиваете себя, потому что вы просто хотите запустить это приложение, есть много вещей, которые вы можете сделать. Во-первых, вы можете отключить UAC, что, как мы все согласны, является плохой идеей. Но никто не перечислил другие ваши варианты:

  • войдите в систему с правами администратора. Не как пользователь в группе администраторов, а как администратор. Все, что вы запускаете, будет возвышено.
  • откройте командную строку с повышенными правами и дайте согласие на это. Теперь все, что вы запускаете оттуда, будет поднято без диалогов.
  • используйте Запланированные задачи, чтобы запустить приложение при определенных обстоятельствах (каждый вторник в 10 или каждый раз, когда вы входите в систему) и установите флажок, чтобы оно работало с повышенными правами. Вам нужно будет дать согласие UAC один раз, чтобы настроить это, и больше никогда.
0 голосов
/ 14 ноября 2014

Ответ не по теме, но мне нужно где-то сохранить его, чтобы я мог найти его позже.

Если вам нужно работать с определенной папкой где-нибудь, например, «Program Files», но вы не хотите, чтобы приглашение UAC каждый раз использовалось, один из обходных путей - стать владельцем папки:

  1. Скопируйте / вставьте следующее в новый текстовый файл:
takeown /F %1  
icacls %1 /grant %username%:F /t /q
  1. Сохраните его как letmewrite.bat или как угодно.

  2. Откройте пару окон Explorer, чтобы вы могли видеть и папку, к которой вы хотите получить доступ, и файл letmewrite.bat.

  3. Перетащите папку, к которой вы хотите получить доступ, на letmewrite.bat

0 голосов
/ 01 апреля 2011

Просто полностью отключите UAC. У меня выключен мой, и у меня нет никаких проблем с безопасностью, так как я очень осторожен и не выполняю множество программ и даже не загружаю что-либо, исполняемый файл.

...