C# 使用Windows服务在映射驱动器上复制文件时,找不到路径的一部分
我有一个Windows服务,它可以更新网络上映射为驱动器“Z:\”的一些文件。当我以管理员身份从VS运行代码时,我能够将文件复制到映射的驱动器上,但当从以管理员帐户运行的服务运行时,同样的操作失败。 映射驱动器是从运行服务的同一帐户创建的。有点令人困惑,为什么从VS运行而不是从服务运行时它会工作。 使用UNC是否比使用网络驱动器更好。 下面的论坛有一个变通方法C# 使用Windows服务在映射驱动器上复制文件时,找不到路径的一部分,c#,.net,C#,.net,我有一个Windows服务,它可以更新网络上映射为驱动器“Z:\”的一些文件。当我以管理员身份从VS运行代码时,我能够将文件复制到映射的驱动器上,但当从以管理员帐户运行的服务运行时,同样的操作失败。 映射驱动器是从运行服务的同一帐户创建的。有点令人困惑,为什么从VS运行而不是从服务运行时它会工作。 使用UNC是否比使用网络驱动器更好。 下面的论坛有一个变通方法 但它使用了UNC未映射的驱动器 我认为UNC是个更好的主意 如果在登录时映射了映射的驱动器怎么办?服务可能会在没有用户登录的情况下运行,
但它使用了UNC未映射的驱动器 我认为UNC是个更好的主意
如果在登录时映射了映射的驱动器怎么办?服务可能会在没有用户登录的情况下运行,因此可能永远不会创建映射。我们也经历过这种情况,虽然我无法告诉您为什么我们的解决方案有效,但我可以告诉您什么有效 在代码中映射驱动器。不要仅仅因为使用相同的帐户就依赖映射的驱动器 根据我们看到的行为,我猜这就是我们的处境和你们的处境 我们遇到问题的服务使用了在登录脚本中映射的驱动器。如果我们让这台机器以服务使用的同一用户的身份登录,它会工作,但如果不是,它就不会工作。基于此,我猜测驱动器根本没有映射,因为服务没有真正“登录” 在代码中映射驱动器修复了它 作为补充说明,您也可以直接引用UNC路径,但我们在这方面也存在权限问题。映射驱动器,传递用户名和密码对我们来说效果更好 我们执行此操作的代码:
public static class NetworkDrives
{
public static bool MapDrive(string DriveLetter, string Path, string Username, string Password)
{
bool ReturnValue = false;
if(System.IO.Directory.Exists(DriveLetter + ":\\"))
{
DisconnectDrive(DriveLetter);
}
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "net.exe";
p.StartInfo.Arguments = " use " + DriveLetter + ": " + '"' + Path + '"' + " " + Password + " /user:" + Username;
p.Start();
p.WaitForExit();
string ErrorMessage = p.StandardError.ReadToEnd();
string OuputMessage = p.StandardOutput.ReadToEnd();
if (ErrorMessage.Length > 0)
{
throw new Exception("Error:" + ErrorMessage);
}
else
{
ReturnValue = true;
}
return ReturnValue;
}
public static bool DisconnectDrive(string DriveLetter)
{
bool ReturnValue = false;
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "net.exe";
p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE";
p.Start();
p.WaitForExit();
string ErrorMessage = p.StandardError.ReadToEnd();
string OuputMessage = p.StandardOutput.ReadToEnd();
if (ErrorMessage.Length > 0)
{
throw new Exception("Error:" + ErrorMessage);
}
else
{
ReturnValue = true;
}
return ReturnValue;
}
}
使用上述类,您可以随意映射和断开驱动器。如果这是一项服务,我建议您在需要之前映射驱动器,并在需要之后立即断开驱动器的连接 为了解决同一个问题,我花了很多时间(~3天)。似乎它与NTFS和文件级权限更相关。如果您使用共享位置而不是驱动器,这会更好。这对多次同时尝试连接都不起作用。简直救了我!就像Sachin提到的,要小心多次连接尝试。所以有些事情需要注意。