【问题标题】:.NET Directory.Exists denies existence of mapped network drive when running as admin.NET Directory.Exists 在以管理员身份运行时否认存在映射的网络驱动器
【发布时间】:2011-10-11 19:41:45
【问题描述】:

我正在 Windows 7 上编写一个小型 .NET 程序。它需要做的一件事是创建符号链接,这似乎需要我拥有管理员权限。它还需要能够使用映射的网络驱动器(例如,R:\,它在我的系统上映射到 \\titanium\Private\)。

我正在使用Directory.Exists(path) 来验证路径是否存在。

当以普通用户(管理员帐户,但不是“以管理员”身份)运行程序时,这在映射的网络驱动器上运行良好。

以管理员身份(使用 UAC)运行程序时,找不到存在的目录。结果,程序拒绝承认R:\Steam Games\ 是一个实际存在的目录。

我有点困惑为什么会这样。使用完整的 UNC 路径 (\\titanium\Private\Steam Games\) 也不起作用。

以前有人遇到过这种情况吗?有什么好的解决方法吗?我是否必须将路径格式设置为不同(注意:它们中的大多数当前格式为Path.Combine,所以它们应该是正确的)。

感谢您的帮助。

(例如,Directory.Exists(@"R:\Steam Games\") 以管理员身份运行时返回 false,但该文件夹存在。函数调用在正常运行时正确返回 true)。

编辑:问题确实似乎是管理员在技术上是不同的用户帐户。我什至不能使用 UNC 路径,因为我只在我的普通用户下登录到我的文件服务器,而不是在“管理员”下。作为一个(相对骇人听闻的)解决方法,我只是以常规权限运行我的程序,然后使用Process.Start 调用带有参数的 cmd.exe 实例以创建符号链接(以及动词“runas”以获取 UAC 提示) .

【问题讨论】:

  • 投票以离题结束。这里的问题是 UAC(并且 UAC 用户与非 UAC 用户不在同一个会话中),它与编程无关。
  • 我认为这是非常有话题的,作为程序员,如果最终用户决定提升您的程序,您需要远离发生的问题。
  • 我同意斯科特的观点。这是一个常见的编程问题,我认为这是一个很好的网站。

标签: .net windows-7 uac


【解决方案1】:

Windows 中的映射驱动器与用户上下文相关联。映射到帐户的驱动器:用户 A,用户 B 将无法访问。不过,您可以在不同的用户下创建映射到相同驱动器号的相同 unc 路径。

使用完整的 unc 路径应该可以工作。

更多信息请访问 support.microsoft.com:12

【讨论】:

  • 完整的 UNC 路径似乎也不起作用。我怀疑我对网络共享的登录以某种方式仅与我的用户相关联,因此如果我尝试访问与“管理员”相同的共享,它会期望我重新授权自己。有没有办法解决这个问题?
  • 无论应用程序在哪个用户下运行,都需要获得 unc 路径的权限。如果您可以在以该用户身份登录时访问该路径,那么应用程序应该能够通过 Directory.Exists 以编程方式访问相同的路径...
  • 您使用的是管理员帐户,但这是本地管理员帐户吗?此管理员帐户是否有权访问远程路径?你能验证一下吗?
  • 我刚刚在以管理员身份启动的 PowerShell 中进行了尝试:`cd \\titanium\Private`,但它不起作用(“不存在”)。为什么会这样?我该如何解决它?我想我可以编写一个单独的程序来创建符号链接,并让我的程序作为管理员“按需”运行,但对于这样一个简单的任务来说,这似乎是一项非常艰巨的工作。
  • 我相信在命令行窗口(和 bat/cmd 脚本)中,您不能直接引用 unc 路径。您必须使用映射驱动器。我会在几分钟内回复你。将启动我的 Windows 机器并检查。
【解决方案2】:

它不起作用的根本原因是IIS用户没有访问路径的权限。以普通用户身份运行时,授予用户访问权限,即要使其工作,您需要授予 IIS 文件夹的权限 按照下面的 UNC 路径在 iis 运行的服务中工作:

属性 --> 安全 --> 编辑 --> 添加 --> IIS_WPG

【讨论】:

    【解决方案3】:

    这已被讨论here。显然,在早期版本的 .Net Framework the documentation 中明确提到这是不可能的(“Exists 方法不执行网络身份验证。如果您在未经过预身份验证的情况下查询现有网络共享,Exists 方法将返回 false 。”)。 4.0 的文档中不再包含这句话,但行为并没有改变。

    我找到了解决方法here(但决定不使用它)。

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2011-06-12
      • 2011-10-04
      • 2015-07-08
      相关资源
      最近更新 更多