2012-05-08 227 views
3

我有一個Windows服務,使用登錄localhost\administrator運行。此服務旨在調用另一個可執行文件(MyProcess.exe),該文件應該將某些內容寫入日誌文件。該服務使用Process.Start()創建的過程中,像這樣:通過網絡共享訪問本地文件夾問題

var p = new Process(); 
p.StartInfo.FileName = processFileName; 
p.StartInfo.Arguments = arg; 
p.Start(); 

問題是,似乎MyProcess.exe被拒絕的權利寫入日誌文件,即使localhost\administrator無疑有權日誌文件夾。如果我從命令行運行MyProcess.exe,它可以很好地工作。

那麼,是否有可能使用不同的用戶登錄來執行進程?

你能想到爲什麼MyProcess.exe被拒絕寫日誌文件的權利的任何其他原因?

UPDATE:日誌文件正在寫入本地機器,但使用網絡地址,即\\MyPC\LogFolder。當我更改代碼來引用C:\MyFolder時,一切正常。這顯然與網絡地址有問題(即使它是本地的)。

我需要在文件夾上放置哪些共享設置才能讓本地系統帳戶訪問該文件?

+0

任何原因你不只是使服務作爲本地系統運行? – KingCronus

+0

@KingCronus - 並非如此,我們之所以這樣做是因爲程序沒有寫入的緣故。顯然LocalSystem沒有權限到日誌文件夾。什麼是LocalSystem的正式帳戶名稱,所以我可以給共享文件夾上的帳戶權限? –

+0

似乎很奇怪,LocalSystem應該可以訪問大多數地方的管理員?你把你的日誌文件放在哪裏? – KingCronus

回答

1

我的工作了。

正如我的更新中指出的那樣,問題在於該過程使用網絡共享地址\\MyPC\LogFolder來尋址日誌文件夾,當我們切換配置以便它寫入c:\Logfolder時,它工作正常。

因此,當您處理本地文件夾時,localhost\Administrator帳戶被視爲擁有足夠的權利。但是,當您通過網絡共享時,您需要提供有效的網絡憑據,並且localhost\Administrator只是不會削減它。如果更改爲使用MYDOMAIN\MyUser,則即使使用網絡共享地址也可以使用。

+0

有道理!真高興你做到了。 – KingCronus

+0

@KingCronus - 感謝您的幫助 - 您讓我朝着正確的方向思考! –

3

如果您正在使用模擬,那麼它會冒充可以是當前用戶或指定用戶的用戶。如果沒有,它將在本地系統下運行,具有本地系統的特權。

+0

你如何使用模擬作爲運行當前進程的相同用戶來運行? –

+0

請參閱我對問題的更新 –

1
p.StartInfo.Domain = "UserName"; 
p.StartInfo.Password = "Passw0rd!"; 

你可以從用戶名:

Thread.CurrentPrincipal.Identity.Name 
+0

這是一個Windows服務 - 不允許UI。我需要使用與運行Windows服務的用戶相同的憑據來運行第二個進程。 –

+0

@Shaul嘗試,而不是'p.StartInfo.UseShellExecute = false;'。這可能會使它以相同的用戶憑據運行。 – SimpleVar

+0

請參閱我的問題更新 –