在程序文件下运行.exe时出现System.UnauthorizedAccessException

时间:2018-05-29 15:05:52

标签: c# windows wix windows-installer

通过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)

4 个答案:

答案 0 :(得分:4)

不要试着写应用程序不应该写的地方。使用其他文件夹,例如:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

如果没有可能的替代方案,我非常怀疑,请使用管理权限运行可执行文件。

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

答案 1 :(得分:1)

原因

这看起来像是一个简单的访问冲突 - 您尝试获取对您没有权限的文件的写访问权限 - 在您正在运行的上下文中 (文件在%ProgramFiles%下,对于普通用户或非提升管理员不可写 - 禁止文件虚拟化,请参阅下面的9部分。

Here is a generic launch error check-list - 可能没用,因为您基本上只有一个简单的访问冲突(所以看起来如此)。不知道为什么链接的答案被低估了。我可能搞砸了几点 - 这只是一个杂乱的清单,旨在激发一些想法。包括这里以便于检索。

建议的可能修复

以下列出了一些可用于解决问题,解决问题原因或重新设计问题的方法,以便有效避免问题。并且有一些方法仅仅是可能的并且很少使用。

以下列表不符合首选项 。实际上,在我看来,方法编号1是非常不受欢迎的。方法6可能有效,但不是那么好(当然比1更好)。我可以使用其他方法(9除外),而2可能是最常用的方法。

<强> 1。提升应用程序(管理员权限) :正如其他人建议您可以使用管理员权限运行您的应用程序(这些天非常糟糕的做法 - 管理员权限很普遍,关键是城市,并使您的应用程序成为黑客目标,如果它包含错误的口径,也会使应用程序更加危险)。这是一个简短的操作方法:How do I force my .NET application to run as administrator?

  • 仅限管理员用户 :至关重要的是,提升不适用于普通用户! (系统将提示他们输入管理员密码)。 只有管理员可以提升
  • 空白管理员密码 :如果包装盒上有空白管理员密码(在家用电脑上常见),任何用户都可以提升任何二进制设置以提升为管理员权限随意(使用空白密码帐户) - 登录到他们自己的受限帐户(他们显然也可以使用空白密码帐户以管理员身份登录并启动任何内容 - 所以安全漏洞已经存在空白密码,无论提升问题 - 但为什么允许使用空白密码帐户进行提升?)。
  • UAC :禁用UAC后会发生什么?标准用户可能不会被提示输入密码,启动失败?我还没有机会尝试。
  • 安全性 :在某些情况下,提升的进程似乎能够启动其他可以超过原始进程的提升进程(取决于启动用户的NT权限) )。疯狂。

<强> 2。用户配置文件(移动文件) :您可以确定导致访问冲突的文件(某种设置文件?)并将其移动到用户在所有情况下都具有常规访问权限的位置。通常位于用户配置文件的某个位置(推荐)。

<强> 3。只读访问 :您经常可以使用设置文件的只读访问权限。也许你可以强制执行这种方法吗?这一切都取决于您的应用程序的设计。也许你可以handle the access denied exception然后以只读方式运行?

<强> 4。内部默认值 :作为只读方法的一种风格,您可能会丢失整个设置文件并依赖内部默认值。我认为很少有选择,但可能。

<强> 5。在线设置? :有些人喜欢完全删除设置文件(或使它们只读),然后检索&#34;真实设置&#34;从发布时的数据库。这种方法可以带来巨大的优势 - 特别是对于企业应用程序 - 设置管理和版本控制,消除用户配置文件漫游问题等等(当然还有挑战 - network issuesfirewall,{{1} },proxy)。

<强> 6。 ACL权限 :您可以在安装时对相关文件应用ACL权限,允许常规用户写入。 根本不是很棒的设计,但它会起作用 。当然比运行管理员权限(提升)更好 - 因为你指出了所需的访问权限,而不是提升整个过程。不要完全访问整个文件夹 - 只能打开单个文件的写访问权。

<强> 7。 Windows服务 :在某些情况下,可以运行需要提升权限的应用程序部分作为Windows服务。这不是我经常看到的方法,但可能。然后,您将该服务安装为WiX Permission Documentation或等效的提升帐户(or using service accounts - 请参阅&#34; 其他方法&#34;部分 - 或{{3 }})。也许我也可以提到this alternative answer - 我从未尝试过为这种情况使用计划任务。

<强> 8。模拟 :我认为您可以冒充具有访问权限的帐户来写入相关位置。我没有使用这种方法,所以我不确定技术细节,方面和挑战。只是将其作为一种选择。

<强> 9。虚拟化方法 :刚才提到这一点。各种形式的虚拟化 - 例如scheduled task(更多的是policies you can enable to allow file and registry write failures to be redirected to a writeable location - 随之而来的所有混乱 - 这不是解决方案 - 实际上微软打算删除未来Windows版本中的功能。不确定Windows 10中的状态。data redirection)。一般没有问题解决,但几个问题没有得到承认。总体上肯定会引起混淆,因为人们不会看到数据写入的位置,并且数据不会在用户之间共享 - 而是用户特定的。还有像App-V这样的全面虚拟化/数据流和允许完全访问的容器。不是我的专业,而不是我的偏好。

请不要使用此虚拟化或数据重定向废话(旧版应用程序不会崩溃,不能使用新的应用程序)。我仍然会添加指向该功能实际工作原理的一些技术细节的链接(在此重定向工作之前必须满足一些先决条件): MSDN on Registry Virtualization { {1}} )。

以下链接是关于每用户文件部署主题以及如何在包中完成的回答,以及一些替代的 网络/数据库/云方法

这可能是一个参与阅读,但在这里 - 它实质上提供了上述可能性的一些排列

部分链接

答案 2 :(得分:0)

如果没有其他不需要管理权限的替代位置,您还可以利用.NET模拟概念。

以下是获取.Net模拟概述的链接。

How do you do Impersonation in .NET?

答案 3 :(得分:0)

为wix正在尝试安装的项目打开项目属性

进入安全性

并将安全设置设置为

enter image description here