¿Determinar programáticamente al usuario quién modificó por última vez el archivo en Windows?

StackOverflow https://stackoverflow.com/questions/8406720

  •  29-10-2019
  •  | 
  •  

Pregunta

Se me asignó la tarea de escribir una utilidad de línea de comandos simple en C# que monitoreará un directorio en un servidor al que accederán varios usuarios para copiar/cortar/pegar/ver datos.solía Vigilante del sistema de archivos para hacer esto pero le faltan un par de características.

¿Es posible determinar la usuario o al menos el nombre de la computadora ¿Desde dónde se accede/modifica el archivo?

(Nota:Esto no tiene que ser con FileSystemWatcher, estoy buscando CUALQUIER forma de hacerlo).

¿Fue útil?

Solución

No creo que puedas monitorear esto directamente desde C#.De todos modos, no sin la ayuda del sistema operativo anfitrión.Windows y NTFS le permiten auditar un directorio en particular y registrar los accesos en el registro de eventos de seguridad de la máquina host (por lo que el servidor que aloja el recurso compartido tendría que auditar, no el cliente).

De KB310399: cómo auditar el acceso de los usuarios a archivos, carpetas e impresoras en Windows XP

Auditoría del acceso de los usuarios a archivos, carpetas e impresoras

El registro de auditoría aparece en el registro de seguridad del Visor de eventos.Para habilitar esta característica:

  1. Haga clic en Inicio, haga clic en Panel de control, haga clic en Rendimiento y mantenimiento y luego haga clic en Herramientas administrativas.
  2. Haga doble clic en Política de seguridad local.
  3. En el panel izquierdo, haga doble clic en Políticas locales para expandirlo.
  4. En el panel izquierdo, haga clic en Política de auditoría para mostrar la configuración de política individual en el panel derecho.
  5. Haga doble clic en Auditar acceso a objetos.
  6. Para auditar el acceso exitoso a archivos, carpetas e impresoras específicas, seleccione la casilla de verificación Éxito.
  7. Para auditar el acceso fallido a estos objetos, seleccione la casilla de verificación Fallo.
  8. Para habilitar la auditoría de ambos, seleccione ambas casillas de verificación.
  9. Haga clic en Aceptar.

Especificación de archivos, carpetas e impresoras para auditar

Después de habilitar la auditoría, puede especificar los archivos, carpetas e impresoras que desea auditar.Para hacerlo:

  1. En el Explorador de Windows, busque el archivo o la carpeta que desea auditar.Para auditar una impresora, ubíquela haciendo clic en Inicio y luego haciendo clic en Impresoras y faxes.
  2. Haga clic derecho en el archivo, carpeta o impresora que desea auditar y luego haga clic en Propiedades.
  3. Haga clic en la pestaña Seguridad y luego haga clic en Avanzado.
  4. Haga clic en la pestaña Auditoría y luego haga clic en Agregar.
  5. En el cuadro Ingrese el nombre del objeto para seleccionar, escriba el nombre del usuario o grupo cuyo acceso desea auditar.Puede buscar nombres en la computadora haciendo clic en Avanzado y luego haciendo clic en Buscar ahora en el cuadro de diálogo Seleccionar usuario o grupo.
  6. Haga clic en Aceptar.
  7. Seleccione las casillas de verificación Exitoso o Fallido para las acciones que desea auditar y luego haga clic en Aceptar.
  8. Haga clic en Aceptar y luego haga clic en Aceptar.

El proceso es similar para los sistemas operativos del servidor y Windows Vista/Windows 7.Si sigue esta ruta, puede hacer que el programa C# lea el registro de eventos (consulte EventLog class) para buscar los datos que desea.

Nota:A partir de Vista, debe ser administrador (UAC elevado si es necesario) para leerlos desde el código.

Otros consejos

Asegúrese de tener WMI instalado o habilitado en su PC, también asegúrese de agregar una referencia a System.Management y System.Management.Instrumentation también.También hay una GUI de la aplicación de scripting C # y VB WMI que puede descargar para ejecutar y probar consultas WMI con Google.Dado que trabajo para el Departamento de Defensa, hay ciertas cosas a las que puedo acceder desde aquí con respecto a la web, otras cosas están bloqueadas, así que perdóneme si no publico ciertos enlaces web.

Aquí hay algo para comenzar

    ManagementScope mgtScope = new ManagementScope("\\\\ComputerName\\root\\cimv2");
    // you could also replace the username in the select with * to query all objects
    ObjectQuery objQuery = new ObjectQuery("SELECT username FROM Win32_ComputerSystem");

    ManagementObjectSearcher srcSearcher = new ManagementObjectSearcher(mgtScope, objQuery);

    ManagementObjectCollection colCollection = srcSearcher.Get();

    foreach (ManagementObject curObjCurObject in colCollection)
    {

        Console.WriteLine(curObjCurObject["username"].ToString());
    } 

  //if you want ot get the name of the machine that changed it once it gets into that  Event change the query to look like this. I just tested this locally and it does work 

    ManagementObjectSearcher mosQuery = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ProcessId = " + Process.GetCurrentProcess().Id.ToString());
    ManagementObjectCollection queryCollection1 = mosQuery.Get();
    foreach (ManagementObject manObject in queryCollection1)
    {
        Console.WriteLine("Name : " + manObject["name"].ToString());
        Console.WriteLine("Version : " + manObject["version"].ToString());
        Console.WriteLine("Manufacturer : " + manObject["Manufacturer"].ToString());
        Console.WriteLine("Computer Name : " + manObject["csname"].ToString());
        Console.WriteLine("Windows Directory : " + manObject["WindowsDirectory"].ToString());
    }  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top