4

WMI と C# を使用して、リモート マシンのイベント ビューアから通知を取得しようとしています。を使用して、システムに接続し、イベント ログも取得できますManagementObjectSearcher。しかし、ManagementEventWatcher.Startメソッドを使用しようとすると、例外が発生します:

アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))

WMI コントロールのroot\cimv2権限を与え、DCOM Config のユーザー アカウントに管理者権限も与えました。

私は通常の Windows アプリケーションを使用しているため、私の場合は ASP.net (ASPNET ユーザー) を使用していません。

私のコードは次のとおりです。

ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = @"Domain\UName";//txtUserName.Text;
connectionOptions.Password = "pass";//txtPassword.Text;
connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope managementScope = new ManagementScope(@"\\server\root\cimv2",connectionOptions);
managementScope.Options.EnablePrivileges = true;
managementScope.Connect(); // this line is executing fine.
eventWatcher = new ManagementEventWatcher(managementScope, new EventQuery("Select * From __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent'  and TargetInstance.LogFile = 'Application'"));
eventWatcher.EventArrived += new EventArrivedEventHandler(Arrived);
eventWatcher.Scope.Options.EnablePrivileges = true;
eventWatcher.Start(); // Error occurs here
4

3 に答える 3

5

まず、 Microsoft が準同期操作の使用を推奨していることを覚えておいてください (Brian が提案したように)。

可能であれば、代わりに半同期操作を使用することをお勧めします。パフォーマンスへの影響は小さく、半同期操作は同じ機能を可能にしますが、リバース接続は必要ありません。

VBScript での非同期呼び出しのセキュリティの設定も参照してください。

それでも非同期操作を使用する場合は、次の記事を参照してください。

YMMV ですが、私 (クライアント: Win7 x64 SP1 サーバー: ファイアウォールなしの Windows Server 2008 Enterprise SP2) の場合、E_ACCESSDENIED例外の解決策は 3 番目の記事で見つかりました。

  1. [スタート]、[ファイル名を指定して実行] の順にクリックし、DCOMCNFGと入力して、[OK] をクリックします。
  2. [コンポーネント サービス] ダイアログ ボックスで、[コンポーネントサービス]、[コンピュータ] の順に展開し、[マイ コンピュータ]を右クリックして [プロパティ] をクリックします。
  3. [マイ コンピュータのプロパティ] ダイアログ ボックスで、[ COM セキュリティ] タブをクリックします。
  4. [アクセス許可]で、[制限の編集] をクリックします。
  5. [アクセス許可] ダイアログ ボックスで、[グループ名またはユーザー名] ボックスでANONYMOUS LOGON名を選択します。[ユーザーのアクセス許可] の下の[許可]列で、[リモート アクセス]を選択し、[ OK ] をクリックします。

clientで上記を行ったことに注意してください。これで DCOM 権限の問題は解決しましたが、WMI アクセス拒否エラー ( 0x80041003) が発生しました。2 番目の記事に記載されているレジストリ キーが原因であることが判明しました。

リモート接続が信頼関係のないコンピューター間である場合は、CIMOM 設定を更新する必要があります。そうしないと、非同期接続が失敗します。この設定は、同じドメインまたは信頼されたドメイン内のコンピューターでは変更しないでください。

匿名コールバックを許可するには、次のレジストリ エントリを変更する必要があります: HKLM\SOFTWARE\Microsoft\WBEM\CIMOM\AllowAnonymousCallback

AllowAnonymousCallback キーが 0 に設定されている場合、WMI サービスはクライアントへの匿名のコールバックを防ぎます。値が 1 に設定されている場合、WMI サービスはクライアントへの匿名のコールバックを許可します。

サーバーで上記を設定する必要があることに注意してください。それをしたら、非同期コールバックが機能しました。他に試すことができることは、クライアントを管理者として実行し、ConnectionOptions.EnablePrivilegesを true に設定することです。

トラブルシューティングについては、次を参照してください。

%windir%\system32\wbem\wbemtest.exe最後に、Microsoft の WMI テスター ( )を利用することをお勧めします。

