为什么我不能通过Resharper的Test Runner单元测试从单元测试中删除%ProgramFiles%中的文件?
我正在尝试编写一个测试,在其夹具安装程序中,它将备份文件并删除原始文件,在没有原始文件的情况下运行测试,然后在拆解中从备份中还原原始文件。该文件位于我的%ProgramFiles%文件夹中。我在fileInfo.Delete()语句上收到UnauthorizedAccessException。从没有从Resharper Test Runner运行的同一台计算机上的另一个测试项目中删除此文件,我没有问题。
我无法将文件移动到其他位置ssapi.dll,这是Visual SourceSafe的已安装dll。 (是的,我在单元测试中正在做一些有创性的工作。)
两种方式都是同一用户(我)-我通过任务管理器对其进行了检查。我的用户帐户是本地Administrators组的成员。还有哪些其他因素决定我的"授权"来对文件进行处理?
已解决:尽管它不能回答我的原始问题(我仍然想知道答案),但我已经找到了一种解决方法,可以通过System.Security.Permissions framewok对FileIOPermissionAccess进行需求测试。读入需要文件(用于Interop调用)的应用程序(非测试)代码,并在测试该代码的过程中读入相同文件的"拒绝"(要求拒绝该文件)。现在应该可以正常工作了(我喜欢对System.Security.Permissions命名空间有一点了解)!
解决方案
ReSharper可能将其Test Runner作为一个单独的进程运行,并且该单独的进程没有使用Windows身份,而是使用另一个特权较低的身份。
我们也许能够验证此打开的任务管理器并选中"显示所有用户的进程"。
并不是真正的解决方案,但我会考虑从另一个角度解决此问题。
我们可能考虑将目录更改为%AppData%(我们可能还需要为主应用程序进行此更改)。
它可能会解决问题,并且在我们迁移到Vista时也会很好看,因为UAC可能会阻止我们(或者应用程序用户)使用%ProgramFiles%目录。
我们可以通过授予用户帐户对该文件夹的完全访问权限来解决此问题。
导航到Windows资源管理器中的文件夹。右键单击该文件夹,然后选择属性。选择安全性选项卡,然后选择"编辑"按钮,然后为我们自己添加完全控制。是的,我想这是一个潜在的安全问题,但是我们必须更改该目录中的文件,而且我们似乎知道自己在做什么,因此它应该可以工作。
我们可以激活该文件的审核,并检查事件日志中的错误消息。请注意,我们必须在两个位置打开审核,一次在"本地安全策略" /"本地策略" /"审核策略"下,一次在文件本身上。
这不能解决问题,但至少可以帮助诊断问题。
我们是否在启用UAC的情况下运行Vista或者Server 2008?如果是,这可能是导致测试运行程序进程未处于"提升"模式的原因。