我有一個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. 複製文件到映射的驅動器不工作
- 4. ITHit Webdav服務器 - 無法將文件複製到映射驅動器
- 5. 服務器找不到文件路徑
- 6. 如何使用映射的驅動器路徑而不是真正的路徑使Powershell輸出文件路徑?
- 7. 如何使用PowerShell替換部分映射的網絡驅動器路徑?
- 8. 在OSX上使用python將文件複製到網絡路徑或驅動器
- 9. asp.net文件上傳web服務 - 找不到路徑的一部分
- 10. 使用java在windows服務器上查找網絡驅動器上的文件
- 11. 複製文件fo映射網絡驅動器使用FileInfo.CopyTo
- 12. 使用PowerShell安裝Azure文件服務映射驅動器
- 13. ASP.NET - 將文件複製到映射的網絡驅動器
- 14. 映射驅動器,然後VB Windows服務使用它
- 15. 在windows azure上找不到路徑的一部分
- 16. Tomcat6作爲Windows服務不承認映射的驅動器
- 17. 找不到路徑的一部分。複製應用程序中的文件。 WPF
- 18. 複製項目找不到路徑的一部分(在。文件夾名稱中)
- 19. 找到服務器中其他驅動器文件夾的路徑
- 20. 檢測路徑是否在Windows映射的網絡驅動器上
- 21. 從網絡服務器複製目錄到映射的網絡驅動器
- 22. VHD驅動器的服務器路徑
- 23. 在Windows服務中連接映射驅動器號
- 24. Powershell使用映射驅動器作爲根路徑
- 25. 無法使用路徑和密碼映射網絡驅動器
- 26. 使用ANT將文件從本地目錄複製到映射驅動器
- 27. VMWare VMDK映射到Windows驅動器號
- 28. ASP.NET MVC3將文件複製到共享的映射驅動器 - 對路徑的訪問被拒絕
- 29. 「找不到路徑的一部分」尋找一個UNC路徑
- 30. 在網絡驅動器上查找文件的絕對路徑
這不適用於多個同時連接嘗試。 – 2013-10-17 13:46:28