4

質問

CF をサービスとして実行する場合と CF をコンソール モードで実行する場合のアクセス許可の違いは何ですか?

歴史

Word.Application の COM オブジェクトを作成し、それらを使用して DOC を PDF に変換するコードがあります。しかし、CF 10u8 (64b) に移行すると、ロジックが壊れました。私はインターウェブをチェックし、 java.library.path={} 値、許可、およびそれを機能させるためのすべての可能なヒントを変更して遊んだ。しかし、成功しませんでした。jintegra\bin\ntvinv.dll が 32b 環境で動作するように設計されていることを確認するエントリが Adob​​e Bug Baseに見つかりました。

そこで、VB スクリプト モードを使用して CF コードを VB スクリプトに変換し、DOC から PDF への変換を行うことにしました。

問題

VB Script のコードは美しく、必要なことをすぐに実行してくれます。<cfexecute> からこの .vbs を呼び出すまでは問題ないようです。それは永遠に処理され、タイムアウトし、何も表示されません+タスクマネージャーにWINWORD.exeの放棄されたプロセスがあります。

引数をバッチファイルに書き込んで呼び出してみました。今回はすぐに実行されますが、何も起こりません。ログを確認したところ、

Microsoft VBScript ランタイム エラー: オブジェクトが必要です: 'wdocs.Open(...)

コマンドプロンプトからバッチファイルを呼び出したところ、エラーなしで実行されました。My DOC -> PDF 変換が完了しました。

ということで、今回はColdFusionサービスの「ログオン...」権限を「ローカルシステムアカウント」からシステムの管理者ユーザーアカウントに変更して起動しました。私は、

ローカル コンピューター上の CF 10 アプリケーション サーバー サービスが開始され、その後停止しました。一部のサービスは、他のサービスまたはプログラムによって使用されていない場合、自動的に停止します

それで、そこに道の終わり。「デスクトップとの対話をサービスに許可する」オプションで遊んでみました。しかし、何も改善されませんでした。

最後に、bin\cfstart.bat ファイルから CF を実行しようとしました。coldfusion.exe -start -consoleがあります。コマンドウィンドウが表示され、CF が起動しました。今度は <cfexecute> が機能し、変換が行われました。エラーは見られません。なぜこれが起こっているのか、私は困惑しています。システム アカウント (ログオンしたユーザー) を使用してサービスとして実行した場合と、同じユーザー アカウントを使用してコンソールとして実行した場合の違いは何ですか? 私は理解するために何が欠けていますか?

デバッグ

サーバー上に LOCAL ユーザー アカウントを作成し、'Log on As...' と同じアカウントでシステムにログインすることの両方でそれを使用しました。どちらの場合も、上記と同じ話です。

許可の問題だと思いますが、どこで、なぜこれが発生しているのかわかりませんでしたか? 特に、なぜコンソール モードではなくサービス モードなのですか?


: VBS に移動する前に、<cfdocument format="pdf" ... > を使用してみましたが、DOC の特定のフォーマットが原因で例外がスローされます。したがって、現時点ではオプションではありません。

クレジット: VBScript の私のコードはここから派生しています

アップデート

テストできるコードは次のとおりです。

コマンド ライン コード

/c <pathToTheScriptFile>/doc2pdf.vbs <absolutePathTo>aWordDocument.doc o/:<absolutePathTo>finalPDFDocument.pdf

doc2pdf.vbs は 2 つの引数を取ります。1 つ目は wordDocument 名 (パス付き) で、2 つ目はオプションの PDFDocument 名です。オプションの引数が渡されない場合、wordDocument と同じ名前が PDFDocument に与えられます。

ColdFusion コード

<cfexecute name="c:\windows\system32\cmd.exe" arguments="#commands#" outputFile="output.txt" errorFile="error.txt" timeout="20"/>

または、Java ランタイム オブジェクトも使用してみます。

<cfscript>
    objJR  = createObject("java", "java.lang.Runtime").getRuntime();
    result = objJR.exec(commands);
    writeDump(result);
</cfscript>

ローカル マシンで実行するには、次のものが必要です。

  • 「PDF として保存」プラグインが添付された MS Word 2007 以降のインストール。
  • VBScript (ここから入手してください)
  • CF 10. Update 8 を使用しています。これは、どの更新レベルでも機能します。
4

3 に答える 3

4

私は自分の問題に対する答えを見つけました。

基本に戻って、関連するすべてのコンポーネントから問題を確認しようとしました。

  1. CF
  2. VB スクリプト コード
  3. ワード アプリケーション COM
  4. Windows 2008 R2

Word COMが関与していない場合、CFはスクリプトを正常に実行しているだけです。ということで、基本的にアクセスとは関係ないなと感じました。

VB スクリプト コードは、COMMAND ウィンドウから実行する場合は問題ありませんが、サービス (CF サービス) から呼び出す場合は問題ありません。したがって、問題として VB Script も除外しました

Word アプリケーション COM - VB Script と同じ

Windows 2008 R2 - 犯人を逮捕。

理由

これは、Windows 2008 サーバーのバグによるものです。ユーザープロファイルと関係があります。私が自分のサービスにログオンすると言っても、作成された COM は常に LOCAL SYSTEM アカウントを使用していました。私はProc Monでこれを見つけました。

その点から始めて、2008 年の MS フォーラムと COM オブジェクトに関連する問題を調べました。

多くの記事がありますが、明らかに私のものと同じ問題がありましたが、Excel に問題がありました。

答えは - 「オフィス オートメーション (スクリプトおよび非ウィンドウ ベースの操作によるアクセス) の場合、システム プロファイルに「デスクトップ」という名前のフォルダが必要です。」

詳細はこちら。(「H・オガワ」で検索)

繰り返しますが、ハードワークとスタックオーバーフローの話は報われます。:)

助けてくれてありがとう。

于 2013-04-05T10:49:06.150 に答える