【发布时间】:2011-09-30 05:59:37
【问题描述】:
我对这个有点茫然……似乎无法理解发生了什么。
我有一个应用程序将一些文件写入配置的输出目录,但在此之前,当应用程序加载时我会这样做......
string path = ConfigurationManager.AppSettings["TempDir"];
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
我的问题是,在我的情况下,路径是基于网络的位置“\MyServer\Share”,当我使用该路径时它可以工作,但我使用的路径实际上是“Z:\”,因为共享是映射并在网络上的所有用户会话中自动映射。
我想使用“Z:\”,但它无法返回错误提示“全部或部分路径不存在”。
我立刻想到“哦,这一定是权限”,所以我对照说“G:\”检查了它,它有效并且应用了相同的权限......
对于所有有问题的共享,我的用户帐户对该位置具有完全控制权限。
最初我认为它可能是这样的:Directory.Exists not getting mapped directory 但是后来我想起了该应用程序不可能在另一个帐户下运行,因为我检查并
- 它只是一个控制台应用程序
-
前一行是这样的:
AppDomain.CurrentDomain.SetThreadPrincipal(new WindowsPrincipal(WindowsIdentity.GetCurrent()));
.. 据我了解,这样做的目的是确保 appdomain 在当前 Windows 用户的上下文中运行,包括所有“在 app 域中创建的线程”,除非另有说明
有什么想法吗?
编辑:
按照 Richard 的建议查看进程监视器(请参阅下面的 cmets)表明,如果我使用完整的 unc 路径“\MyServer\Share”,则如果我使用映射路径“Z:\”,则请求将按照我的预期发出它仍然请求完整的 unc 路径“\MyServer\Share”(大概是在 .net 的内部工作中进行某种形式的翻译)。
所以无论我请求什么完整的 unc 路径“\MyServer\Share”,但只有明确指定完整的 unc 路径,我才能访问它...奇怪!!!
上面发布的代码与我在控制台应用程序中编写的完全一样,除了那个原则性的事情之外,没有其他事情发生,因为这些是在我的控制台应用程序中执行的第一行代码。
嗯……
编辑 2:
好的,现在我真的很困惑,当在上面的配置文件请求行上放置一个断点并将其运行到断点然后清除进程监视器并跳过它,并且 if 语句没有出现在进程监视器中,因为我会期望它...
为什么会这样?
【问题讨论】:
-
Process Monitor 显示应用程序在做什么?
-
好问题...给我 2 分钟时间检查一下
-
嗯,有趣的 GSerg,您可能会有所收获。
-
好的,我关闭了 UAC 并尝试在没有调试器的情况下自行执行应用程序...... UAc 对结果没有影响,但在 Visual Studio 之外执行应用程序表明它确实请求unc 路径 .. 奇怪的是它在调试时没有,但你不觉得吗???
标签: c# .net permissions file-permissions