更新:我最初发布的“in”目录位于C :.它实际上在E :. D:和E:是RAID上的卷。我不希望这会有所作为,但如果我知道发生了什么,我就不必问这个问题了。
我遇到了目录的ACL权限问题,这些权限必须由Web服务和本地用户控制。这是我的第一个涉及目录安全性和ACL的项目,因此我担心我认为这一切都是错误的。我愿意接受提供点修复的答案,以及那些建议对我的安全模型进行彻底检查的答案。
我正在开发一个Windows Server 2012 R2 Web服务,它捕获来自多个用户(节点)的数据,然后对其进行处理。我有每个Node目录(例如E:\ in \ node1,E:\ in \ node2等)来保存传入的数据,然后我使用我作为非管理本地用户运行的C#控制台应用程序(LocalUser) )将文件移动到具有更深层目录结构的更大卷,该目录结构反映了控制台应用程序完成的分类。
最初,我会将每个节点的目录创建为LocalUser,但出于可管理性的考虑,我创建了一个Web服务(POST Handler)来创建Node目录,因为每个节点都已配置和配置。
我现在有一个文件系统,其中一些目录由LocalUser创建,一些目录由DefaultAppPool通过Web服务创建。两种类型的目录都按预期接收文件。当我以LocalUser运行我的控制台应用程序时,一切都适用于LocalUser创建的目录,但是当我尝试从Web创建的Node目录中的File.Move()到Web创建的Classification目录时,我得到一个UnauthorizedAccessException。当我查看ACL时,我发现问题在于Creator(和完全控制帐户)与运行控制台应用程序的帐户不同。此外,ACL页面表明E:\ in \ node2继承自E:而不是E:\ in。
Web配置的重点是自动化系统,因此我不想触摸所有新目录来添加LocalUser(或包含LocalUser的组)。我还希望系统在其他经过身份验证的用户尝试运行控制台应用程序时工作(例如,从未在任何地方创建任何目录的LocalUser2)。
似乎我必须解决的两个机会是:1)当Web服务创建目录时,或2)当LocalUser运行脚本时。不幸的是,我担心这两个帐户(DefaultAppPool,LocalUser)都没有权限授予(在案例1中)或抓住(在案例2中)完全控制相关目录。
最终,我计划从Web服务运行控制台应用程序,这将使一切都作为DefaultAppPool运行,但在开发期间,作为手动维护操作,我希望能够按需运行控制台应用程序作为LocalUser或LocalUser2。我认为可能会在运行控制台应用程序时制作一些冒充DefaultAppPool的“垫片”,但据我所知,进行此类模拟的唯一方法是让网络服务执行此操作。 / p>
总之,我如何建立一个系统,其中Web服务创建的目录可由特定组中的用户控制?
答案 0 :(得分:0)
这就是我理解你的问题的方法:
在您的问题中,列出示例节点目录* c:\ in \ node1 *,* c:\ in \ node2 *等。目录* c:\ in *将是所有节点目录的父目录。权限通常会自动继承。在* c:\ in *中创建的节点目录应该从* c:\ in *。
继承权限webservice是否手动为其创建的节点目录设置访问权限?
如果是这样,这有必要吗?如果您设置c:\ in \的权限,以便例如 IIS APPPOOL \ DefaultAppPool 和组用户完全控制在c:\ in \ can中创建的所有目录自动继承这些权限,从而使您免于此问题。 (据我所知,所有本地用户都自动成为 Users 组的成员。)
如果webservice必须手动设置访问权限,那么在新创建节点目录时如何为组 Users 添加所需权限?通过这种方式,控制台应用程序将能够访问该目录,无论是谁启动它。
webservice / console应用程序是否需要对每个目录进行“完全控制”?我理解你的问题的方式是权限修改,阅读,写和列表文件夹内容应该足够了。也许我错过了什么......
如果您只需要限制对某些用户的访问权限,则只能创建新的安全组,并且只允许该组访问节点目录树。然后,可以将需要访问权限的本地用户添加到该组。 Web服务的应用程序池标识也需要是该组的成员。在这种情况下,添加仅用于Web服务的新应用程序池可能会很有用。是否更改此应用程序池的标识是一个选择问题。
答案 1 :(得分:0)
好的,这是交易:
File.Move()需要目标的写入权限和源的DeleteSubdirectoriesAndFiles。这是一项高级权限,因此您需要为此进行一些挖掘(感谢http://www.codeproject.com/Questions/181198/File-I-O-permissions-the-C-way引用File handling with non-administrative user来确定要求)。
然后由程序化创建的子目录继承,每个人都得到蛋糕。
感谢@roadkill让我走上正轨,感谢CodeProject.com上的第一个解决方案,以及@Powerlord用于StackOverflow解决方案的lukeer。