Олицетворение Windows для вызовов WMI через python?

Я использую PyWin32 для вызовов WMI в систему на python из моего веб-приложения django. Моя цель — позволить пользователям добавлять принтеры в систему через веб-интерфейс. Для этого я использую win32print.AddPrinterConnection.

Это хорошо работает, когда сервер разработки работает под моей учетной записью пользователя. Я могу добавить все принтеры, которые захочу. Однако, в конце концов, это нужно будет запускать под apache, который запускается как учетная запись LocalSystem.

Это проблематично по двум причинам:

  1. Учетная запись LocalSystem вообще не имеет сетевых привилегий, а это сетевой принтер. Вызов WMI AddPrinterConnection в конечном итоге делает вызов COM, который будет запрещен.
  2. Учетная запись LocalSystem не имеет доступа к домену, в котором находятся эти принтеры. Для доступа им требуется доменная учетная запись.

Поэтому я пришел к выводу, что для выполнения этой задачи мне нужно олицетворять пользователя(ей) домена. Я сделал это, используя код, найденный здесь:

http://code.activestate.com/recipes/81402/

Кажется, это работает, поскольку я могу убедиться, что я успешно выдал себя за вызывающий код. К сожалению, после олицетворения я всегда получаю эту ошибку при вызове API win32print.AddPrinterConnection:

Exception Type: error 
Exception Value: (2, 'AddPrinterConnection', 'The system cannot find the file specified.')

У вас есть идеи, почему это может быть?

Огромное спасибо! Пит

Обновить

Играя, я заметил, что вызов API AddPrinterConnection завершается успешно, если пользователь, которого я выдаю за себя, в настоящее время вошел в систему. Как только я выхожу из системы этого пользователя и повторяю команду, выдавая себя за этого пользователя, я получаю указанную выше ошибку.

Что здесь происходит?


person slypete    schedule 23.09.2009    source источник


Ответы (1)


Я не могу помочь с конкретной проблемой, но я знаю, что если бы мне пришлось работать с WMI в Windows, с Python, я бы определенно обратился к Модуль Python WMI вместо pywin32. Возможно, в документации/поваренной книге или поиске в Google с помощью этого модуля вы сможете найти решение.

person Peter Hansen    schedule 04.12.2009