Aparte de eso, un FilesystemWatcher no recibe ni devuelve ningún tipo de información sobre el usuario en cuestión, según parece es una tarea bastante compleja de llevar a cabo, tienes mucha información sobre esto en los resultados de Google:
Cita de: http://www.codeproject.com/Questions/769262/How-can-you-obtain-the-username-when-using-a-FileS
NTFS doesn't track who deletes, renames, or modifies a file, so there's no way you can get the username. It only keeps track of who OWNS the file.
No, it's not possible, the NTFS or FAT file system which is what Windows uses doesn't record this information. The best you could get about a file is last time it was changed.
Cita de: http://www.pcreview.co.uk/forums/system-io-filesystemwatcher-class-and-user-identity-t1364792.html
First off, you'll need to devise some way of determining whether the changes to a file were made locally or remotely
The only possibilities I can think of would be the NetFileEnum and NetFileGetInfo API function calls
This isn't currently possible with the current implementations of the FileSystemWatcher as it does not receive this type of information when a file is deleted, or anything about a file changes.
You would need to use Win32 API calls, if it's possible at all. I'm not sure which APIs you would need to use,
but you will end up essentially writing your own version of a file system watcher
You would need to use Win32 API calls, if it's possible at all. I'm not sure which APIs you would need to use,
but you will end up essentially writing your own version of a file system watcher
I was looking for the same thing today. I found something that will work.
See here: http://stackoverflow.com/questions/7861512/get-username-of-an-accesed-file
Keep in mind, auditing must be enabled for the folder.
See here: http://stackoverflow.com/questions/7861512/get-username-of-an-accesed-file
Keep in mind, auditing must be enabled for the folder.
La información de la función NetFileGetInfo es muy escasa así que no puedo mostrarte un ejemplo funcional (tampoco se si funcionaría, solo especulan por internet).
( http://msdn.microsoft.com/en-us/library/windows/desktop/bb525379%28v=vs.85%29.aspx )
Puedes probar la siguiente solución
La versión en VB.NET
Código
Imports System.Text Imports System.IO Public Class Form1 Private Function GetSpecificFileProperties(file As String, ParamArray indexes As Integer()) As String Dim shell As New Shell32.Shell() objFolder = shell.[NameSpace](folderName) Dim sb As New StringBuilder() For Each item As Shell32.FolderItem2 In objFolder.Items() If fileName = item.Name Then For i As Integer = 0 To indexes.Length - 1 sb.Append(objFolder.GetDetailsOf(item, indexes(i)) + ",") Next Exit For End If Next Dim result As String = sb.ToString().Trim() If result.Length = 0 Then Return String.Empty End If Return result.Substring(0, result.Length - 1) End Function Private Sub FileSystemWatcher1_Changed(sender As Object, e As FileSystemEventArgs) _ Handles FileSystemWatcher1.Changed, FileSystemWatcher1.Created Dim filepath As String = e.FullPath Dim Type As String = GetSpecificFileProperties(filepath, 2) Dim ObjectKind As String = GetSpecificFileProperties(filepath, 11) Dim CreatedDate As DateTime = Convert.ToDateTime(GetSpecificFileProperties(filepath, 4)) Dim LastModifiedDate As DateTime = Convert.ToDateTime(GetSpecificFileProperties(filepath, 3)) Dim LastAccessDate As DateTime = Convert.ToDateTime(GetSpecificFileProperties(filepath, 5)) Dim LastUser As String = GetSpecificFileProperties(filepath, 10) Dim ComputerName As String = GetSpecificFileProperties(filepath, 53) Dim FileSize As String = GetSpecificFileProperties(filepath, 1) End Sub End Class
Esta parece ser una solución, aunque personalmente no la he consguido hacer funcionar:
http://vbcity.com/forums/p/133307/698930.aspx#698930
+
Use code posted by dave4dl and update declare struct FILE_INFO_3 as following, you can monitor user name of create and update file action(It is like to combination of FileSystemWatcher and OpenFiles.exe's functions of FileSharing Server)
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct FILE_INFO_3
{
public int fi3_id;
public int fi3_permission;
public int fi3_num_locks;
[MarshalAs(UnmanagedType.LPWStr)]
public string fi3_pathname;
[MarshalAs(UnmanagedType.LPWStr)]
public string fi3_username;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct FILE_INFO_3
{
public int fi3_id;
public int fi3_permission;
public int fi3_num_locks;
[MarshalAs(UnmanagedType.LPWStr)]
public string fi3_pathname;
[MarshalAs(UnmanagedType.LPWStr)]
public string fi3_username;
}
Saludos.