問題タブ [dcom]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - c# で記述された Windows サービス (Windows 2003 サーバー) から DCOM オブジェクトにアクセスできませんが、コンソール アプリケーションとしてホストされている場合はオブジェクトにアクセスできます。
DCOM オブジェクト (オブジェクトの名前は Toolkit オブジェクト) を介して会計システムに書き込むアプリケーションを C# で作成しました。このアプリケーションが Windows 2003 で Windows サービスとしてホストされている場合、サービスを実行しているユーザー ID に必要なすべてのアクセス権があるにもかかわらず、サービスは DCOM オブジェクトを開くことができません。
コンソール アプリを使用して同じアプリケーションをホストすると、正常に動作します。
DCOMCNFG を介して DCOM オブジェクトへのアクセス権を微調整しようとしましたが、何も機能していないようです。
c++ - DCOMクライアントがSendMessageの呼び出しをロックしているのはなぜですか?
XPで実行しています。呼び出しを呼び出しCoInitializeEx(NULL, COINIT_MULTITHREADED)
、(ローカル)DCOMオブジェクトをロードし、DCOMオブジェクトがイベントを送り返すことができるようにイベントインターフェイスをアタッチするクライアントがあります。クライアントはメモ帳によく似ており、イベントメッセージを表示するためにクライアント領域をカバーする複数行のテキストボックスがあります。ロックアップを作成する呼び出しは次のとおりです。
- クライアントが
p->DoStuff()
DCOMオブジェクトを呼び出します。 - DCOMオブジェクトは
c->DoStuffEvent()
、処理中にクライアントを呼び出しますDoStuff()
。 - クライアント
EM_REPLACESEL
は子テキストボックスにメッセージを送信して、「何かが起こっています」と表示させます
クライアントはでフリーズしますSendMessage(EM_REPLACESEL)
。クライアントのへの呼び出しp->DoStuff()
はメインスレッドでSendMessage(EM_REPLACESEL)
実行されますが、は別のスレッドで実行されます。これは問題と関係があると確信しています。
誰かがロックの原因と私がそれを回避する方法を説明できますか?クライアントオブジェクトとDCOMオブジェクトは私がMSVC/ATLでコーディングしているので、必要に応じて両方を変更できます。
dcom - OPC と DCOM の関係
OPC と DCOM の間のリンクを把握しようとしています。私はここにある 4 つのチュートリアルをすべて見てきましたが、OPC とは何かについては良い感触があると思いますが、チュートリアルの 1 つ (3 番目の 35 秒) で、ナレーターは OPC は DCOM に基づいていると述べていますが、私はそうではありません2つが実際にどのようにリンクされているかを理解してください。私の混乱は、私の教授が「DCOM の代わりに OPC を展開する方法と場所、およびその逆をどのように展開しますか?」という質問に端を発しています。彼の質問は、私の研究が示唆するほど、この 2 つは関連していないように思われます。教授が尋ねた質問に答えてくれる人を探しているわけではありません。OPC と DCOM の関係を知りたいだけです。具体的には、1.) 1 つは常に他の 2 に基づいているかどうかを知りたいです。
vb6 - ユーザーがログオンしない限り、VB6アプリがスケジュールされたタスクとして実行されない
これについて何か助けていただければ幸いです。それはトリッキーなものかもしれません。:)
問題
- スケジュールされたタスクとして設定された VB6 アプリケーションがあります。毎回起動
CreateObject()
しますが、ユーザーがコンピューターにログオンしていない場合、実行時に失敗します。 - これを引き起こす原因についての情報を探しています。私の主な疑いは、一部の Windows API が失敗することです。
キーポイント
- Windows 2000、2003、2008、Vistaで動作確認済み。
- アプリケーションは、スケジュールされた時刻にユーザー X として実行され、Windows タスク スケジューラによって実行されます。
- 毎回実行されます。申し込み開始!
- ユーザー X が RDP 経由でログオンしている場合、完全に実行されます。(ユーザーは接続する必要はなく、ログオンするだけであることに注意してください)
- ユーザー X がコンピューターにログオンしていない場合、アプリケーションは失敗します。
故障箇所
CreateObject()
アプリケーションの一部でもある DCOM オブジェクトをインスタンス化するために使用すると、アプリケーションが失敗します。- DCOM オブジェクトは、起動時に (グローバルに/.bas ファイルの上に) .dll 参照を宣言し、小さな起動関数を実行します。失敗は、おそらく .dll 宣言のいずれかで、起動中に発生する必要があります。
考え
グーグルで調べた後、最初の疑いはMAPIに向けられました。私が見ることができたものから、MAPI はユーザーがログオンする必要がありました。アプリケーションには MAPI 参照があります。しかし、すべての MAPI 参照を削除しても、まだ機能しません。
ユーザーがログオンしている場合の違いは何ですか? レジストリ マッピング? 環境?Explorer.exe が実行されています。
ユーザーとしてアプリケーションを実行するとき、ユーザーはログオンしていませんか?
どのような情報が役立ちますか?
- 決定的な答えは本当に素晴らしいでしょう。
- ユーザーがログオンしているかどうかに応じて異なる動作をする可能性のある VB6 機能/Windows API に関する情報は、決定的に役立ちます。
- 同様の経験が私を正しい方向に導くかもしれません。
- これをデバッグするためのヒント。
asp.net - Windows 2003 サーバーで Web サイトを使用した COM オブジェクトのアクティブ化が機能しない
私は、ASP.NET Web アプリケーションを使用して COM オブジェクトをアクティブ化および起動するのに非常に苦労しました。aspx Web サイトには、この COM オブジェクト (実際のアプリケーション - CAD ソフトウェア) への参照を含むコード ビハインド ファイルがあります。必要に応じて、VB コードはアプリケーションを作成 (または起動) します。
完全なセットアップは、Win-XP (32 ビット) 環境で、Visual Studio を使用したデバッグ時と、外部ユーザーが (XP の IIS サーバーを介して) Web サイトにアクセスした場合の両方で機能します。しかし、Win-2003 (32 ビット) IIS サーバーでホストされている場合、同じアプリケーションはアクティブ化されません。「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。
Win-XP でセットアップした方法は、ASP ユーザーとインターネット ゲスト ユーザーのアクセス許可を DCOM 構成の COM オブジェクトに付与することでした。Windows ファイアウォールが有効になっているため、exe ファイル (COM オブジェクトに関連付けられている) を例外に追加します。リスト。Win-2003 サーバーの場合、COM オブジェクトに Network Service 権限を追加します。しかし、セットアップはまったく機能していないようです。
何が足りないのか、アプリケーションを起動する方法がわかりません。どんな助けでも大歓迎です。
c# - C# .NET 3.5 サーバーへの DCOM 呼び出しを行う際に、クライアント ID を確実に確認するにはどうすればよいですか?
C# .NET 3.5 を使用するように書き換えている古い Win32 C++ DCOM サーバーがあります。クライアント アプリケーションは、リモートの Windows XP マシン上にあり、C++ で記述されています。これらのクライアントは変更しないでおく必要があるため、新しい .NET オブジェクトにインターフェイスを実装する必要があります。
これは完了しており、インターフェイスの実装に関しては正常に機能しており、古いクライアントから新しい .NET オブジェクトへのすべての呼び出しが正しく行われています。
しかし、DCOM クライアントから呼び出し元のユーザーの ID を取得するのに問題があります。DCOM 呼び出しを扇動したユーザーを特定するために、サーバー上に次のコードがあります...
プロパティを取得するとCallingUser
、最初の数回は正しい値が返され、正しいユーザー名が識別されますが、3 人または 4 人の異なるユーザーが正常に呼び出しを行うと (状況はさまざまであるため、より具体的には言えません)、他のユーザーは、以前に電話をかけたユーザーとして識別されているようです。
私が気付いたのは、最初の数人のユーザーが独自のスレッドで処理される DCOM 呼び出し (つまり、特定のクライアントからのすべての呼び出しが単一の一意のスレッドによって処理される) であり、その後、後続のユーザーが同じスレッドによって処理されることです。の呼び出し後、CoImpersonateClient()
そのCurrentPrincipal
スレッドの最初のユーザーと一致します。
説明する:
ユーザー Tom は、スレッド 1 によって処理される DCOM 呼び出しを行います ( CurrentPrincipal
Tom を正しく識別します) 。
ユーザー Dick は、スレッド 2 によって処理される DCOM 呼び出しを行います ( CurrentPrincipal
Dick を正しく識別します) 。
ユーザー Harry は、スレッド 3 によって処理される DCOM 呼び出しを行います ( CurrentPrincipal
Harry を正しく識別します) 。
ユーザー Bob は、スレッド 3 によって処理される DCOM 呼び出しを行います (CurrentPrincipal
誤って彼を Harry と識別します)。
この図でわかるように、クライアント Harry と Bob からの呼び出しはスレッド 3 で処理され、サーバーは呼び出し元のクライアントを Harry として識別しています。
私が間違っていることはありますか?このように偽装を使用する際の注意事項や制限はありますか? 私がやろうとしていることを確実に達成できる、より良い方法または別の方法はありますか?
すべての助けをいただければ幸いです。
iis - CruiseControl.net で VB6 アプリをビルドする際の DCOM の問題
ビルド マシン上のいくつかの DCOM 設定に依存する VB6 アプリケーションを問題なくビルドできます。
でも。同じビルド プロセスを 2 回目に実行しようとすると、再構築しようとしている出力ファイルが DCOM や IIS によってロックされているため、失敗します。
現在、ビルド マシンにログオンして iis をリセットすると (iisreset などを使用)、これらの出力ファイルのロックが解除され、ビルドが正常に完了します。
明らかに、ビルド マシンにログオンする必要はなく、IIS をリセットし続ける必要もありません。これを回避する別の方法はありますか?
ありがとう。
c# - COM Interop を使用して C# で仮想ディスク サービス API をプログラミングする
Windows 7 のボリューム C に関連付けられたディスク上のプライマリ パーティションを列挙できる小さなユーティリティ/クラス ライブラリを C# で作成したいと考えています。そのディスク上の任意のプライマリ パーティションのアクティブ フラグを変更したいと考えています。このライブラリをマネージ コード (C#) から "使用" したいと考えています。私が理解しているように、 http://msdn.microsoft.com/en-us/library/bb986750( v=VS.85 ).aspx で説明されている仮想ディスク サービスを使用する必要があります。
Windows 2008 用のこの API には、「プライマリ相互運用アセンブリ」のようなものがあるようです: Windows.Storage.Vds.dll ( http://blogs.msdn.com/taylorb/archive/2008/09/19/using-を参照) the-virtual-disk-service-vds-from-powershell-to-mount-and-use-vhd-s.aspx )。Windows 7 用のこれが見つかりません。存在しますか? もしそうなら、どうすれば入手できますか?見つからないので、公開されていないと思います。
次のステップは、tlbimp を使用してこのコードを生成することですが、VDS はタイプ ライブラリをエクスポートしません。これは本当ですか?見つからない。
それは、上記の例の行に沿って、C++ で直接 "手で" COM を行うことです。これらの例は機能しますが、事実上不可解です。同様に、 http: //msdn.microsoft.com/en-us/library/aa645736(VS.71).aspx で説明されている手法を使用して、midl から手動でクライアント アセンブリを作成することもできます。しかし、合理的な方法でこれを行うには、COM/COM Interop/VDS が十分ではありません。
VDS dcom クライアント API は仮想的に使用できないため、誰もが diskpart.exe のスクリプトを作成することになります。確かに私はこれについて間違っています。
deployment - コマンドラインを使用したCOM+アプリケーションの展開
COMdllをCOM+アプリケーションとしてデプロイする必要があります。以前は、コンポーネントサービスマネージャー(dcomcnfg.exe)からこれを実行していました。しかし、私の要件は、コマンドラインからデプロイすることです。それを行うためのコマンドはありますか?
更新:そして、同じものをアンインストールする方法は?
ありがとう。
com - 実行可能ファイルをサービスとしてホストしている場合、COM 呼び出しが機能しない
たとえば、COM サーバーをホストする実行可能ファイルがありますx.exe
。COM オブジェクトは、呼び出し側で次のようにインスタンス化されます。
それはすべてworks fine when x runs as an regular application
。
x.exe so that it runs as a service
Windowsでカプセル化するツールがあります。この場合、x.exe で COM 呼び出しを受信することはありません (ログによって検証されます)。奇妙な部分は次のとおりです。呼び出し元のサイトをログに記録すると、COM オブジェクトが正常にインスタンス化されており、インターフェイス関数の呼び出しでエラーが発生していない ( SUCEEDED(hres)
is true ) ことがわかります。
何か案は?