如何使用System.IO.DirectoryInfo访问映射的网络驱动器?

时间:2020-03-06 14:43:24  来源:igfitidea点击:

我需要在映射的网络驱动器上创建目录。我正在使用代码:

DirectoryInfo targetDirectory = new DirectoryInfo(path);
if (targetDirectory != null)
{
    targetDirectory.Create();
}

如果我指定类似" \\ ServerName \ Directory"的路径,则一切正常。如果我将" \ ServerName \ Directory"映射为,例如驱动器Z :,并指定类似" Z:\"的路径,则它将失败。

创建targetDirectory对象之后,VS(在调试模式下)显示targetDirectory.Exists = false,并尝试执行targetDirectory.Create()会引发异常:

System.IO.DirectoryNotFoundException: "Could not find a part of the path 'Z:\'."

但是,相同的代码在本地目录下也能很好地工作,例如C:。

该应用程序是Windows服务(WinXP Pro,SP2,.NET 2),与映射驱动器的用户使用相同的帐户运行。 Qwinsta答复用户会话是会话0,因此它与服务会话相同。

解决方案

我们可以尝试使用WNetConnection将映射的驱动器解析为网络路径。

我们是否使用与程序运行时完全相同的凭据进行映射?

映射的网络驱动器是特定于用户的,因此,如果应用程序以与创建映射驱动器号(z :)的用户不同的身份运行,它将无法正常工作。

应用程序所运行的帐户可能无权访问映射的驱动器。如果这是一个Web应用程序,那肯定是问题所在……默认情况下,一个Web应用程序以NETWORK SERVICE帐户运行,该帐户没有任何映射的驱动器设置。尝试使用模拟来解决问题。尽管我们可能需要找出一个更好的解决方案,然后才使用模拟。如果是我,我会坚持使用UNC路径。

我们在Vista / Server 2k8上运行吗?这两个服务都将服务隔离到会话0中,而第一个交互式会话是会话1. 这里有关于会话隔离的更多信息。因此,即使服务和交互式登录使用的是同一用户,也将是不同的会话。