Обход ограничений разрешений Windows для папки с программными файлами

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

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


person user295744    schedule 02.07.2010    source источник
comment
Спросить, как обойти ограничения безопасности, — это самый быстрый способ получить мой отрицательный голос. Черт возьми, если ваше приложение ведет себя хорошо, вы должны играть вместе с системой, а не играть против нее, и если бы списки управления доступом предназначались для обхода, они вообще не были бы созданы.   -  person Matteo Italia    schedule 03.07.2010
comment
Извините за путаницу, но я не это имел в виду. Что я хочу обойти, так это необходимость запуска от имени администратора, даже если вы находитесь в учетной записи администратора. Видите ли, UAC отстой, в том смысле, что даже если вы администратор, вы должны запускать что-то от имени администратора. Итак, проблема выглядит так: у меня есть exe-файл, который вызывается из bat-файла. Все должно пройти гладко, если вы администратор, но это не так. Вы должны проверить Запуск от имени администратора в свойствах exe. Это то, что я хочу обойти.   -  person user295744    schedule 05.07.2010


Ответы (7)


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

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

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

person Dean Harding    schedule 02.07.2010

Не обходите, используйте каталог «Данные приложения».

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

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

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

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

Если вы пишете конкретное приложение, которое почти не мешает работе ОС, то вы можете создать сервис (демон). Каждый раз, когда служба запускается, она получает привилегии, данные при регистрации службы. Дополнительные сведения см. в разделе "DLL, Processes, and Threads -> Services" на MSDN< /а>

// ИЗМЕНИТЬ
Вы также можете легко создать сервис в .NET (наиболее подходит C#). Сервисное приложение может взаимодействовать с клиентским приложением, написанным на другом языке. Но для регистрации сервиса вам потребуются права администратора. С таким приложением вы должны учитывать все вопросы безопасности.

person adf88    schedule 03.07.2010
comment
+1. использование Program Files только для статического кода и данных было лучшей практикой, по крайней мере, еще в XP (может быть, и в более ранних NT?). Разработчики, которые не последовали этому совету, по крайней мере частично несут ответственность за многие из ранних бед Vista. ;) - person Cogwheel; 04.07.2010
comment
Начиная с Windows 2000 обычные пользователи не имеют права записи в Program Files и %windir%, а также в корневом каталоге системного диска IIRC. Кроме того, я совершенно уверен, что рекомендации по правильному использованию иерархии каталогов профилей пользователей восходят к более ранним NT, поскольку правильное использование каталога профилей имеет основополагающее значение для роуминга профилей в доменной среде. - person Matteo Italia; 05.07.2010

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

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

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

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

person SigTerm    schedule 03.07.2010

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

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

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

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

person jweyrich    schedule 03.07.2010

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

  • войдите на свою машину как Администратор. Не как пользователь в группе администраторов, а как администратор. Все, что вы запускаете, будет повышено.
  • откройте командную строку с повышенными привилегиями и один раз согласитесь на это. Теперь все, что вы запускаете оттуда, будет повышено без диалога.
  • используйте запланированные задачи для запуска приложения при определенных обстоятельствах (каждый вторник в 10 или каждый раз, когда вы входите в систему) и установите флажок, чтобы оно запускалось с повышенными правами. Вам нужно будет дать согласие на UAC один раз, чтобы настроить это, и никогда больше.
person Kate Gregory    schedule 02.04.2011

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

person chr1s    schedule 01.04.2011

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

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

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

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

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

person trapper_hag    schedule 14.11.2014
comment
но вы не можете стать владельцем Program Files без прав администратора - person phuclv; 11.07.2017