我有一个代码在用户指定的目录中创build文件。 用户可以指向一个他不能创build文件的目录,但是他可以重命名它。
为了testing目的我创build了目录,我们称之为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
我相信这是由于我可以重命名文件夹,所以对我来说是可以改变的。 但它的内容 – 不是。
有谁知道如何编写代码来检查给定的目录,如果当前用户有权限在该目录中创build文件?
简而言之 – 我想检查当前用户是否具有给定文件夹名称的文件创build和文件夹创build权限。
编辑:从“Windows Vistaauthentication”程序的testing案例3号产生这样的代码的需要,其中说:
- 应用程序不得允许最低特权用户将任何文件保存到Windows系统目录以通过此testing用例。
这应该理解为“应用程序可能尝试在Windows系统目录中保存文件,但不应该崩溃失败? 或者说'应用程序在尝试保存文件之前必须执行安全检查?
我是否应该停止打扰,因为Windows Vista本身不会允许最低特权用户保存%WINDIR%中的任何文件?
我最近编写了一个应用程序来通过一套测试,以获得来自微软的ISV身份,我也添加了这种情况。 我理解的方式是,如果用户是最低优先权,那么他将无权写入系统文件夹。 于是我按照伊希迈尔的描述来解决这个问题。 我尝试创建文件并捕获异常,然后通知用户他没有将文件写入该目录的权限。
在我的理解中,最低特权用户将不具有写入这些文件夹的必要权限,如果他有,那么他不是一个最低限度Priveledge用户。
我是否应该停止打扰,因为Windows Vista本身不会允许最低特权用户保存%WINDIR%中的任何文件?
我的想法是? 是。
我不会浪费时间和LOC来检查权限。 Windows中文件创建的最终测试就是创建本身。 其他因素可能会发挥作用(例如现有文件(或更糟糕的是,文件夹)具有相同的名称,磁盘空间和后台进程。这些条件甚至可以在进行初始检查的时间和实际尝试创建文件。
所以,如果我有这样一个场景,我只是设计我的方法不会失去任何数据的情况下,继续尝试创建我的文件,并为用户提供一个选项来更改选定的目录,然后再试一次如果创建失败。
我同意其他答案,做到这一点的方法是尝试创建文件并捕获异常。
不过 ,在Vista上要小心UAC! 例如,请参阅“为什么我的应用程序允许我将文件保存到Vista中的Windows和System32文件夹? :为了支持旧的应用程序,Vista会“假装”创建文件,而实际上它会在当前用户的配置文件下的所谓的虚拟存储库中创建。
为了避免这种情况,您必须通过在.exe的清单中包含相应的命令来具体告诉Vista您不需要管理权限,请参阅上面链接的问题。
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