2011-07-23 49 views
8

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

我使用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提示)。

+0

投票结束,作为题外话题。这里的问题是UAC(并且UAC用户与非UAC用户不在同一个会话中),并且它与编程无关。 – Lucero

+9

我认为这是非常重要的话题,作为一名程序员,如果最终用户决定提升您的程序,您需要避免发生的问题。 –

+0

我同意斯科特。这是一个常见的编程问题,在我看来这是一个很棒的网站。 –

回答

7

窗口中的映射驱动器绑定到用户上下文。映射到帐户的驱动器:用户A不会被用户B访问。不过,您可以在不同的用户下创建映射到相同驱动器盘符的相同的unc路径。

尽管使用完整的unc路径应该可以工作。在support.microsoft.com

更多信息:12

+0

完整的UNC路径似乎也不起作用。我怀疑,我以某种方式登录到网络共享只与我的用户相关联,所以如果我尝试访问与“管理员”相同的共享,它会期望我重新授权我自己。有没有解决的办法? – Ethan

+0

无论用户运行哪个应用程序,都需要unc路径的权限。如果您可以以该用户身份登录时访问路径,则应用程序应能够通过Directory.Exists以编程方式访问相同的路径... – mservidio

+0

您正在使用管理员帐户,但是这是本地管理员帐户吗?此管理员帐户是否可以访问远程路径?你能证实吗? – mservidio

1

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

我发现一个解决方法here(但决定不使用它)。

0

它不起作用的基本原因是IIS用户没有权限访问路径。以常规用户身份运行时,访问权将交给用户i。E要使它工作,你需要给权限的IIS文件夹 如下遵循UNC路径由IIS中运行的服务工作:

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

相关问题