如何通过Python实现Windows WMI调用的 impersonation?
我正在用PyWin32在我的Django网页应用中调用WMI,目的是让用户通过网页界面添加打印机到系统中。为此,我使用了win32print.AddPrinterConnection这个方法。
在我自己的用户账户下运行开发服务器时,这一切都很顺利,我可以添加任意多的打印机。不过,最终这个应用需要在Apache服务器下运行,而Apache是以LocalSystem账户身份运行的。
这就带来了两个问题:
- LocalSystem账户没有任何网络权限,而我需要添加的是网络打印机。AddPrinterConnection这个WMI调用最终会进行一个COM调用,但这个调用是被禁止的。
- LocalSystem账户无法访问这些打印机所在的域。访问这些打印机需要一个域账户。
因此,我得出结论,我需要模拟一个域用户来完成这个任务。我已经用这里找到的代码实现了这一点:
http://code.activestate.com/recipes/81402/
这似乎有效,我能确认我成功模拟了调用代码。不幸的是,在模拟之后,我总是会在调用win32print.AddPrinterConnection时遇到这个错误:
Exception Type: error
Exception Value: (2, 'AddPrinterConnection', 'The system cannot find the file specified.')
你知道这可能是什么原因吗?
非常感谢!Pete
更新
我试着玩了一下,发现如果我模拟的用户当前登录到系统,AddPrinterConnection的调用会成功完成。一旦我把那个用户登出,然后再尝试以那个用户身份模拟执行命令,就会出现上面提到的错误。
这到底是怎么回事呢?
1 个回答
0
我不能帮你解决具体的问题,但我知道如果我需要在Windows上用Python处理WMI相关的东西,我一定会选择Tim Golden的Python WMI模块,而不是pywin32。也许你可以在这个模块的文档、食谱或者通过谷歌搜索找到解决办法。