3

3つのドメイン全体でさまざまな管理タスクを実行するためにC#および.NET3.5で開発されたWindowsサービスがあります。このサービスが実行していることに必要な権限/権限を持つ管理者アカウントを各ドメインに持っています。

すべてのADインタラクションについて、ドメインの正しいユーザー名/パスワードを使用してADにバインドでき、すべて問題ありません。ただし、作業を実行するために外部プロセス(robocopy)を起動する必要があり、.NET3.5でこれを実行するためのコード例はどこにも見つかりません。

私がする必要があるのは、非表示のウィンドウで代替クレデンシャルを使用してrobocopyを起動し、標準出力をキャプチャして実際に行われたことのログを取得し、終了コードをキャプチャして成功したかどうかを確認することです。

System.Diagnostics.Processオブジェクトを拡張し、Win32API関数CreateProcessAsUserWを呼び出すK.Scott Allenのブログ(適切なコードリストについては、最後のいくつかのコメントを参照)から古い.NET1.1コードを見つけました。ただし、.NET 2.0でのAPIの変更により、コードは機能しません。参照されているブログの最後のコメントのコードスニペットを使用して、リフレクションを使用してProcessオブジェクトのプライベートSetProcessHandle関数を呼び出すと、プロセスを操作しようとすると(プロセスを強制終了するか、終了コードを取得するため)、AccessDeniedエラーが発生します。

誰かがこれを達成する方法の良い例を持っていますか?

編集:組み込みの.NETProcessおよびProcessStartInfoAPIを使用すると、代替の資格情報を指定できますが、指定すると、Windowsサービスとして実行すると失敗する表示ウィンドウを作成する必要があります(CreateNoWindowまたはWindowStyle Hiddenを指定した場合でも)。したがって、これらはこのアプリケーションのオプションではありません。外部プロセスが起動されると、偽装されたクレデンシャルではなく、親プロセスのクレデンシャルが使用されるため、偽装も機能しません。

解決策:Reedが以下で指摘しているように、Win32API関数の1つを使用してP/ Invokeを使用すると、これを実現できます。コマンドラインでユーザー名/パスワードを指定できるRunProcessと呼ばれる古いフリーウェアのNT4ユーティリティを使用して、少し異なるルートをたどることになりました。Vistaおよび2k3で動作し、ローカルシステムとして実行されているWindowsサービスによって起動されたときにも正しく動作しました。

4

5 に答える 5

4

私はあなたが見たいと思います:

ProcessStartInfo

これは、異なる資格情報を持つ異なるユーザーの下でプロセスを開始するための.NETのみの方法を提供します。Win32APIはもう必要ありません。

- - 編集 - -

他の方法としては、ここで指定されているようにP / Invokeを使用するか(最初に下部のメモを参照)、CreateProcessWithLogonWでP/Invokeを使用する可能性があります。

于 2009-03-13T17:20:26.890 に答える
1

未確認の考えですが、.net 2+のコードブロック全体に有効な動的な偽装を使用していませんか?したがって、必要なユーザーを偽装してから、通常の方法でプロセスを開始するなど、偽装されたコンテキスト/スコープ内で必要なことをすべて実行しますか?すでに提供されている資格情報を使用してmstsc.exeの起動を統合するためにそのようなことをしたと思います。

于 2009-03-13T17:57:18.657 に答える
0

Processこれは、クラスとでうまく機能するはずProcessStartInfoです。

さまざまな資格情報:

標準出力をリダイレクトします:

終了コード:

于 2009-03-13T17:23:25.320 に答える
0

StartInfo には CreateNoWindow というプロパティがあり、Reed の提案が機能する可能性があります。

于 2009-03-13T17:44:15.740 に答える
0

これらの終了コードが実際に使用されていることを確認したい場合は、www.robocopyplus.com をご覧ください。robocopy のラッパーのように機能し、電子メール通知とレポート フィルタリング用のスイッチを追加します。これは、達成しようとしているもののいくつかをすでに実行している可能性があります。

于 2010-03-18T16:51:41.547 に答える