2013-11-28 81 views
1

我有一種情況,用戶可以配置某些文件的目標位置(被下載並安裝以供應用程序使用)。有兩個配置位置,一個系統位置和一個用戶位置。該應用程序是一個(基於Lua的)命令行工具。驗證'C: Program Files '是否可寫

在安裝之前,我通過編寫一個臨時文件並再次刪除它來檢查正在寫入的位置。如果失敗,我使用提升的權限重新啓動相同的命令,這允許管理員安裝,但不是普通用戶。

問題:系統默認位置位於內部C:\Program Files\,其被保護的(不是問題)和重定向(這是問題)到C:\Users\<name>\AppData\VirtualStore\Program Files\...目錄。 由於此重定向測試成功,所以正在安裝的東西沒有提升權限。因此最終在VirtualStore,而不是得到一個錯誤,該用戶不具備所需的權限。

問題:那我該如何測試實際的C:\Program Files\是否可寫,而無需調用VirtualStore重定向?

+0

Wow64DisableWow64FsRedirection。 – Sneftel

+1

@Sneftel這是爲了64/32位兼容性。不是因爲我的問題與UAC有關。然後也;我只能訪問命令行命令或Lua腳本。不適用於任何Windows API函數。 – Tieske

+0

不會檢查您的管理權限是否足夠? – npocmaka

回答

0
del /q /f "C:\Users\%username%\AppData\Local\VirtualStore\Program Files\redirectionTest" >nul 2>&1 
echo test>"%ProgramFiles%\redirectionTest" 
if exist "C:\Users\%username%\AppData\Local\VirtualStore\Program Files\redirectionTest" (
    echo redirected 
) else (
    echo not redirected 
) 

?? ??

或者可能只是:

echo test>"%ProgramFiles%\redirectionTest" 
if exist "%ProgramFiles%\redirectionTest" echo not redirected 

IF EXIST也重定向?

+0

是的,'如果EXIST'也被重定向,我們廣泛使用它。即使是GNU'ls.exe'命令(與我們的應用程序捆綁在一起)也會將目錄的內容列爲真實和虛擬位置的組合內容。所以,儘管現在這個問題已經成爲問題,但我認爲MS在實施過程中做得很好,非常透明。 – Tieske

+0

至少在刪除'VirtualStore'臨時文件和'ProgramFiles'創建它,然後在'VirtualStore'應該工作再次檢查.. – npocmaka

+0

我沒有測試它,因爲我目前的解決方案工作。我對直接訪問VirtualStore猶豫不決的原因是我不確定Program Files是唯一的重定向位置還是更多。我目前的解決方案,捕獲'dir'命令輸出並驗證,將在每個位置上工作。 – Tieske

0

能完成這項工作?

@echo off 
2>nul (
(call) >>"C:\Program Files\file" 
) && (
    rem we have access 
    rem do stuff 
    exit /b 
) 
rem we dont have access 
rem do stuff 

如果不是,我怕我不明白你的問題,所以請解釋什麼沒有工作。

+0

但是不是它會將數據重定向到虛擬存儲並且此操作永不失敗的問題? – npocmaka

+0

我不知道,它工作時,我測試它,但也許這是因爲我使用管理帳戶 – nephi12

1

我試過一些技巧,看看哪些命令被重定向,哪些不是。 最初我嘗試使用操作系統copy命令將臨時文件複製到同一位置的第二個臨時文件,但是在這種情況下都讀取了源代碼並寫入了重定向目標。

這個Lua代碼給出了最終的判決;

function is_writable(file) 
    assert(file) 
    file = dir.normalize(file) 
    local result 
    local tmpname = 'tmptestwritable.deleteme' 
    if fs.is_dir(file) then 
     local file2 = dir.path(file, tmpname) 
     local fh = io.open(file2, 'wb') 
     result = fh ~= nil 
     if fh then fh:close() end 
     if result then 
     -- the above test might give a false positive when writing to 
     -- c:\program files\ because of VirtualStore redirection on Vista and up 
     -- So get a directory listing and check whether it's really there 
     local pipe = io.popen("dir "..fs.Q(file)) 
     local dir_list = pipe:read("*a") 
     pipe:close() 
     result = (nil ~= string.find(dir_list, tmpname, 1, true)) 
     end 
     os.remove(file2) 
    else 
     local fh = io.open(file, 'r+b') 
     result = fh ~= nil 
     if fh then fh:close() end 
    end 
    return result 
end 

經過正規的寫作測試文件「,它的目標文件夾,它簡單的返回內容不重定向dir命令,然後搜索這些內容所使用的臨時名稱。

感謝您的努力!

+0

+1。作爲一種優化,由於'cmd.exe'不是重定向,所以應該可以使用像'io.popen(「if exists ...')而不是搜索輸出,甚至使用'io.popen'進行嘗試寫入文件擺在首位。 –

+0

@Harry只是測試它,你是對的。「如果不存在」被廣泛使用,但只是在應用程序中的這部分打不到,所以我的結論是,它沒不行,我的不好,那簡直就是簡單。 – Tieske

相關問題