于 2011-12-07T16:10:24.063 に答える
4

WaitForNextEvent() で半同期的にリッスンしてみてください。

    var managementScope = new ManagementScope(@"\\mysever\root\onguard"); 
    managementScope.Connect(); 

    var query = new EventQuery("select * from lnl_AccessEvent");
    var eventWatcher = new ManagementEventWatcher(managementScope, query);
    var wmiEvent = eventWatcher.WaitForNextEvent();
    Console.Out.WriteLine(wmiEvent.GetPropertyValue("Description"));

また、wbemtest.exe が役立つこともわかりました。Notification Query... ボタンをクリックして、イベントをリッスンします。さまざまな接続方法 (同期、非同期、準同期) を試すことができます。ローカル マシンに接続する場合はすべての接続方法が機能しますが、リモートで動作させるには準同期しか取得できませんでした。サーバーがクライアントへの接続を確立する必要があるため、非同期(使用している)はより複雑です(そして安全性が低くなります)。

セキュリティと構成設定に関するいくつかの良い情報: http://www.packettrap.com/network/Knowledge-Base/PacketTrap-MSP/WMI-Troubleshooting.aspx#_Toc239699682

于 2010-11-19T01:17:21.210 に答える
0

私はこれを理解するのに何時間も費やしました。上記のどれも私にとってはうまくいきませんでした。

IIS サーバーのイベント ログを分析したところ、ManagementEventWatcher オブジェクトで Start メソッドを呼び出すたびに、システム ログに次のエラー イベントが記録されていることがわかりました。

コンピューターの既定のアクセス許可設定では、CLSID {49BD2028-1523-11D1-AD79-00C04FD8FDFF} と APPID {49BD2028-1523-11D1-AD79-00C04FD8FDFF} を持つ COM サーバー アプリケーションのローカル アクティベーション アクセス許可がユーザー IIS APPPOOL\DefaultAppPool に付与されません。アドレス LocalHost からの SID (S-1-5-82-3006700770-424185619-1745488364-794895919-4004696415) (LRPC を使用)。このセキュリティ アクセス許可は、コンポーネント サービス管理ツールを使用して変更できます。

レジストリ検索により、エラーで指定された APPID を持つアプリケーションが

Microsoft WBEM セキュリティで保護されていないアパートメント

非同期コールバックを機能させるには、この COM オブジェクトに対する Local Activation アクセス許可を IIS APPPOOL\DefaultAppPool ユーザーに付与する必要があります。ユーザーがセキュリティ データベースに有効なアカウントとして表示されないことを除けば、これは簡単に思えます。これは、IIS アプリケーション プールの作成時に自動的に作成されるシステム生成のユーザー アカウントであるためです。

この作業を行うプロセスは次のとおりです。

  1. mmc を実行し、コンポーネント サービス スナップインを追加します。
  2. [コンピューター] -> [マイ コンピューター] -> [DCOM 構成] を開きます
  3. 「Microsoft WBEM Unsecured Apartment Object」までスクロールします。
  4. 右クリックして [プロパティ] を選択します
  5. [セキュリティ] タブをクリックし、[起動とアクティブ化のアクセス許可] セクションで [カスタマイズ] オプションを選択し、[編集] をクリックします。
  6. IIS サーバーがドメインの一部である場合は、場所フィールドにドメインではなくローカル マシンが指定されていることを確認してください。
  7. [追加] ボタンをクリックして、ユーザー ボックスに「IIS APPPool\DefaultAppPool」と入力し、[名前の確認] ボタンをクリックします。DefaultAppPool を使用していない場合は、使用しているアプリケーション プールの名前に置き換えてください。
  8. 有効なユーザーがボックスに表示されるので、[OK] をクリックします。
  9. リストでユーザーを選択し、[ローカル起動] および [ローカル アクティベーション] の [許可] ボックスをオンにします。
  10. WMI イベント リスナーへの非同期コールバックで E_ACCESSDENIED が表示されなくなるという事実をお楽しみください。
于 2012-10-26T05:02:30.147 に答える