c# - System.UnauthorizedAccessException при запуске.exe под программными файлами
windows wix (2)
Через установщик WiX я установил свое приложение Windows, и папка создается в
c:\ProgramFiles
с .exe и необходимыми DLL-файлами.
При запуске .exe я получаю
System.UnauthorizedAccessException
.
Пожалуйста, дайте мне знать, если есть какие-либо полезные предложения.
Пожалуйста, найдите ниже журнал событий для справки.
Application: xxxxxxx.exe
Framework Version: v1.0.0
Description: The process was terminated due to an unhandled exception.
Exception Info: System.UnauthorizedAccessException
at System.IO.__Error.WinIOError(Int32, System.String)
at System.IO.FileStream.Init(System.String, System.IO.FileMode, System.IO.FileAccess, Int32, Boolean, System.IO.FileShare, Int32, System.IO.FileOptions, SECURITY_ATTRIBUTES, System.String, Boolean, Boolean, Boolean)
at System.IO.FileStream..ctor(System.String, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare, Int32, System.IO.FileOptions, System.String, Boolean, Boolean, Boolean)
at System.IO.StreamWriter.CreateFile(System.String, Boolean, Boolean)
at System.IO.StreamWriter..ctor(System.String, Boolean, System.Text.Encoding, Int32, Boolean)
at System.IO.StreamWriter..ctor(System.String, Boolean)
at System.IO.File.AppendText(System.String)
причина
Это выглядит как простое нарушение прав доступа - вы пытаетесь получить доступ на запись к файлу, для которого у вас нет прав - в контексте, в котором вы работаете
(файлы в
%ProgramFiles%
недоступны для записи обычным пользователям или администраторам без повышенных прав) - Запрет виртуализации файлов, см. раздел
9
ниже).
Вот общий контрольный список ошибок запуска - вероятно, бесполезный, поскольку у вас в основном простое нарушение прав доступа (так кажется). Не уверен, почему связанный ответ был опущен, хотя. Я, возможно, испортил пару пунктов - это просто грязный список, призванный вызвать некоторые идеи. В том числе здесь для удобного поиска.
Предлагаемые возможные исправления
Вот список нескольких возможных подходов, которые вы можете использовать, чтобы обойти проблему, устранить причину проблемы или изменить дизайн, чтобы избежать проблемы. И есть несколько подходов, которые просто возможны и используются редко.
Приведенный ниже список не в порядке предпочтения
.
На самом деле, подход №
1
очень нежелателен, на мой взгляд.
Подход
6
может быть эффективным, но не настолько хорошим (хотя, конечно, лучше, чем
1
).
Я могу жить с другими подходами (кроме
9
), и
2
, вероятно, является наиболее распространенным для использования.
1. Поднятие приложения (права администратора) . Как и предполагали другие, вы можете запускать ваше приложение с правами администратора (очень плохая практика в наши дни - права администратора распространены, ключи к городу, делают ваше приложение хакерской целью, а также делают Приложение более опасно, если оно содержит ошибки калибра). Вот краткое руководство : как заставить мое приложение .NET запускаться от имени администратора? ,
- Только для пользователей с правами администратора : Важно то, что повышение прав не будет работать для обычных пользователей! (им будет предложено ввести пароль администратора). Поднять могут только админы !
- Пустой пароль администратора : если на коробке есть пустой пароль администратора (обычно на домашних ПК), любой пользователь может по своему желанию повысить любой двоичный набор для повышения до прав администратора (используя учетную запись с пустым паролем) - при этом войдя в свою ограниченную учетную запись. (очевидно, что они уже могут войти в систему как администратор с пустой учетной записью пароля и запускать абсолютно все - так что дыра в безопасности уже существует с пустым паролем, независимо от проблем с повышением прав - но зачем разрешать повышение прав с использованием учетных записей с пустыми паролями? ).
- UAC : Что происходит, когда UAC отключен? Обычным пользователям, вероятно, просто не предлагается пароль, и запуск не удался? У меня еще не было возможности попробовать.
- Безопасность : в определенных сценариях повышенные процессы, по-видимому, могут запускать другие повышенные процессы, которые могут пережить исходный процесс (зависит от запуска пользовательских привилегий NT). Безумие.
2. Профиль пользователя (Переместить файл) . Вы можете определить, какой файл вызывает нарушение прав доступа (какой-то файл настроек?), И переместить его в место, где пользователи имеют постоянные права доступа во всех случаях. Обычно где-то в профиле пользователя (рекомендуется).
3. Доступ только для чтения
: очень часто вы можете получить доступ к файлам настроек только для чтения.
Возможно, вы можете применить этот подход вместо этого?
Все зависит от дизайна вашего приложения.
Возможно, вы можете
handle the access denied exception
и затем запустить только для чтения?
4. Внутренние настройки по умолчанию : как вариант подхода только для чтения, вы можете потерять весь файл настроек и положиться на внутренние настройки по умолчанию. Редкий вариант, я думаю, но возможно.
5. Онлайн настройки?
Некоторые люди предпочитают полностью исключить файлы настроек (или сделать их доступными только для чтения), а затем получить «реальные настройки» из базы данных при запуске.
Такой подход может иметь существенные преимущества, особенно для корпоративных приложений, - управление настройками и версиями, устранение проблем с роумингом профилей пользователей и т. Д. (И, конечно, проблемы -
network issues
,
firewall
,
proxy
и
etc...
).
6. Разрешения ACL : вы можете применить разрешения ACL к рассматриваемому файлу при установке, позволяя обычным пользователям писать в него. Не очень хороший дизайн, но он будет работать . И, конечно, лучше, чем работать с правами администратора (повышенными правами) - потому что вы точно указываете необходимый доступ, а не просто повышаете уровень всего процесса. Не просто установить полный доступ ко всей папке - только открыть доступ на запись для отдельных файлов.
-
WiX Permission Sample
: здесь есть сегмент с информацией о разрешениях ACL: Как отказать в разрешении папки пользователям с помощью установщика wix . -
WiX Permission Elements
: И вот еще один сегмент - средняя страница - (различные способы применения разрешений в WiX): Меняет ли WiX разрешения для моего файла Notes.ini? -
WiX Permission Documentation
: А фактическая документация по WiX находится здесь: http://wixtoolset.org/documentation/manual/v3/ (найдите «разрешение» - порекомендуйте ссылку в предыдущем пункте, чтобы понять различия между различными элементами).
7. Служба Windows
. В некоторых случаях можно запускать части приложения, которым требуются повышенные права, в качестве службы Windows.
Не такой подход, который я видел очень часто, но возможный.
Затем вы устанавливаете службу для запуска в качестве
LocalSystem
или эквивалентной учетной записи с повышенными правами (
или используя учетные записи службы
- см. Раздел «
другие подходы
» - или
этот альтернативный ответ
).
Возможно, я могу также упомянуть
scheduled task
- я никогда не пытался использовать запланированное задание для такого сценария.
8. Олицетворение : я полагаю, что вы можете выдать себя за учетную запись с правами доступа для записи в указанное местоположение. Я не использую этот подход, поэтому я не уверен в технических деталях, аспектах и проблемах. Просто обманываю как вариант.
9. Подходы к виртуализации : просто упомяну это. Различные формы виртуализации - например, политики, которые можно включить, чтобы разрешить перенаправление ошибок записи в файл и реестр в доступное для записи место (более подробно о направлениях перенаправления данных - при всей неразберихе - это не решение), фактически Microsoft намеревается удалить функцию в будущей версии Windows. Не уверен в состоянии в Windows 10. MSDN на виртуализации реестра ). Как правило, никаких проблем не решено, но некоторые проблемы не распознаются. В целом, это может вызвать путаницу, поскольку люди не видят, куда записываются данные, и данные не передаются пользователям, а зависят от конкретного пользователя. И есть полная виртуализация / потоковая передача данных, такие как App-V и контейнеры, которые обеспечивают полный доступ. Не моя специальность и не мои предпочтения.
Пожалуйста, не используйте эту бессмыслицу виртуализации или перенаправления данных (она предназначена для сбоя устаревших приложений, а не для использования новыми приложениями).
Я все еще добавлю ссылку на некоторые технические подробности о том, как эта функция на самом деле работает (существует ряд предварительных условий, которые должны быть выполнены, прежде чем это перенаправление
сработает
):
файл журнала log4net не отображается в проводнике Windows в подпапке установки приложения
(
recommended to show why this feature should never be used
).
Ниже приведен ответ из прошлого, посвященный теме развертывания файлов для каждого пользователя и тому, как это можно сделать в пакете, а также некоторым альтернативным сетевым / базам данных / облачным подходам .
Это может быть сложное чтение, но вот оно - оно, по сути, предоставляет еще несколько вариантов вышеупомянутых возможностей :
Некоторые ссылки :
Вы также можете использовать концепцию олицетворения .NET, если нет другого альтернативного расположения, которое не требует административных привилегий.
Вот ссылка, чтобы получить обзор олицетворения .Net.