たとえば、フォルダツリー内のさまざまなファイルの削除イベントを検出できますが、どのユーザーが削除を実行したのかを判断するにはどうすればよいですか?FileSystemWatcherイベントを引き起こしたユーザーは?
FileSystemWatcherのMSDNドキュメントには何もわかりませんでした。多分それはおそらく不可能です。しかし、解決策があれば私は好奇心が強いだろう。
たとえば、フォルダツリー内のさまざまなファイルの削除イベントを検出できますが、どのユーザーが削除を実行したのかを判断するにはどうすればよいですか?FileSystemWatcherイベントを引き起こしたユーザーは?
FileSystemWatcherのMSDNドキュメントには何もわかりませんでした。多分それはおそらく不可能です。しかし、解決策があれば私は好奇心が強いだろう。
FileSystemWatcherの現在の実装では、ファイルが削除されたときやファイルに関する何かが変更されたときに、このタイプの情報を受け取らないため、これは現時点では不可能です。
フォルダ監査(フォルダのプロパティ>セキュリティ>詳細オプション>監査)を使用し、FileSystemWatcherイベントが発生した後でセキュリティイベントログを検索することは可能です。
string GetUser(string path) {
object nowDate = Now;
GetUser = "Unknown";
Threading.Thread.Sleep(1000);
// # Search user in the security event log
object secLog = new EventLog("Security", EVENTLOGSERVER);
EventLogEntry entry;
for (int i = (secLog.Entries.Count - 1); (i <= Math.Max((secLog.Entries.Count - 1500), 0)); i = (i + -1)) {
entry = secLog.Entries(i);
if (IsValidEntry(path, nowDate, entry)) {
GetUser = entry.ReplacementStrings(11);
break;
}
}
}
bool IsValidEntry(string path, DateTime nowDate, EventLogEntry entry) {
return ((entry.EntryType == EventLogEntryType.SuccessAudit)
&& ((entry.InstanceId == 560) || (entry.InstanceId == 564))
&& !entry.UserName.EndsWith("SYSTEM")
&& (Math.Abs(nowDate.Subtract(entry.TimeGenerated).TotalSeconds <= 20)
&& (entry.ReplacementStrings.GetUpperBound(0) >= 11)
&& (entry.ReplacementStrings(2).Length >= 4)
&& path.EndsWith(entry.ReplacementStrings(2).Substring(4)));
}
ことのお手伝いをすることができます.NETに組み込まれているすべての機能がありますようにそれは見えませんが、NETAPI32.DLLで機能NetFileGetInfo
の助けを借りて、それが可能でなければなりません。
this threadを参照してください。ここで、ユーザーdave4dlは、方法を示すコードサンプルを投稿しています。
.NETアプリケーションでこれが可能かどうか分かりますか?または、私はWin APIを掘り下げる必要がありますか? – Ash
@Ash:可能ならば、Win32 API呼び出しを使う必要があります。どのAPIを使用する必要があるのかよく分かりませんが、最終的には独自のバージョンのファイルシステムウォッチャーを作成することになります。 –