DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WMIのリモート機能で別マシンのファイルを移動させたい。

環境/言語:[Windows Server 2003 R2 / C# 2005 ]
分類:[.NET]

はじめまして。

C#でWMIを使用してリモートで別マシンのファイルを移動させる
プログラムを作成しようとしております。

あちこちのサイトやヘルプを参考にファイルの移動を試みている
のですが、「アクセスが拒否されました。」のエラーが出て解決
できずに困っております。
エラーの内容から推測すると、コードが原因ではないような気も
するのですが、経験が浅くてその辺りが分からず、投稿させて頂く
次第となりました。

どなたかご教授をお願い出来ませんでしょうか。


コードとエラー発生時の詳細を以下に記述致します。

コードは以下の通りです。

ConnectionOptions option = new ConnectionOptions();
option.Username = DomainName + "\\" + UserName;
option.Password = UserPass;

ManagementScope scope = new ManagementScope("\\\\" + MachineName + "\\root\\cimv2", option);

ObjectQuery query = new ObjectQuery(
"SELECT * FROM Win32_Directory WHERE Name = '" + FromPath + "'");

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection moCollection = searcher.Get();

foreach (ManagementObject mo in moCollection)
{
// 一気に移動できればいいのですが、分からないのでコピー&削除で代用?
// オブジェクトのコピー
mo.CopyTo(ToPath);

// オブジェクトの削除
mo.Delete();
}



以下はエラー発生時の詳細です。

●エラー発生時の状況です。
・プログラムはAサーバー(2003Server)で実行。
・ファイルの移動元はBサーバー(同じく2003Server)の"C:\MoveTest_From"以下の全て
・ファイルの移動先はBサーバーの"C:\MoveTest_To"
・Aサーバー、Bサーバーは同じドメインに所属

●エラーは内容が表示されています。
アクセスが拒否されました。
(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))

エラーに関してはMicroSoftの以下のアドレスを参考に調べてみたのですが、
どれも該当しない(と思われる)ので、はてな状態です。
http://www.microsoft.com/japan/technet/scriptcenter/resources/wmifaq.mspx

●エラーが出ているのは以下のコードの部分です。
ManagementObjectCollection moCollection = searcher.Get();

尚、"MoveTest_From"と"MoveTest_To"のフォルダはプログラム実行時の
ユーザーが所属しているセキュリティグループでフルコントロールの設定
にしています。
(・・・のつもりなのですが、自信がありません。)

以上です。
説明の不足しているところ等が御座いましたらご指摘下さい。


宜しくお願いします。
> コードとエラー発生時の詳細を以下に記述致します。
(略)
> 以下はエラー発生時の詳細です。
> ●エラーは内容が表示されています。
> アクセスが拒否されました。
> (HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))

肝心の情報がありません。
どの行を実行しようとして例外が発生するんでしょうか?
■No15928に返信(渋木宏明(ひどり)さんの記事)
>>コードとエラー発生時の詳細を以下に記述致します。
> (略)
>>以下はエラー発生時の詳細です。
>> ●エラーは内容が表示されています。
>> アクセスが拒否されました。
>> (HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))
>
> 肝心の情報がありません。
> どの行を実行しようとして例外が発生するんでしょうか?
>

ご返信ありがとうございます。

えと、最後の方に書いたつもりでしたが、以下の内容以外の情報が必要・・・ということでしょうか。
>●エラーが出ているのは以下のコードの部分です。
>ManagementObjectCollection moCollection = searcher.Get();

ソースコードでいうところの11行目に当たる部分でエラーが出ている模様です。

以上です。
宜しくお願いします。
> えと、最後の方に書いたつもりでしたが、以下の内容以外の情報が必要・・・ということでしょうか。
> >●エラーが出ているのは以下のコードの部分です。
> >ManagementObjectCollection moCollection = searcher.Get();

リモートマシンで firewall が有効になっていませんか?

[管理ツール]-[コンピュータの管理] の「別のコンピュータに接続」で問題のPCに接続できますか?
■No15941に返信(渋木宏明(ひどり)さんの記事)
>>えと、最後の方に書いたつもりでしたが、以下の内容以外の情報が必要・・・ということでしょうか。
>>>●エラーが出ているのは以下のコードの部分です。
>>>ManagementObjectCollection moCollection = searcher.Get();
>
> リモートマシンで firewall が有効になっていませんか?
>
> [管理ツール]-[コンピュータの管理] の「別のコンピュータに接続」で問題のPCに接続できますか?
>

教えて頂いた操作でリモート操作しようとしているサーバーに
接続してみましたが、問題なく接続できました。
念のため、リモート側からアプリケーションを動かしている
サーバーにも同様の操作で接続してみましたが、こちらも問題
なく接続することができました。
> 教えて頂いた操作でリモート操作しようとしているサーバーに
> 接続してみましたが、問題なく接続できました。

ネットワーク的には到達可能ということですね。

>ConnectionOptions option = new ConnectionOptions();
>option.Username = DomainName + "\\" + UserName;
>option.Password = UserPass;

で与えているアカウントは、リモートPCの管理者権限を持っているでしょうか?
■No15944に返信(渋木宏明(ひどり)さんの記事)
>>教えて頂いた操作でリモート操作しようとしているサーバーに
>>接続してみましたが、問題なく接続できました。
>
> ネットワーク的には到達可能ということですね。
>
> >ConnectionOptions option = new ConnectionOptions();
> >option.Username = DomainName + "\\" + UserName;
> >option.Password = UserPass;
>
> で与えているアカウントは、リモートPCの管理者権限を持っているでしょうか?
>

何度もご返事頂き、ありがとうございます。

