2009-04-27 72 views
2

我想網絡驅動器從Windows服務地圖,我使用批處理文件執行批處理文件,無論是在服務的構造或處理通信事件中執行以下命令如何從Windows服務映射網絡驅動器?

NET USE U: \\192.168.55.6\folder password 

,驅動器沒有映射?

 Process process = new Process(); 
     process.StartInfo.FileName = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\MAP.BAT"; 
     process.StartInfo.CreateNoWindow = false; 
     process.Start(); 

如何從Windows服務映射網絡驅動器?

+3

我不知道爲什麼你的連接出現故障,但爲什麼不直接從您的代碼進行映射,而非炮擊,以NET.EXE? http://pinvoke.net/default.aspx/mpr/WNetAddConnection2.html會給你一個錯誤代碼,這將有助於你進行調試。 – 2009-04-27 10:52:14

回答

2

通過使用Map Network Drive (API)映射網絡驅動器解決了所有問題。我在服務的OnStart事件時映射所需的驅動器。

0

我認爲服務不能映射網絡驅動器,除非他們有正確的「與桌面交互」?

嘗試在「網絡服務」帳戶下運行服務,而不是「本地系統」?

+0

這也不起作用。 – Ahmed 2009-04-27 09:55:48

+0

你能記錄地圖命令的輸出嗎?例如:「net use ...> c:\ map.log」 – Andomar 2009-04-27 10:46:39

+0

這應該不重要我認爲 - 網絡映射不由shell管理。它們是內核級鏈接。請參閱SysInternals中的WinObj。 – MSalters 2009-04-27 10:50:22

0

您是否在屬於密碼的用戶帳戶下運行服務? MAP USE命令將使用當前用戶,除非您通過/ USER:另一個用戶

0

調用正確的API函數可能會更好,而不是調用批處理文件來調用另一個可執行文件。你正在尋找的功能是DefineDosDevice()

0

據我所知,映射驅動器只映射用戶會話的持續時間。如果您的Windows服務在啓動時運行,或者不是用戶會話的一部分,則驅動器映射將丟失。

這可能是也可能不是真的,但值得研究 - 我從7年前的一個類似場景中記住了一些事情。

1

這裏有兩個問題:

  1. 映射只在使用用戶會話,這意味着有效地你不能使用映射驅動器的服務。您需要使用路徑。
  2. 第二個問題是服務(使用本地系統帳戶) 無法訪問網絡,或者更具體地說,無法訪問所需的資源 。要解決此問題,您需要執行以下任一操作:給 運行服務的「計算機」特定訪問 該文件夾,或者設置該服務以使用可訪問該服務的網絡(DOMAIN)帳戶 資源。
4

這可以通過使用對Windows Script Host Object Model的引用來實現。

添加對的Windows引用的Windows腳本宿主對象模型,它向參考部分添加條目IWshRuntimeLibrary。現在您可以使用以下代碼來映射驅動器。

using IWshRuntimeLibrary; 

IWshNetwork_Class network = new IWshNetwork_Class(); 
network.MapNetworkDrive("k:",@"\\192.168.20.35\MyShare", Type.Missing, "user1", "password1"); 

您可以使用下面的代碼UnMap或刪除映射。

network.RemoveNetworkDrive("k:"); 

我已經記錄的詳細步驟here

相關問題