Determinar programaticamente o usuário que modificou pela última vez o arquivo no Windows?

Eu fui encarregado de escrever um utilitário de linha de comando simples em C # que irá monitorar um diretório em um servidor que vários usuários estarão acessando para copiar / cortar / colar / visualizar dados. Eu usei o FileSystemWatcher para fazer isso, mas faltam alguns resources.

É possível determinar o usuário ou pelo menos o nome do computador de onde o arquivo está sendo acessado / modificado?

(Nota: Isso não tem que ser com o FileSystemWatcher, estou procurando por qualquer maneira de fazer isso.)

Eu não acho que você será capaz de monitorar isso de C # diretamente. Não sem a ajuda do sistema operacional do host de qualquer maneira. O Windows e o NTFS permitem auditar um diretório específico e registrar os accesss no log de events de segurança da máquina host (para que o servidor que hospeda o compartilhamento tenha que auditar, não o cliente).

From KB310399 – Como auditar o access de usuários de arquivos, pastas e impressoras no Windows XP

Auditando o access do usuário de arquivos, pastas e impressoras

O log de auditoria é exibido no log de segurança no Visualizador de Eventos. Para ativar este recurso:

  1. Clique em Iniciar, clique em Painel de controle, clique em desempenho e manutenção e, em seguida, clique em Ferramentas administrativas.
  2. Clique duas vezes em Diretiva de segurança local.
  3. No painel esquerdo, clique duas vezes em Diretivas locais para expandi-lo.
  4. No painel esquerdo, clique em Diretiva de Auditoria para exibir as configurações de diretiva individuais no painel direito.
  5. Clique duas vezes em Acesso ao object de auditoria.
  6. Para auditar o access bem-sucedido de arquivos, pastas e impressoras especificados, marque a checkbox de seleção Success.
  7. Para auditar o access malsucedido a esses objects, marque a checkbox de seleção Falha.
  8. Para ativar a auditoria de ambos, selecione as duas checkboxs de seleção.
  9. Clique OK.

Especificando arquivos, pastas e impressoras para auditoria

Depois de habilitar a auditoria, você pode especificar os arquivos, pastas e impressoras que deseja auditar. Para fazer isso:

  1. No Windows Explorer, localize o arquivo ou a pasta que você deseja auditar. Para auditar uma impressora, localize-a clicando em Iniciar e, em seguida, clicando em Impressoras e aparelhos de fax.
  2. Clique com o botão direito do mouse no arquivo, na pasta ou na impressora que você deseja auditar e clique em Propriedades.
  3. Clique na guia Segurança e, em seguida, clique em Avançado.
  4. Clique na guia Auditoria e, em seguida, clique em Adicionar.
  5. Na checkbox Digite o nome do object a ser selecionado, digite o nome do usuário ou grupo cujo access você deseja auditar. Você pode procurar nomes no computador clicando em Avançado e, em seguida, clicando em Localizar agora na checkbox de diálogo Selecionar usuário ou grupo.
  6. Clique OK.
  7. Marque as checkboxs de seleção Bem-sucedido ou Falhou das ações que você deseja auditar e clique em OK.
  8. Clique em OK e, em seguida, clique em OK.

O processo é semelhante para os sistemas operacionais de servidor e Windows Vista / Windows 7. Se você seguir esse caminho, pode fazer com que o programa C # leia o log de events (consulte a class EventLog ) para procurar os dados desejados.

Nota: Começando com o vista você deve ser e (administrador do UAC elevado se necessário) lê-los do código.

Certifique-se de ter o WMI instalado ou ativado em seu PC, também certifique-se de adicionar uma referência a System.Management e System.Management.Instrumentation também. Há também uma GUI do aplicativo de script C # e VB WMI que você pode fazer o download para executar e testar consultas WMI e fazer o mesmo com o Google. Desde que eu trabalho para o Departamento de Defesa, há certas coisas que eu posso fazer a partir daqui, no que diz respeito à web, outras coisas estão bloqueadas, então por favor me perdoe se eu não postar certos links da web.

Aqui está algo para você começar

  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()); }