Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Windows服务在映射驱动器上复制文件时,找不到路径的一部分_C#_.net - Fatal编程技术网

C# 使用Windows服务在映射驱动器上复制文件时,找不到路径的一部分

C# 使用Windows服务在映射驱动器上复制文件时,找不到路径的一部分,c#,.net,C#,.net,我有一个Windows服务,它可以更新网络上映射为驱动器“Z:\”的一些文件。当我以管理员身份从VS运行代码时,我能够将文件复制到映射的驱动器上,但当从以管理员帐户运行的服务运行时,同样的操作失败。 映射驱动器是从运行服务的同一帐户创建的。有点令人困惑,为什么从VS运行而不是从服务运行时它会工作。 使用UNC是否比使用网络驱动器更好。 下面的论坛有一个变通方法 但它使用了UNC未映射的驱动器 我认为UNC是个更好的主意 如果在登录时映射了映射的驱动器怎么办?服务可能会在没有用户登录的情况下运行,

我有一个Windows服务,它可以更新网络上映射为驱动器“Z:\”的一些文件。当我以管理员身份从VS运行代码时,我能够将文件复制到映射的驱动器上,但当从以管理员帐户运行的服务运行时,同样的操作失败。 映射驱动器是从运行服务的同一帐户创建的。有点令人困惑,为什么从VS运行而不是从服务运行时它会工作。 使用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提到的,要小心多次连接尝试。所以有些事情需要注意。