我的情况是用户可以配置某些文件的目标位置(下载并安装以供应用程序使用)。有两个配置的位置,系统位置和用户位置。该应用程序是一个(基于Lua)命令行工具。
在安装之前,我通过编写临时文件并再次删除它来检查可写入的位置。如果失败,我将使用提升的权限重新启动相同的命令,这允许管理员安装,但不允许由普通用户安装。
问题:系统位置默认位于C:\Program Files\
内,受保护(不是问题)并重定向(这是问题)到C:\Users\<name>\AppData\VirtualStore\Program Files\...
目录。
由于这种重定向测试成功,因此安装的东西没有提升权限。因此最终在VirtualStore
,而不是得到用户没有所需特权的错误。
问题:那么如何在不调用重定向到VirtualStore的情况下测试实际的C:\Program Files\
是否可写?
答案 0 :(得分:1)
我尝试了一些技巧来查看哪些命令被重定向,哪些没有。
最初我尝试使用os 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
命令,该命令只返回没有重定向的内容,然后在此内容中搜索所使用的临时名称。
答案 1 :(得分: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
是否也被重定向?
答案 2 :(得分: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
如果没有,我恐怕我不明白你的问题,所以请解释一下它的工作原理。