リモートマシンでwmiクエリとメソッドを実行するためのコードを書いています。私のログインクレデンシャルはドメイン管理者です。アプリケーションモードで実行すると、すべて正常に動作します。サービスとして実行すると、デフォルトのアカウントサービスがisLocal Systemを使用しているため、期待どおりに機能しません。クレデンシャルとして実行するようにサービスを設定すると、リモートwmiも正常に機能します。
ただし、これは望ましくないため、IWbemLocator.ConnectServerでユーザー名とパスワードを指定して、サービスでリモートwmiに接続しようとしています。IWbemServicesオブジェクトを正常に取り戻すことができます。ただし、IWbemServicesオブジェクトからクラスオブジェクトを取得しようとすると、次のエラーが発生しました。
//IWbemServices *pSvc
const bstr_t objectPath("stdRegProv");
const bstr_t methodName("GetStringValue");
IWbemClassObject *pClass = NULL;
HRESULT hr = pSvc->GetObject(objectPath, 0, NULL, &pClass, NULL);
返される時間は0x80041003で、これは次のリンクから「アクセスが拒否されました」です:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa394559%28v=vs.85%29.aspx。
通常、間違ったユーザー名とパスワードを指定すると、IWbemLocator.ConnectServerでアクセスが拒否されます。だから私はここで接続が良い理由に少し戸惑っていますが、IWbemClassObjectオブジェクトを取得できません。ドメインクレデンシャルをサービスアカウントとして使用すると機能するため、セキュリティ上の違いがあるはずです。私のWMI接続コードは、MSDNの次のサンプルコードに基づいています:http://msdn.microsoft.com/en-us/library/windows/desktop/aa390418%28v=vs.85%29.aspx