COMコンポーネントを使用して電子メールを送信するためのCOMコンポーネントを使用する32ビットレガシーVB6アプリケーションがあります。要件は、電子メールがOutlookの[送信済みアイテム]フォルダに表示される必要があることです。さらに悪いことに、アプリケーションは通常のセキュリティ、警告、または確認メッセージをポップアップすることはできません。32ビットVB6アプリケーションは、ユーザーにプロンプトを表示せずに電子メールを送信するために64ビットOutlookを自動化する必要があります
このアプリケーションは、64bit Officeが登場するまで問題なく動作していました。 32bitプロセスが64bit Outlookを自動化する方法はありません。 CCW (.NET COMのふり)
で実行 .NET WCFクライアントとCOMコンポーネントアウトスワップ:私が思いついた
アイデアは以下の通りでした
このCOMコンポーネントは、netTcpBindingを使用して、64ビットプロセスとして実行されているWCF サービスを呼び出します。 (ローカルシステムとして実行されている)
WCFサービスは、ユーザーとして、64ビット コンソールアプリケーションを起動し、 は、電子メールを送信するために拡張MAPI ライブラリを使用しています。
第三ステップの理由は二つある:あなたが電子メールを送信するよう指示 場合
MAPIは、確認を求めます。 拡張MAPIではありません。つまり、 は、Microsoftの正しい64ビット ヘッダーファイルを使用してC++拡張 MAPIライブラリをコンパイルし、.NETコードから を呼び出す必要がありました。 (緩く使用される用語)間違ったレジストリハイブ 負荷のWCF 結果でユーザを偽装
。つまり、 拡張MAPIが のプロファイルをHKCUからロードしようとすると、失敗します。この は、本質的に正しいユーザーを「RunAs」するための新しいプロセスを立ち上げなければならないことを意味しました。
これは、すべて実際に、実際に動作しますが、私は次のために、いくつかの説明が必要です
私はそれは、コマンドラインパラメータに必要なすべての情報をコンソールアプリケーションを実行すると、MAPIがログインに失敗しました。しかし、フォームのOnLoad()メソッドとまったく同じコードを持つ1つのFormを持つWindowsアプリケーションと同じコードをコンパイルすると、それは成功します。なぜ誰かが説明できますか?現在ユーザ(ないLOCAL SYSTEM)でログインして、私は正しいトークンを取得するには、以下のなかったWCFサービスから「リサイズ」アプリケーションを実行するには
:
sessionID = (int)WTSGetActiveConsoleSessionId();
ret = WTSQueryUserToken(sessionID, out currentToken);
は、この周りに方法はありますか?確かに、WCFの組み込み偽装を使用する方が良いでしょう。
64ビットバージョンのOfficeを選択すると問題が発生することがあります。互換性が問題である場合は、32ビット版を使用してください。 64ビット版は、非常に大きな文書(特にスプレッドシート)を扱う場合にのみ利点があります。 64は必ずしも32より良いとは限りません。http://blogs.technet.com/b/office2010/archive/2010/02/23/understanding-64-bit-office.aspxを参照してください: "これらの理由から、より良い互換性のために32ビット版のOffice 2010を64ビットWindowsオペレーティングシステムで使用することも可能です。詳細はこちらhttp://msdn.microsoft.com/en-us/library/ee691831%28office.14%29.aspx –
ユーザーが何を実行しているかを常に選択するとは限りません。 – Joe
ジョーが正しいです。私たちのユーザーは、どんなOSやバージョンのOfficeを使用していても、販売店から事前にコンピュータをインストールしています。我々はそれを支配していない。 – CSharpDevCT