通过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)
答案 0 :(得分:4)
不要试着写应用程序不应该写的地方。使用其他文件夹,例如:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
如果没有可能的替代方案,我非常怀疑,请使用管理权限运行可执行文件。
答案 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?。
<强> 2。用户配置文件(移动文件) :您可以确定导致访问冲突的文件(某种设置文件?)并将其移动到用户在所有情况下都具有常规访问权限的位置。通常位于用户配置文件的某个位置(推荐)。
<强> 3。只读访问 :您经常可以使用设置文件的只读访问权限。也许你可以强制执行这种方法吗?这一切都取决于您的应用程序的设计。也许你可以handle the access denied exception
然后以只读方式运行?
<强> 4。内部默认值 :作为只读方法的一种风格,您可能会丢失整个设置文件并依赖内部默认值。我认为很少有选择,但可能。
<强> 5。在线设置? :有些人喜欢完全删除设置文件(或使它们只读),然后检索&#34;真实设置&#34;从发布时的数据库。这种方法可以带来巨大的优势 - 特别是对于企业应用程序 - 设置管理和版本控制,消除用户配置文件漫游问题等等(当然还有挑战 - network issues
,firewall
,{{1} },proxy
)。
<强> 6。 ACL权限 :您可以在安装时对相关文件应用ACL权限,允许常规用户写入。 根本不是很棒的设计,但它会起作用 。当然比运行管理员权限(提升)更好 - 因为你指出了所需的访问权限,而不是提升整个过程。不要完全访问整个文件夹 - 只能打开单个文件的写访问权。
etc...
:这里有一段包含ACL权限的信息:How to deny folder permission to Users with wix installer。WiX Permission Sample
:这是另一个细分 - 中间页 - (在WiX中应用权限的不同方式):Is WiX changing the permissions on my Notes.ini file? WiX Permission Elements
:实际的WiX文档在这里:http://wixtoolset.org/documentation/manual/v3/(搜索&#34;权限&#34; - 推荐上一个要点中的链接,以了解不同元素之间的差异)。 <强> 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)
答案 3 :(得分:0)