さて、本題ですが、
この辺りの知識はまだ勉強中の為よく分かっておりませんが、リモート
デスクトップのユーザーの設定(以下の操作で行う画面)でしたら、ユーザー
の所属しているセキュリティグループで権限を設定しています。

[スタートメニュー]→[マイコンピュータを右クリック]→[プロパティ]
→[システムのプロパティ画面]→[リモートのタブ]→[リモートユーザーの選択]

違う機能の事でしたら、ご指摘をお願いします。


宜しくお願いします。
> デスクトップのユーザーの設定(以下の操作で行う画面)でしたら、ユーザー
> の所属しているセキュリティグループで権限を設定しています。
>
> [スタートメニュー]→[マイコンピュータを右クリック]→[プロパティ]
> →[システムのプロパティ画面]→[リモートのタブ]→[リモートユーザーの選択]

は、まったく関係ありません。

> >ConnectionOptions option = new ConnectionOptions();
> >option.Username = DomainName + "\\" + UserName;
> >option.Password = UserPass;

の、DomainName, UserName, UserPass には何を与えていますか?

これらがテキトーでは、期待する動作をしないであろうことは想像できますよね?

DomainName には、ドメイン環境では文字通りドメイン名を、ワークグループ環境ではターゲットとなるコンピュータのコンピュータ名を与えます。

UserName には、ターゲットコンピュータに登録されている、管理者権限を持ったユーザのユーザIDを、UserPass にはそのユーザアカウントのパスワードを与えなくてはなりません。
■No15947に返信(渋木宏明(ひどり)さんの記事)
>>デスクトップのユーザーの設定(以下の操作で行う画面)でしたら、ユーザー
>>の所属しているセキュリティグループで権限を設定しています。
>>
>>[スタートメニュー]→[マイコンピュータを右クリック]→[プロパティ]
>>→[システムのプロパティ画面]→[リモートのタブ]→[リモートユーザーの選択]
>
> は、まったく関係ありません。

関係ありませんでしたか。失礼致しました。

>
>>>ConnectionOptions option = new ConnectionOptions();
>>>option.Username = DomainName + "\\" + UserName;
>>>option.Password = UserPass;
>
> の、DomainName, UserName, UserPass には何を与えていますか?
>
> これらがテキトーでは、期待する動作をしないであろうことは想像できますよね?
>
> DomainName には、ドメイン環境では文字通りドメイン名を、ワークグループ環境ではターゲットとなるコンピュータのコンピュータ名を与えます。
>
> UserName には、ターゲットコンピュータに登録されている、管理者権限を持ったユーザのユーザIDを、UserPass にはそのユーザアカウントのパスワードを与えなくてはなりません。
>

こちらの件ですが、少し混乱してきましたので、検証前に質問することを
お許しください。

動作確認をしていた際にはDomainName、UserName、UserPassには参加して
いるドメインのログイン情報を設定していたのですが、そうではなくター
ゲットのコンピューターに登録されているユーザーでなければならない。
ということですか?

また、ターゲットのコンピューターのフォルダセキュリティ設定にはActive
Directoryに登録されているユーザーがフルコントロールなのですが、これ
もプログラムがファイルの制御する分には関係がなく、ローカルのユーザー
IDでフルコントロールになっていれば、制御ができる。
ということになるのでしょうか?

宜しくお願いします。
> 動作確認をしていた際にはDomainName、UserName、UserPassには参加して
> いるドメインのログイン情報を設定していたのですが、
そこで指定したドメインユーザーは、
 1. ターゲットPCの[マイコンピュータ]を右クリック→[管理]
 2. [ローカルユーザーとグループ]→[グループ]
 3. "Administrators" グループのプロパティ
のメンバとして記録されていますか?

あるいは、そのドメインユーザーに対して、
 1. ターゲットPCの[マイコンピュータ]を右クリック→[管理]
 2. [WMIコントロール]を右クリック→[プロパティ]
 3. [セキュリティ]タブの Root\CIMV2 →[セキュリティ]
における十分な権限が与えられていますか?


# リモート機能を使った事が無いので、思いつきで書いているだけですが。m(_ _)m
■No15956に返信(魔界の仮面弁士さんの記事)
>>動作確認をしていた際にはDomainName、UserName、UserPassには参加して
>>いるドメインのログイン情報を設定していたのですが、
> そこで指定したドメインユーザーは、
>  1. ターゲットPCの[マイコンピュータ]を右クリック→[管理]
>  2. [ローカルユーザーとグループ]→[グループ]
>  3. "Administrators" グループのプロパティ
> のメンバとして記録されていますか?
>
> あるいは、そのドメインユーザーに対して、
>  1. ターゲットPCの[マイコンピュータ]を右クリック→[管理]
>  2. [WMIコントロール]を右クリック→[プロパティ]
>  3. [セキュリティ]タブの Root\CIMV2 →[セキュリティ]
> における十分な権限が与えられていますか?
>
>
> # リモート機能を使った事が無いので、思いつきで書いているだけですが。m(_ _)m

ご返信ありがとうございます。

魔界の仮面弁士さんのご指摘通り、"ローカルユーザーと
グループ"の"Administrators"グループに、ドメインのセ
キュリティグループをメンバー登録して実行した結果、
なんとか「アクセスが拒否されました」のエラーを回避
することができました!
ありがとうございます。

しかしながら、次なる課題としてCopyToのメソッド部分で
「無効なパラメータです」のエラーメッセージが出ている
状態であります。
こちらに関しては現在原因を調べている最中なのですが、
取り急ぎご連絡をと思いまして返信させて頂きます。


以上です。

DOBON.NET | プログラミング道 | プログラミング掲示板