Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows上的Python 3.5-覆盖其他用户创建的文件;PermissionError:[Errno 13]“错误”;_Windows_Python 3.x_File Permissions_Windows Server 2008 R2_Overwrite - Fatal编程技术网

Windows上的Python 3.5-覆盖其他用户创建的文件;PermissionError:[Errno 13]“错误”;

Windows上的Python 3.5-覆盖其他用户创建的文件;PermissionError:[Errno 13]“错误”;,windows,python-3.x,file-permissions,windows-server-2008-r2,overwrite,Windows,Python 3.x,File Permissions,Windows Server 2008 R2,Overwrite,我正在编写一个python脚本来获取一个文件,并根据第一个文件生成多个新文件。这个想法是,如果第一个脚本被更新,我或我的其他同事可以在我们的服务器(运行WindowsServer2008R2)上运行该脚本,并将更改传播到其他文件 然而,当涉及到windows文件权限时,我们遇到了一个障碍 脚本创建文件时,将使用以下权限创建文件: 运行脚本的用户:完全控制、读取、读取和执行、修改、写入 管理员组:完全控制、读取、读取和执行、修改、写入 系统:完全控制、读取、读取和执行、修改、写入 用户组:读取、

我正在编写一个python脚本来获取一个文件,并根据第一个文件生成多个新文件。这个想法是,如果第一个脚本被更新,我或我的其他同事可以在我们的服务器(运行WindowsServer2008R2)上运行该脚本,并将更改传播到其他文件

然而,当涉及到windows文件权限时,我们遇到了一个障碍

脚本创建文件时,将使用以下权限创建文件:

  • 运行脚本的用户:完全控制、读取、读取和执行、修改、写入
  • 管理员组:完全控制、读取、读取和执行、修改、写入
  • 系统:完全控制、读取、读取和执行、修改、写入
  • 用户组:读取、读取和执行
我观察到以下行为:

  • 当我或我的老板运行脚本时,如果没有子文件存在,脚本将正常运行并创建新文件
  • 当我或我的上司运行脚本时,子文件存在,并且是由运行脚本的同一人先前运行时创建的,脚本运行正常并覆盖现有文件
  • 当我运行脚本时,子文件存在,但由运行脚本的老板创建,脚本失败,权限被拒绝
  • 当我的上司运行脚本时,子文件存在,但是由我运行脚本创建的,脚本失败,权限被拒绝
根据控制面板中的用户列表,我和我的老板都是管理员,所以根据权限应该没有问题,但我们仍然会得到错误

我做错了什么

是否有方法更改脚本中的文件权限,或在脚本写入之前删除文件

代码如下:

#All variables are set above
#They have no bearing on file permissions other than setting the paths to read/write
fileIn = io.open(filePath, mode='r')
print ("Reading " + filePath)
for line in fileIn:
    for x in range(0,5):
        contentsOut[x] += line
        if line[:len(seekLine)] == seekLine:
            contentsOut[x] += catSection.format(catStrings[x])
            print ("written category string")
fileIn.close()
for x in range(0,5):
    fileOutName = basePath + fileFormat.format(catStrings[x])
    fileOut = io.open(fileOutName, mode='wt', encoding='utf_8',newline='\r\n')
    print ("Writing " + fileOutName)
    fileOut.write(contentsOut[x])
    fileOut.close()
    print ("Write finished")
编辑: 后来我改变了算法,在写之前删除了这个文件,它给出了更奇怪的结果

由于某种原因,如果存在的文件是我创建的,我的老板无法通过运行脚本删除它们,并且当他点击操作系统。删除(fileOutName)行时,被授予
权限错误:[WinError 5]访问被拒绝

但是,我没有任何问题,并且可以很好地运行脚本,无论是我还是我的老板创建了文件

在我研究解决方案之前,我真的需要知道为什么会发生这种情况。 我还被告知,应该只允许管理员这样做,所以如果他们不碍事,当前的文件权限看起来很好

fileIn = io.open(filePath, mode='r')
print ("Reading " + filePath)
for line in fileIn:
    for x in range(0,noOfOutFiles):
        contentsOut[x] += line
        if line[:len(seekLine)] == seekLine:
            contentsOut[x] += catSection.format(catStrings[x])
            print ("written category string")
fileIn.close()
for x in range(0,noOfOutFiles):
    fileOutName = basePath + '\\' + scopePath + '\\' + typePath + '\\' + fileFormat.format(catStrings[x])
    if os.path.exists(fileOutName):
        print ("Deleting " + fileOutName)
        os.remove(fileOutName)
    print ("Writing " + fileOutName)
    fileOut = io.open(fileOutName, mode='wt', encoding='utf_8',newline='\r\n')
    fileOut.write(contentsOut[x])
    fileOut.close()
    print ("Write finished")
编辑:我在“.”(当前目录)和其中一个生成的文件上运行了icacls,结果如下:

当前目录:

NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
BUILTIN\Administrators:(I)(OI)(CI)(F)
BUILTIN\Users:(I)(OI)(CI)(RX)
BUILTIN\Users:(I)(CI)(AD)
BUILTIN\Users:(I)(CI)(WD)
SERVERNAME\Me:(I)(F)
CREATOR OWNER:(I)(OI)(CI)(IO)(F)
文件:


我的上司没有被特别列出,但我是,这很奇怪,我们都不记得添加了该权限。

如果您使用Win32安全模型,您将可以完全控制为不同组设置文件权限


但你知道为什么会这样吗?不管权限如何,这种行为似乎很奇怪。在其中创建文件的文件夹的权限是多少?据我所知,在Windows中,它继承父文件夹的权限。您可能需要检查一下。如果启用了UAC,那么您的管理员令牌将分为两部分,一部分是受限的,另一部分是非受限的。无限制令牌也称为“提升”令牌,因为它具有“高”强制完整性级别。检查
whoami/groups/fo列表
。如果命令提示符不是“以管理员身份运行”,则应该看到BUILTIN\Administrators设置为“仅用于拒绝的组”。这意味着授予管理员访问权限的安全描述符DACL中的ACE不适用于您的非提升令牌。请注意,目录可以授予
文件\u DELETE\u子
,这隐式允许具有此权限的用户删除文件和子目录。看起来你对这个目录有这样的权利,但是你的老板没有。选中
icacls dirpath
以列出目录DACL中的ACE。@eryksun问题是我的老板可以手动删除tehm,方法是进入资源管理器并单击delete。只是脚本在运行时无法删除它们。@eryksun添加了icacls的结果,很奇怪,您创建了目录吗
dir/q
显示所有者。
创建者所有者
有一个继承的ACE,它授予文件(对象继承)和目录(容器继承)的创建者完全控制权。因为你完全控制了这个目录,你可以删除你老板创建的文件。至于资源管理器,它提升了管理员删除文件的权限,但是应该有一个请求管理员权限的提示。
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(RX)
SERVERNAME\Me:(I)(F)
dacl = win32security.ACL ()
dacl.AddAccessAllowedAce (win32security.ACL_REVISION, con.FILE_GENERIC_READ, everyone)
dacl.AddAccessAllowedAce (win32security.ACL_REVISION, con.FILE_GENERIC_READ | con.FILE_GENERIC_WRITE, user)
dacl.AddAccessAllowedAce (win32security.ACL_REVISION, con.FILE_ALL_ACCESS, admins)