Разрешить права доступа для записи в программных файлах Windows 7 - PullRequest
52 голосов
/ 03 июня 2009

Мое приложение выдает ошибки «Отказано в доступе» при записи временных файлов в каталог установки, где находится исполняемый файл. Однако это прекрасно работает в Windows XP. Как предоставить права доступа к папке Program Files в Windows 7?

EDIT: Как заставить программу попросить пользователя повысить права? (т.е. запустить программу с полными правами администратора)

Ответы [ 14 ]

87 голосов
/ 03 июня 2009

Ваша программа не должна записывать временные файлы (или что-либо еще в этом отношении) в каталог программы. Любая программа должна использовать% TEMP% для временных файлов и% APPDATA% для пользовательских данных приложения. Это было верно начиная с Windows 2000 / XP, поэтому вы должны изменить приложение.

Проблема не в Windows 7.

Вы можете запросить путь к папке с appdata:

string dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

или для пути TEMP

string dir = Path.GetTempPath()
27 голосов
/ 03 июня 2009

Ваша программа должна работать с правами администратора. Вы не можете сделать это автоматически с кодом, но вы можете попросить пользователя (в коде) повысить права вашей программы во время ее работы. Есть вики о том, как это сделать. Кроме того, любую программу можно запустить от имени администратора, щелкнув правой кнопкой мыши ее значок и выбрав «Запуск от имени администратора».

Однако я бы не советовал делать это. Было бы лучше использовать что-то вроде этого:

Environment.GetFolderPath(SpecialFolder.ApplicationData);

, чтобы получить путь к папке AppData и создать папку для вашего приложения. Затем поместите там временные файлы.

11 голосов
/ 03 июня 2009

Варианты, которые я могу придумать:

  • Запустите все приложение с правами администратора. используя UAC
  • Запустите подпроцесс как полный администратор только для тех вещей, которым нужен доступ
  • Запись временных файлов в другом месте
7 голосов
/ 06 апреля 2014

Добавить новый элемент в проект: манифест приложения и сохранить его.

Теперь откройте этот файл и найдите <requestExecutionLevel>. Должно быть установлено значение asInvoker.

Измените его на highestAvailable. Теперь при выполнении вашего приложения появится приглашение с запросом разрешения. Нажмите yes!

Вот и все :) теперь вы можете писать и читать из system32 или любого другого файла, который требует права администратора

Вы можете подтвердить свою заявку по sigcheck .

sigcheck.exe -m yourapp.exe

А в выходной проверке для элемента requiredExecutionLevel.

3 голосов
/ 03 декабря 2018

Вы можете добавить доступ к IIS User для папок веб-сайта или веб-приложения, которые вы хотите написать или переписать в нем.

3 голосов
/ 26 апреля 2011

Другим способом было бы остановить UAC, а затем перезапустить его. Создайте файл CMD со следующим кодом:

Rem Stop UAC % windir% \ System32 \ reg.exe ДОБАВИТЬ HKLM \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows \ CurrentVersion \ Policies \ System / v EnableLUA / t REG_DWORD / d 0 / f перезагрузка rem force Начать закрытие / R / F / T 30

Вам нужно будет щелкнуть правой кнопкой мыши по файлу CMD и использовать запуск от имени администратора. как только вы закончите то, что делаете, перезапустите UAC с помощью следующего кода (на этот раз не нужно запускать от имени администратора);

% windir% \ System32 \ reg.exe ДОБАВИТЬ HKLM \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows \ CurrentVersion \ Policies \ System / v EnableLUA / t REG_DWORD / d 1 / f

перезагрузка rem force Начать закрытие / R / F / T 30

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

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

3 голосов
/ 03 июня 2009

Вы не можете заставить приложение .Net повышать свои права. Это просто не разрешено. Лучшее, что вы можете сделать, это указать повышенные права при запуске другого процесса. В этом случае у вас будет двухэтапный запуск приложения.

Этап 1 не делает ничего, кроме подготовки возвышения с повышенными правами с использованием объекта System.Diagnostics.ProcessStartInfo и вызова Start ().

Этап 2 - это приложение, работающее в повышенном состоянии.

Как уже упоминалось выше, вы очень редко хотите это делать. И вы, конечно, не хотите делать это просто, чтобы вы могли записывать временные файлы в% programfiles%. Используйте этот метод только тогда, когда вам нужно выполнить административные действия, такие как запуск / остановка службы и т. Д. Запишите ваши временные файлы в лучшее место, как указано в других ответах здесь.

2 голосов
/ 18 февраля 2010

