2011-08-18 64 views
1

我們有一個java進程作爲本地系統用戶在Windows上運行,需要訪問系統中另一個用戶擁有的文件。據我所知,本地系統用戶應該有權模擬該用戶。爲此,我們傳遞正在訪問文件的程序的tid和pid,並從中獲取用戶信息(令牌)。然後我們在當前線程上設置標記。像這樣:java模擬

DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityImpersonation,TokenImpersonation,&hTokenDup); 
SetThreadToken(NULL, hTokenDup); 

其中hToken是通過打開線程,然後通過他們的ID進行處理獲得。 問題是當我試圖訪問一個只能被用戶訪問的文件而沒有其他人無法讀取它時。我得到一個拒絕訪問錯誤。所以問題是我是否應該能夠通過模擬訪問這個文件,如果是的話,這是正確的冒充另一個用戶給定一個threadid和PID。我想我也會看到Windows 7和Windows XP之間的不同行爲。

+2

我對Java的知識接近於零,所以我認爲如果我說廢話,但...我的第一個想法是1)與其他用戶一起運行2)修改文件權限 –

+0

我們不能那樣做。我們事先沒有這些信息。 – noahd

回答

1

對於初學者,您應該總是測試您的Windows API調用的返回值。 只有這樣你才能確定令牌確實已被複制並分配給你的進程。

模仿需要一些特權,如果你是一個簡單的用戶,我並不確定你會有什麼特權。我懷疑DuplicateTokenEx函數失敗。 以管理員權限再次嘗試(使用「Run as ...」工具),並讓我們知道它是如何發生的。

+0

對不起,我留下了一些代碼...我們正在檢查返回值,一切都恢復正常。我們也是本地的系統用戶,據說它有正確的特權或者至少有模擬權限。 – noahd

+0

如果您確實在SYSTEM帳戶下運行,我不認爲您有任何文件無法讀取(或您的權限無法更改)。 – executifs