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 к рассматриваемому файлу при установке, позволяя обычным пользователям писать в него. Не очень хороший дизайн, но он будет работать . И, конечно, лучше, чем работать с правами администратора (повышенными правами) - потому что вы точно указываете необходимый доступ, а не просто повышаете уровень всего процесса. Не просто установить полный доступ ко всей папке - только открыть доступ на запись для отдельных файлов.

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.

Как вы делаете олицетворение в .NET?





windows-installer