3

ドメイン マシンから古いユーザー プロファイルを削除する小さなユーティリティに取り組んでいます。

基本的に、私が立ち往生しているのは、リモート ディレクトリを削除するためのより良いプロセスを探しているところです。

System.IO を使用して UNC パスから削除できることはわかっていますが、ネットワーク削除のパフォーマンスに満足できません。中規模のプロファイルを削除するには数時間かかる場合があり、数十または数百のプロファイルまたはマシンがある場合、これは解決策として実行できません。

したがって、これは問題外のようです

私が見つけることができる最善の方法は PSExec 呼び出しのようですが、管理されたものが必要です。

呼び出し元のマシンに依存する代わりに、リモート マシンを呼び出してディレクトリの削除を完了することができる .NET クラスはありますか?

4

2 に答える 2

1

この回答に触発されて、いくつかの小さな変更を加えました。コード自体から -commandThe storage control block address is invalidを実行しようとすると、エラー コード 9 ( ) が表示されるため、100% 管理された状態で実行することはできません。rd

私の小さなテストセットアップでは、基本機能は目がくらむほど高速ですが、「よろしいですか?」プロンプト、間違ったパスを指定するとかなり危険なので、先に進むときはヘルメットを着用してください。

任意のコマンド シェルで実行するecho Y | rd /S c:\Temp\testと、C:\Temp\Test とその下にあるものは警告なしで非常に迅速に削除されます。

ただし、このソリューションをコードで直接実行しても機能しません。したがって、私の簡単な修正は、DeleteTest.batこの行のみを含むバット ファイル (と呼ばれる) をマシンに配置し、WMI によってバット ファイルを実行することです

私の小さなテストでは、約 200 mb の合計 900 個のファイルを 1 秒程度で削除します。

また、引用された回答に加えて、リターンコードを取得するため、完全なコードは次のようになります。

        var processToRun = new[] { "c:\\Temp\\DeleteTest.bat" };

        var connection = new ConnectionOptions();
        connection.Username = "me";
        connection.Password = "password";
        var wmiScope = new ManagementScope(String.Format("\\\\{0}\\root\\cimv2", "MyRemoteMachine"), connection);
        var wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
        var result = wmiProcess.InvokeMethod("Create", processToRun);
        Console.WriteLine(
        "Creation of process returned: " + result);

もちろん、bat ファイルを (コードによって、または事前に生成して) 生成し、コピー先にコピーする必要もありますが、それは些細なことです。

于 2013-08-08T09:16:43.877 に答える