在程序文件下运行.exe时出现System.UnauthorizedAccessException
通过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)
不要试着写应用程序不应该写的地方。 使用其他文件夹,例如:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
如果没有可能的替代方案,我非常怀疑,请使用管理权限运行可执行文件。
原因
这看起来像一个简单的访问冲突 – 您尝试获取对您没有权限的文件的写访问权限 – 在您运行的上下文中 ( %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.虚拟化方法 :刚才提到这一点。 各种forms的虚拟化 – 例如, 您可以启用的策略允许将文件和注册表写入失败重定向到可写位置 (更多的是沿着数据重定向 – 随之而来的所有混乱 – 这不是解决方案 – 事实上微软打算删除未来Windows版本中的function。不确定Windows 10中的状态。 注册表虚拟化上的MSDN )。 一般没有问题解决,但几个问题未得到承认。 总体上肯定会引起混淆,因为人们没有看到数据写入的位置,并且数据不是在用户之间共享 – 而是用户特定的。 还有像App-V这样的全面虚拟化/数据流和允许完全访问的容器。 不是我的专业,而不是我的偏好。
以下链接是对每用户文件部署主题以及如何在包中完成以及一些替代网络/数据库/云方法的回答。
它可能是一个参与阅读,但在这里它 – 它实质上提供了上述可能性的一些排列 :
- 从管理员配置文件创建当前用户配置文件中的文件夹和文件
一些链接 :
- C ++ MSI包管理权限 (基本相同)
- 可以在创建Windows安装程序时为Application文件夹授予管理权限
- WiX Toolset:安装具有特定权限的文件
如果没有其他不需要管理权限的备用位置,您还可以利用.NET模拟概念。
以下是获取.Net模拟概述的链接。
你如何在.NET中进行模拟?