【问题标题】:In .NET, check that the current user may write to a directory在 .NET 中,检查当前用户是否可以写入目录
【发布时间】:2012-01-12 20:45:48
【问题描述】:

在 .NET 中,是否有一种简单的方法可以检查当前用户是否有权在目录中创建文件?与 C++ _access 函数等效的东西是理想的。

我不想使用试错法(创建一个虚拟文件然后将其删除):除了看起来很老套之外,其他软件正在监视相关目录以查找丢失的文件。

我不想使用 System.DirectoryServices:查看 ACL、解析组成员身份以及来自不同组成员身份的权限如何交互似乎容易出错且太难了。一定有一个是或否的功能,不是吗?

提前致谢!

[edit] 作为奖励,如果它也适用于网络共享,那就太好了。

【问题讨论】:

标签: .net permissions


【解决方案1】:
FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename);
if (SecurityManager.IsGranted(writePermission)){
    //write here
} else {
    //some error message
}

【讨论】:

  • 假设它有效(我希望),其中一个让我投票、投票并喜欢它的答案之一 :)
  • 看起来很棒!让我试试看。
  • 它似乎对我不起作用。由于某种原因,它总是返回 true。这一定是我做错了什么,但它是如此直截了当,我不明白它会是什么。 /sigh...我已将其标记为已接受,因为它为我指出了正确的 API。我想我只需要解决它
  • 看来 SecurityManager.IsGranted 不适用于非 CAS 权限,所以这不起作用。 :(
  • SecurityManager.IsGranted() 已弃用:“'SecurityManager.IsGranted(IPermission)' 已过时:'IsGranted 已过时,将在 .NET Framework 的未来版本中删除。请使用 PermissionSet 属性AppDomain 或 Assembly 代替。'"
【解决方案2】:

提前检查许可是一个冒险的项目。更别提复杂了,遍历整个 ACL 列表,计算有效权限集。

进一步...没有任何保证。仅仅因为您提前主动检查了权限并不意味着在您尝试创建文件时权限不会发生变化。

“正确”的方法是创建一个security demand,或者以声明方式使用FileIOPermissionAttribute,或者通过创建一个适当的FileIOPermission 实例并调用其Demand() 方法来强制执行。如果您拥有所需的权限,则对Demand() 的调用成功;否则它会抛出一个SecurityException,你需要抓住它并采取行动。

根据我的经验,命令式检查更容易。

还应注意,在 Windows 7 中,虽然您在概念上可能对目录具有写访问权限,但除非您以提升的权限运行,否则它仍然可能无法工作。

【讨论】:

  • 我完全同意。我不想检查权限来保护可能失败的操作。我们有一个遗留系统,其中包含许多在许多服务器上运行的软件,并且受到管理/配置问题的困扰。我需要编写一个通过查找配置错误的应用程序,但必须被动地这样做,没有机会孤立测试/虚拟文件等。
【解决方案3】:

以下将返回一个 DirecotrySecurity 实例http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.directorysecurity.aspx

DirectoryInfo(pathstr).GetAccessControl()

【讨论】:

  • 这适用于当前用户吗?我看了看,它似乎可以访问 ACL。可能会说“Foo Managers”用户组具有写入权限,而“Bar Workers”被拒绝,但不能帮助我解决当前用户是否是属于这些组之一的组的成员。也许我想念如何解决那个位
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
相关资源
最近更新 更多