当我尝试将文件创建到共享文件夹时,我收到错误权限被拒绝:' tp创建该文件。我知道在该共享文件夹中创建文件的用户名和密码不同。如何在Open功能中使用它。 我使用的Open函数如下所示。
with open(rootDirectory+"\\"+"test.txt", "a") as NewFile:
NewFile.write(filedata);
谢谢,
答案 0 :(得分:2)
没有神奇的方法可以改变您open
为您执行此操作的方式。您必须以某种方式与Win32安全系统进行交互。
第一个选项是impersonate the other user。然后,您所做的任何事情 - 包括open
或其他任何事情 - 就像您是该用户一样。如果您有pywin32
,则可以使用其win32security
包装器执行此操作。您应该阅读LogonUser
,LogonUserEx
和ImpersonateLoggedOnUser
上的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。