System.UnauthorizedAccessException при запуске .exe под программными файлами - PullRequest
0 голосов
/ 29 мая 2018

Через установщик 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)

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

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

Вот ссылка для получения обзора олицетворения .Net.

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

0 голосов
/ 29 мая 2018

Причина

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

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


Предлагаемые возможные исправления

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

Приведенный ниже список не в порядке предпочтения .На самом деле, подход № 1026 * очень нежелателен, на мой взгляд.Подход 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).


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

Это может быть чтение с вовлечением, но здесь оно - , по сути, оно обеспечивает несколько дополнительных комбинаций вышеуказанных возможностей :


Некоторые ссылки :

0 голосов
/ 29 мая 2018

Не пытайтесь писать там, где не должны писать приложения.Используйте другие папки, например, например:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Если нет альтернативы, в которой я серьезно сомневаюсь, запустите исполняемый файл с правами администратора.

https://msdn.microsoft.com/en-us/library/bb756929.aspx

...