我有一个Windows服务,它将映射为驱动器“Z:\”的网络上的某些文件进行更新。当我以管理员身份从VS运行代码时,我可以将文件复制到映射的驱动器上,但是当从管理员帐户下运行的服务运行时,同样的事情会失败。 映射驱动器是从运行服务的相同帐户创建的。有点令人困惑,为什么它的工作时从VS而不是从服务运行。 使用UNC比网络驱动器更好吗? 在下面的论坛有一个解决方法 http://support.microsoft.com/default.aspx?scid=kb;en-us;827421#appliesto 但它使用UNC未映射的驱动器。找不到路径的一部分:使用Windows服务在映射驱动器上复制文件
2
A
回答
3
我建议UNC是一个更好的主意。
如果映射的驱动器在登录时被映射,该怎么办?即使登录,服务也可能在没有用户的情况下运行,因此可能永远不会创建映射。
3
我们也经历过这种情况,虽然我不能告诉你为什么我们的决议起作用了,但我可以告诉你什么是成功的。
在代码中映射驱动器。不要仅仅因为您使用相同的帐户而映射驱动器。
根据我们所看到的行为,这就是我会在我们的情况中发生GUESS的情况,以及您的情况。
我们遇到的服务使用了映射到登录脚本中的驱动器。如果我们让机器以服务使用的同一用户的身份登录,它就能工作,但如果没有,它将无法工作。基于此,我猜测驱动器根本就没有映射,因为服务并没有真正“登录”。
映射代码中的驱动器修复它。
请注意,您也可以直接引用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;
}
}
使用上面的类,你可以映射和随意断开驱动器。如果这是一项服务,我会建议您在需要之前映射驱动器,并在需要时立即断开驱动器。
0
我挣扎了很多(〜3天)来解决同样的问题。似乎它与NTFS和文件级权限更相关。如果您使用共享位置而不是驱动器,则会更好。
相关问题
- 1. 如何在不映射驱动器的情况下创建表示Windows服务器上的路径的文件?
- 2. 将文件名映射到服务器上的路径Asp.net
- 3. ITHit Webdav服务器 - 无法将文件复制到映射驱动器
- 4. 在OSX上使用python将文件复制到网络路径或驱动器
- 5. asp.net文件上传web服务 - 找不到路径的一部分
- 6. 复制文件fo映射网络驱动器使用FileInfo.CopyTo
- 7. ASP.NET - 将文件复制到映射的网络驱动器
- 8. 使用PowerShell安装Azure文件服务映射驱动器
- 9. 映射驱动器,然后VB Windows服务使用它
- 10. 在windows azure上找不到路径的一部分
- 11. 找不到路径的一部分。复制应用程序中的文件。 WPF
- 12. Tomcat6作为Windows服务不承认映射的驱动器
- 13. 检测路径是否在Windows映射的网络驱动器上
- 14. 找到服务器中其他驱动器文件夹的路径
- 15. 从网络服务器复制目录到映射的网络驱动器
- 16. VHD驱动器的服务器路径
- 17. 使用ANT将文件从本地目录复制到映射驱动器
- 18. VMWare VMDK映射到Windows驱动器号
- 19. ASP.NET MVC3将文件复制到共享的映射驱动器 - 对路径的访问被拒绝
- 20. “找不到路径的一部分”寻找一个UNC路径
- 21. 在网络驱动器上查找文件的绝对路径
- 22. 如何从服务器驱动器获取映像路径
- 23. 在Windows服务器上查找Perl文件的正确文件路径?
- 24. 找不到设计映射路径
- 25. Devise_scope - 找不到设计映射路径“/”
- 26. 如何在远程服务器上映射路径
- 27. 如何使用Python将文件复制到网络路径或驱动器
- 28. 如何使用asp.net上传映射驱动器中的文件?
- 29. 使用asp.net上传映射驱动器中的文件
- 30. 如何使用asp.net上传映射驱动器中的文件?
这不适用于多个同时连接尝试。 – 2013-10-17 13:46:28