我正在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路径,因为我只是在常规用户下登录到我的文件服务器,而不是在“管理员”下。作为一个(相对hackish)的解决方法,我只使用常规权限运行我的程序,然后使用Process.Start
调用cmd.exe实例,并使用参数创建符号链接(和动词“runas”以获取UAC提示)。
答案 0 :(得分:7)
Windows中的映射驱动器与用户上下文相关联。 UserB无法访问映射到帐户的驱动器:UserA。您可以创建映射到不同用户下相同驱动器号的相同unc路径。
使用完整的unc路径应该可行。
答案 1 :(得分:1)
已经讨论过here。显然,在早期版本的.Net Framework the documentation中明确提到这是不可能的(“Exists方法不执行网络身份验证。如果您在未经过预先身份验证的情况下查询现有网络共享,则Exists方法将返回false。“)。 4.0文档不再包含此句子,但行为没有改变。
我找到了一个解决方法here(但决定不使用它)。
答案 2 :(得分:1)
它不起作用的基本原因是IIS用户无权访问该路径。当以普通用户身份运行时,会向用户提供访问权限,即为了使其正常工作,您需要为IIS的文件夹授予权限 按照以下步骤,在iis运行的服务中使用UNC路径:
属性 - >安全 - >编辑 - >添加 - > IIS_WPG