2010-07-13 184 views
0

(有沿着這些線路等問題,但他們都沒有任何真正的答案,更別說答案對付蟒蛇...)映射網絡驅動器

我有一個Windows服務(XP SP3)用Python編寫,需要能夠爲所有用戶安裝網絡驅動器。我嘗試使用net usesubprocess(即使是net.exe的完整路徑),但考慮到您的服務作爲SYSTEM用戶運行,net對您非常不滿(它抱怨缺少用戶上下文)。有可能通過WMI來做到這一點,但我一直無法弄清楚。

編輯:其實,也許你不能用WMI來做到這一點。 This article似乎表明此功能在WSH中可用,但不在WMI中可用。也許有些方法可以使用netmap來做到這一點?

回答

1

呃...可悲的是,簡短的回答是否定的。如果Python程序是作爲Windows服務運行的,這裏有很多複雜的問題......所以讓我解釋一下。

首先,爲了甚至允許服務程序本身訪問網絡,它必須在允許網絡訪問的用戶帳戶下運行。 SYSTEM帳戶已禁用(所有網絡訪問均被禁止),但您可以使用「NETWORK SERVICE」帳戶(在域環境中,該帳戶實際上是計算機的域帳戶)或其他實際用戶帳戶。

但是你不能在服務帳戶中映射驅動器,因爲它不會加載用戶配置文件,包括「映射」到驅動器盤符的能力。 (從技術上講,如果服務運行CMD批處理文件,該腳本可以映射一個驅動器盤符並使用它,但是它不會持續下一次登錄......但是從來不會這樣)。相反,任何程序想要通過UNC路徑訪問網絡(如\ SERVERNAME \ SHARENAME)。

最後,無法爲「所有用戶」製作驅動器映射 - 映射驅動器對每個用戶配置文件都是唯一的(即使它使用相同的字母指向相同的服務器共享)。如果您有多個用戶登錄到計算機(例如,在終端服務器上,或者用戶和服務在另一個用戶帳戶下運行),他們無法共享映射驅動器 - 每個用戶都必須擁有自己的映射驅動器。

但是,您可以這樣做:製作一個登錄腳本(或組策略等),將驅動器與期望的字母(比如說「M:」)映射到服務器共享(\ server \分享)。如果此腳本在登錄時爲每個用戶運行,則它們都具有相同的映射。然後當程序運行即服務需要訪問該共享時,它必須使用UNC路徑(當然還有一個具有適當權限的用戶帳戶)。

希望有幫助!

+0

顯然,系統沒有完全禁止網絡訪問 - 我已經能夠使用WNetAddConnection2進行到遠程服務器的連接,並使用該連接複製文件 - 我只是不能操縱用戶環境映射驅動器。 – 2010-07-13 04:16:55

+0

此外,使用登錄腳本是一個很好的主意......這可能對我有用。 :-) – 2010-07-13 04:18:22

+0

令人驚訝的是,SYSTEM帳戶允許一些出站連接......至少不是*應該*。非常適合Micro $ oft的安全沙箱! – ewall 2010-07-13 13:45:44