在python中验证Open函数以使用用户名和密码创建文件

时间:2013-12-14 01:21:51

标签: python python-2.6

当我尝试将文件创建到共享文件夹时,我收到错误权限被拒绝:' tp创建该文件。我知道在该共享文件夹中创建文件的用户名和密码不同。如何在Open功能中使用它。 我使用的Open函数如下所示。

with open(rootDirectory+"\\"+"test.txt", "a") as NewFile:
NewFile.write(filedata);

谢谢,

1 个答案:

答案 0 :(得分:2)

没有神奇的方法可以改变您open为您执行此操作的方式。您必须以某种方式与Win32安全系统进行交互。


第一个选项是impersonate the other user。然后,您所做的任何事情 - 包括open或其他任何事情 - 就像您是该用户一样。如果您有pywin32,则可以使用其win32security包装器执行此操作。您应该阅读LogonUserLogonUserExImpersonateLoggedOnUser上的MSDN文档,了解其工作原理。但它看起来像这样:

user = LogonUser(username, None, password, 
                 LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT)
try:
    ImpersonateLoggedOnUser(user)
    with open(rootDirectory+"\\"+"test.txt", "a") as NewFile:
        NewFile.write(filedata)
finally:
    RevertToSelf()
    CloseHandler(user)

当然,您可能需要一些错误处理,并且您可能希望创建一些上下文管理器包装器而不是使用finally块,依此类推。再次,阅读文档以决定要调用哪个函数以及要传递哪些参数。但这应该让你开始。


作为对此的变体,您可以像其他用户一样运行子进程。这不需要模拟(您可能没有SeImpersonatePrivilege权限)。如果你需要这样做,那么移植到Unix也要容易得多。有关详细信息,请参阅CreateProcessWithLogon

执行相同操作的一种更简单的方法是不从Python执行,而是从shell执行。使用RunAs命令启动脚本,而不是直接启动它。或者,如果您不能这样做,请将需要以另一个用户身份运行的部分移动到另一个脚本中,然后subprocess RunAs命令启动它。


或者,如果您有足够的权限(或者可以提升为获取这些权限的管理员权限),您只需更改文件上的ACL即可获得您没有的写入权限。在某些情况下,只需执行os.chmod即可,但通常不会;你将不得不再次pywin32本机Win32 API。