2008-10-30 66 views
7

我有一個由Windows服務啓動的可執行文件,該程序將在客戶機器上運行,並且需要連接到遠程共享才能執行一個特定的任務。這個份額是由客戶通過用戶界面指定的,所以我們事先並不知道這一點,這意味着它不能被「硬編碼」,或預先分配了共享。由使用本地系統帳戶的Windows服務啓動的可執行文件無法訪問網絡共享

此前我們要求客戶登錄到他們的機器並在登錄時運行可執行文件,但我們一直希望允許我們的程序在服務中運行,而不需要登錄,主要是爲了讓它更方便客戶,並防止任何意外退出關閉我們的軟件。所以這也意味着我們不知道客戶機器上存在什麼本地用戶帳戶,所以我們必須使用本地系統帳戶啓動服務。

如上所述,我們現在有一個包裝服務來啓動可執行文件並執行各種任務。這似乎在大多數情況下正常工作,並訪問底層網絡罰款 - 我們的軟件的目的主要涉及捕獲數據包等。

但是,當軟件試圖連接到Windows共享(UNC名稱)它無法連接。而如果可執行文件手動啓動,則連接正常。

我一般認爲解決這類問題的建議似乎都使用用戶帳戶,因爲系統帳戶無法訪問網絡共享,但在我們的情況下,這是不可能的。有沒有其他辦法可以讓這個工作?

編輯:我忘了提及這個應用程序可以(也是最常見的)在Win2K上運行而不是XP上,我想我說的是本地網絡帳戶在XP之前是不可用的?

回答

6

如果您可以更改Windows服務以使其在網絡服務帳戶下運行,那麼您的可執行文件將能夠訪問網絡共享(這是創建網絡服務帳戶的原因之一)。

本地系統和本地服務帳戶沒有任何網絡憑據,因此無法在網絡上進行身份驗證。這是設計。

編輯: IIRC,網絡服務帳戶是在Server 2003中引入的,並添加到其中一個XP Service Pack中。

如果您不能依賴可用的網絡服務帳戶,那麼您可以考慮創建一個專用域帳戶,將帳戶的憑據存儲在某處,從您的服務中讀取它們,然後登錄並在訪問之前模擬該用戶網絡共享。或者,Windows服務可以直接作爲專用帳戶運行,在這種情況下,它需要「登錄即服務」權限。

+0

謝謝。你的最後一個建議看起來就像我的情況一樣,我創建了一個專用帳戶,並且能夠使用此帳戶和CreateProcessAsUser()啓動我的可執行文件,然後它似乎能夠訪問網絡共享(如果它在管理員組中)... – 2008-10-31 15:02:05

+0

顯然,您必須授予您的專用帳戶適當的訪問權限。 – 2008-11-01 16:17:55

4

當您擁有在NT AUTHORITY \ LOCALSYSTEM(這是服務帳戶的名稱)下運行的服務時,它顯示爲網絡其餘部分的DOMAINNAME \ COMPUTERNAME $(注意$符號)帳戶。也就是說,它顯示爲活動目錄中的計算機帳戶。只需將您的文件和共享權限授予DOMAINNAME \ COMPUTERNAME $,您就應該很好。

0

爲什麼你不能使用另一個帳戶? Windows中內置了一個網絡服務帳戶,專門用於需要網絡訪問的服務。

無論如何,有一個服務啓動exe時要非常小心。

如果對exe文件夾的寫入訪問權限未被禁用,用戶可以用(例如)cmd.exe替換該exe文件。下一次該服務試圖啓動你的exe,voilà:一個帶有系統權限的命令shell!

相關問題