2016-05-31 104 views
0

我寫過一個正在加載到作爲本地系統運行的服務進程中的DLL。我不應該刪除我創建的文件嗎?SYSTEM文件中的CreateFile/Close句柄後DeleteFile失敗

HANDLE hFile = CreateFileW(m_achTempFilePath, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ; 

成功。 然後我跑CloseHandle(hFile)

DeleteFile(m_achTempFilePath)

刪除文件失敗,拒絕訪問。

我執行以下操作並將&sa作爲安全屬性傳遞給CreateFile,然後DeleteFile成功。但是這給了大家完全的控制權。我不想那樣。

這樣做的正確方法是什麼?

CDacl dacl; 
dacl.AddAllowedAce(Sids::World(), SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL) ; 
CSecurityDesc sd; 
sd.SetDacl(dacl); 
CSecurityAttributes sa; 
sa.Set(sd, true); 
+0

對於創建臨時文件的文件夾,其權限是否可以設置爲明確拒絕「刪除」操作(同時允許其他操作)?要檢查這一點,您可以在資源管理器中深入查看文件夾的「屬性」上下文菜單,並繼續爲SYSTEM用戶選擇「高級」視圖,直到看到與其他操作分離的「刪除」。 –

+0

如何在不取得目錄所有權的情況下查看系統用戶的權限?我按照說明[這裏](http://superuser.com/questions/172437/run-explorer-in-system-account-on-windows-vista-or或7-using-sysinternal-s-psexec)。它將以系統的形式啓動開始菜單,但它始終會啓動瀏覽器UI,以我的本地用戶帳戶遍歷文件系統。 如果您想檢查本地計算機,則目錄爲c:\ ProgramData \ Microsoft \ Search \ Data \ Temp \ usgthrsvc。 – tdemay

+0

正確...我忘了。我轉移到C:\ ProgramData ...我在公共應用程序數據目錄下創建了一個目錄。可以在那裏創建目錄和文件,但不能在以本地系統運行的服務帳戶中刪除它們。 – tdemay

回答

0

您可以在創建文件方法中始終使用標記FILE_FLAG_DELETE_ON_CLOSE。這樣,當你關閉文件的句柄時,它會自行清理。這個問題本身可能是一個基於時間的Windows核心問題。

此變通應解決此問題。

+0

我需要解決權限問題。不是解決方法。這不是一個時間問題。我無法刪除在此安全上下文中運行時創建的任何文件。我無法刪除或重命名由GetTempFileName創建的任何文件。 – tdemay