验证' C:\ Program Files \'是可写的

时间:2013-11-28 15:13:22

标签: windows batch-file command-line lua command-prompt

我的情况是用户可以配置某些文件的目标位置(下载并安装以供应用程序使用)。有两个配置的位置,系统位置和用户位置。该应用程序是一个(基于Lua)命令行工具。

在安装之前,我通过编写临时文件并再次删除它来检查可写入的位置。如果失败,我将使用提升的权限重新启动相同的命令,这允许管理员安装,但不允许由普通用户安装。

问题:系统位置默认位于C:\Program Files\内,受保护(不是问题)并重定向(这是问题)到C:\Users\<name>\AppData\VirtualStore\Program Files\...目录。 由于这种重定向测试成功,因此安装的东西没有提升权限。因此最终在VirtualStore,而不是得到用户没有所需特权的错误。

问题:那么如何在不调用重定向到VirtualStore的情况下测试实际的C:\Program Files\是否可写?

3 个答案:

答案 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

如果没有,我恐怕我不明白你的问题,所以请解释一下它的工作原理。