如何通过Python实现Windows WMI调用的 impersonation?

0 投票
1 回答
1470 浏览
提问于 2025-04-15 14:32

我正在用PyWin32在我的Django网页应用中调用WMI,目的是让用户通过网页界面添加打印机到系统中。为此,我使用了win32print.AddPrinterConnection这个方法。

在我自己的用户账户下运行开发服务器时,这一切都很顺利,我可以添加任意多的打印机。不过,最终这个应用需要在Apache服务器下运行,而Apache是以LocalSystem账户身份运行的。

这就带来了两个问题:

  1. LocalSystem账户没有任何网络权限,而我需要添加的是网络打印机。AddPrinterConnection这个WMI调用最终会进行一个COM调用,但这个调用是被禁止的。
  2. 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。也许你可以在这个模块的文档、食谱或者通过谷歌搜索找到解决办法。

撰写回答