2009-01-16 20 views
6

我有一个代码在用户指定的目录中创建文件。用户可以指向他无法创建文件的目录,但他可以重命名它。如何检查是否可以在MS XP/Vista上的给定目录内创建文件?

我为测试目的创建了目录,我们称之为C:\foo

我有以下权限C:\foo

  • 遍历目录/执行文件
  • 删除子文件夹和文件
  • 删除
  • 读取权限
  • 更改权限
  • 取得所有权

我没有任何下列权限到C:\foo

  • 完全控制
  • 文件创建
  • 文件夹创建

我曾尝试以下方法,到目前为止:


os.access('C:\foo', os.W_OK) == True

st = os.stat('C:\foo')
mode = st[stat.ST_MODE]
mode & stat.S_IWRITE == True

我相信这是由于我可以重命名文件夹,所以它对我而言是可以改变的。但它的内容 - 不是。

有谁知道我该如何编写代码来检查给定的目录,如果当前用户有权限在该目录中创建文件?

简单 - 我要检查,如果当前用户具有文件创建文件夹创建权限指定文件夹名称。

编辑:需要从“Windows Vista认证”计划,从测试情况下,没有3出现这样的代码的规定:

  1. 应用程序一定不能让最低权限的用户保存任何文件到Windows系统目录以便通过这个测试用例。

这应该被理解为“应​​用程序可以尝试保存文件在Windows系统目录中,但不应该在失败时崩溃?或者说'应用程序在尝试保存文件之前必须执行安全检查?'

我是否应该停止打扰,因为Windows Vista本身不会允许最低特权用户保存%WINDIR%中的任何文件?

回答

4

我最近编写了一个应用程序来通过一组测试以获得来自Microsoft的ISV状态,并且我还添加了该条件。 我理解它的方式是,如果用户是最低优先权,那么他将无权写入系统文件夹。所以我按照伊施迈尔所描述的方式处理了这个问题。我尝试创建文件并捕获异常,然后通知用户他没有将文件写入该目录的权限。

根据我的理解,最低特权用户将没有写入这些文件夹的必要权限,如果他有,那么他不是最低优先级用户。

我是否应该停止打扰,因为Windows Vista本身不会允许最低特权用户保存%WINDIR%中的任何文件?

在我看来?是。

+0

谢谢。我会遵循你和Ishmaeels的建议。 – Abgan 2009-01-16 12:41:10

4

我不会浪费时间和LOC检查权限。 Windows中文件创建的最终测试是创建本身。其他因素可能会发挥作用(例如具有相同名称,磁盘空间和后台进程的现有文件(或更糟糕的文件夹))。这些条件甚至可以在进行初始检查的时间和实际尝试创建文件的时间之间改变。所以,如果我有这样的场景,我会设计我的方法,以防万一失败时失去任何数据,继续并尝试创建我的文件,并为用户提供一个选项来更改所选内容目录,如果创建失败,请重试。

+0

当前应用程序不会在这种情况下崩溃,只显示弹出式操作失败。但我真正需要的是通过“Windows Vista认证”测试 - 请参阅编辑的问题。 – Abgan 2009-01-16 12:30:27

+0

我相信测试用例意味着应用程序不应该包含权限提升漏洞或者试图绕过标准安全性来允许所述操作。除此之外,目录安全应该是操作系统的责任。 – Ishmaeel 2009-01-16 12:55:24

3

我同意其他答案,这样做的方法是尝试创建文件并捕获异常。

但是,在Vista上要小心UAC!例如参见"Why does my application allow me to save files to the Windows and System32 folders in Vista?":为了支持旧的应用程序,Vista会“假装”创建文件,而实际上它会在当前用户的配置文件下的所谓的虚拟存储库中创建它。

为了避免这种情况,您必须通过在.exe的清单中包含相应的命令来明确告诉Vista您不需要管理权限,请参阅上面链接的问题。

+0

感谢您的警告,但有问题的应用程序已经要求执行级别设置为'asInvoker',所以我不应该碰到UAC :-) – Abgan 2009-01-16 13:01:24

3
import os 
import tempfile 

def can_create_file(folder_path): 
    try: 
     tempfile.TemporaryFile(dir=folder_path) 
     return True 
    except OSError: 
     return False 

def can_create_folder(folder_path): 
    try: 
     name = tempfile.mkdtemp(dir=folder_path) 
     os.rmdir(name) 
     return True 
    except OSError: 
     return False 
相关问题