Я использую PyWin32 для вызовов WMI в систему на python из моего веб-приложения django. Моя цель — позволить пользователям добавлять принтеры в систему через веб-интерфейс. Для этого я использую win32print.AddPrinterConnection.
Это хорошо работает, когда сервер разработки работает под моей учетной записью пользователя. Я могу добавить все принтеры, которые захочу. Однако, в конце концов, это нужно будет запускать под apache, который запускается как учетная запись LocalSystem.
Это проблематично по двум причинам:
- Учетная запись LocalSystem вообще не имеет сетевых привилегий, а это сетевой принтер. Вызов WMI AddPrinterConnection в конечном итоге делает вызов COM, который будет запрещен.
- Учетная запись 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 завершается успешно, если пользователь, которого я выдаю за себя, в настоящее время вошел в систему. Как только я выхожу из системы этого пользователя и повторяю команду, выдавая себя за этого пользователя, я получаю указанную выше ошибку.
Что здесь происходит?