【问题标题】:C#: Check if administrator has write access to a fileC#:检查管理员是否对文件有写权限
【发布时间】:2011-06-06 00:13:27
【问题描述】:

问题: 我需要检查用户(本地用户或域用户,任何一个都可以)是否具有对文件的写入权限(如果您好奇,%windir%\system32\inetsrv\config\applicationHost.config。此文件受 Windows 保护,您需要成为管理员才能写信给它。)

我的解决方案: 一般结构是:

using (Impersonator impersonator = new Impersonator(domain, username, password))
{
 try
 {
  using (FileStream fs = File.OpenWrite(appHostConfigPath))
    {
     return true;
    }
  catch
  {
     return false;
  }
 }

您可以想象,Impersonator 类是一个 IDisposible,它使用本机互操作来调用 LogonUser。没有什么太有创意的了,而且很有效。

我被困在哪里: 在启用了 UAC 的 Windows 操作系统上,即使 username 指定的用户是管理员,此函数也始终返回 false。即使我的程序以管理员身份运行,我怀疑正在发生的事情是模拟代码以受限管理员身份运行。因此,该方法返回 false。

对此我没有任何创造性的解决方案。有人可以帮忙吗?

【问题讨论】:

  • 如果您的代码都在一个进程中,如果它被提升,那么 UAC 就不是问题。您是否尝试过在同一台计算机上关闭 UAC 以查看它是否改变? (记住,您可能需要重新启动。)
  • @Lambert:他说他正在使用LogonUser API,即returns a restricted token。当前进程是否被提升不会改变LogonUser 的行为。
  • 嗯...但是您是否尝试在那台计算机上完全关闭 UAC?如果程序被提升,为什么打开它会改变行为,这很奇怪......
  • @Lambert:Ben 是对的,LogonUser 给了你一个受限令牌,这就是为什么我相信我无法检查用户是否对文件有写权限(因为令牌不匹配)
  • @Bilal:即使UAC被关闭?

标签: c# security impersonation


【解决方案1】:

GetFileSecurityGetEffectiveRightsFromAcl 怎么样?

第二个链接有一个实际上非常完整的示例(在 C++ 中)。

【讨论】:

    【解决方案2】:

    你能看看这个例外吗?是权限还是“找不到文件异常”? 因为在 Windows 7 上它位于

    %windir%\System32\inetsrv\config\applicationHost.config

    可能与 Windows Vista 相同。

    【讨论】:

    • 谢谢 Vijay,我只是在 stackoverflow 上错误地写下了路径。我在我的程序中有它。未经授权的访问例外。
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多