そのため、ネットワーク上の複数のマシンのディレクトリの内容を定期的にチェックする必要がある小さな C# アプリがあります。ディレクトリ パスとして \hostname\C$ を読み取ることができると思っていましたが、通常の Directory クラスでは、他のサーバーに対して認証する方法がないように思われるため、非表示の共有にアクセスできます。私が見落としていたこれを行う簡単な方法があると確信していますが、現時点では少し困惑しています。
3 に答える
http://bytes.com/forum/thread689145.htmlから:
すべてのプロセスは、ログインしているユーザー アカウントのコンテキストで実行されます。別のコンピューターでファイルを開く場合、アプリケーションは、そのコンピューターでファイルを開く権限を持つユーザーのコンテキストで実行されている必要があります。これは、偽装で行うことができます。
最も簡単な方法は、現在のユーザーに他のマシンでの適切な権限を与えることです。
プロセスを実行しているユーザーがアクセス許可を持っていない共有で認証するには (管理共有の場合によくあることです)、net use コマンドを実行してみてください。
net use SERVERNAME\IPC$ /user:USERNAME PASSWORD
実際に共有にアクセスしようとするコードの前に、別のプロセスでこれを実行してみてください。
ProcessStartInfo psi = new ProcessStartInfo(
"net", "use " + SERVERNAME + @"\IPC$ /user:" + USERNAME + " " + PASSWORD);
Process p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
p.Close();
// The code to access the share follows...
これは、プロセスを実行しているユーザー アカウントの共有に許可を与えることが適切でない場合に役立ちます。たとえば、ユーザー自身が直接アクセスしてはならない共有上のデータにエンドユーザー アプリケーションがアクセスする必要があるセキュリティ モデルの場合などです。 .
実行時に現在のユーザーを設定する方法をお探しですか?
そうでない場合、プロセスを実行しているユーザーがそれらのマシンにアクセスできる限り、これは機能します。
DirectoryInfo di = new DirectoryInfo(@"\\machineName\c$\temp");
FileInfo[] files = di.GetFiles();
foreach (FileInfo f in files)
{
Debug.WriteLine(f.Name);
}