Я не могу согласиться с аргументами, что лучше записывать все файлы в другие каталоги, например,% APPDATA%, это только то, что вы не можете избежать этого, если хотите избежать запуска приложения в качестве администратора в Windows 7.

Было бы намного чище хранить все специфичные для приложения данные (например, ini-файлы) в одной папке с приложением (или в подпапках), чтобы ускорить передачу данных по всему диску (% APPDATA%, реестр и кто знает где еще). Это просто идея Microsoft о чистом программировании. Конечно, вам понадобится очиститель реестра, очиститель дисков, очиститель временных файлов, ... вместо e + очень чистая практика - удаление папки приложения удаляет все специфические данные приложения (кроме пользовательских данных, которые обычно находятся где-то в «Моих документах» или около того). .

В моих программах я бы предпочел иметь ini-файлы в каталоге приложения, однако их там нет, только потому, что я не могу их там (в Windows).

1 голос
/ 17 декабря 2017

Я искал ответы. Я нашел только один.

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

Я пытаюсь сохранить изображение, найденное онлайн, прямо в папку windows / web / wallpaper, и оно мне не дает. Вместо этого я должен сохранить его на своем рабочем столе (я ОТКАЗЫВАЮСЯ перейти к «мои документы / картинки / и т. Д.», Так как я отказываюсь использовать такие папки, у меня есть собственное дерево каталогов, спасибо), а затем с рабочего стола вырезать и вставить его в папку windows / web / wallpaper. И вы говорите мне, что я должен сделать это и улыбнуться? Как администратор, я ДОЛЖЕН быть в состоянии сохранить непосредственно в его папку назначения. Мои разрешения в свойствах диска / безопасности и в свойствах каталога / безопасности говорят, что я могу писать, но не могу. Не программировать файлы, программные файлы (86) и окна.

Как насчет сохранения файла, который я только что изменил для игры, в папке Program Files (86) (название игры). Это не позволит мне. Я открываю файл, чтобы изменить его, я не могу сохранить его, предварительно не сохранив его на рабочем столе и т. Д., Как описано выше, или не открыв программу, которая используется для изменения файла, сначала как администратор, что означает, что сначала нужно перейти к другому часть дерева каталогов, где я храню эти программы пользовательских модов, затем в программе выбираю открыть файл и снова перейти к файлу, на котором я мог просто щелкнуть, чтобы сначала изменить его из папки моих проектов, только чтобы обнаружить, что это выиграло тоже не работает! Это сохраняет файл, но файл не может быть найден. Это есть, но невидимо. Единственное решение - сохранить на рабочий стол, как указано выше.

Мне не нужно было делать все это как администратор. Однако, если я использую настоящую учетную запись администратора, все работает нормально. Но я не хочу использовать настоящую учетную запись администратора. Я хочу использовать учетную запись пользователя с правами администратора. Там написано, что у меня есть права администратора, но у меня нет.

И, наконец, я отказываюсь хранить свои портативные компьютеры в% appdata%. Это не то, как я хочу перемещаться по моему дереву каталогов. Мои личные установки, которые я использую в качестве портативных устройств, хранятся в каталоге, который я создаю в качестве предпочтения навигации.

Итак, вот проверенный и верный ответ, который я нашел:

Из того, что я видел до сих пор ... если только вы не используете настоящую учетную запись администратора, эти разрешения просто никогда не будут доступны любому другому пользователю с правами администратора в ОС Windows Vista и Windows 7. Хотя было просто установить права администратора в Windows XP, в более поздних версиях это убрано для всех, кроме тех, кто может удобно взломать.

1 голос
/ 25 августа 2013

Хотя M $ "best Practices" - не записывать данные в папку% programfiles%; Я иногда делаю. Я не считаю целесообразным записывать временные файлы в такую ​​папку; в качестве переменной среды TEMP может быть, например, указать на хороший, быстрый, RAM-диск.

Однако я не люблю записывать данные в% APPDATA%. Если окна становятся настолько испорченными, что нужно, например, Протрите его и переустановите полностью, возможно, на другой диск, вы можете потерять все настройки почти для всех ваших программ. Я знаю. Я делал это много раз. Если он хранится в% programfiles%, 1) он не потеряется, если я, например, приходится переустанавливать Windows на другом диске, поскольку пользователь может просто запустить программу из своего каталога, 2) она делает ее переносимой, и 3) хранит программы и их файлы данных вместе.

Я получил доступ на запись, когда мой установщик Inno Setup создал пустой файл для моего INI-файла и дал ему настройку изменения пользователем в разделе [Files]. Теперь я могу написать это по своему желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...