PyWin32 を使用して、django Web アプリケーションから Python でシステムへの WMI 呼び出しを行っています。私の目標は、ユーザーが Web インターフェイス経由でシステムにプリンターを追加できるようにすることです。これを行うために、win32print.AddPrinterConnection を使用しています。
これは、私のユーザーアカウントで開発サーバーを実行するとうまくいきます。必要なすべてのプリンターを追加できます。ただし、最終的には、これは LocalSystem アカウントとして実行される apache の下で実行する必要があります。
これには、次の 2 つの理由で問題があります。
- LocalSystem アカウントにはネットワーク特権がまったくなく、これはネットワーク プリンターです。AddPrinterConnection WMI 呼び出しは、最終的に許可されない COM 呼び出しを行います。
- LocalSystem アカウントには、これらのプリンターが存在するドメインへのアクセス権がありません。アクセスするにはドメイン アカウントが必要です。
したがって、このタスクを実行するにはドメイン ユーザーを偽装する必要があるという結論に達しました。ここにあるコードを使用してそうしました:
http://code.activestate.com/recipes/81402/
呼び出しコードの偽装に成功したことを確認できるため、これは機能しているようです。残念ながら、なりすましの後、常に win32print.AddPrinterConnection API 呼び出しからこのエラーが発生します。
Exception Type: error
Exception Value: (2, 'AddPrinterConnection', 'The system cannot find the file specified.')
これがなぜなのか分かりますか?
本当にありがとう!ピート
アップデート
遊んでみると、偽装しているユーザーが現在システムにログインしている場合、AddPrinterConnection API 呼び出しが正常に完了することに気付きました。そのユーザーをログアウトし、そのユーザーになりすましてコマンドを再試行すると、上記のエラーが発生します。
ここで何が起こっているのですか?