簡體   English   中英

以編程方式確定在Windows上上次修改文件的用戶?

[英]Programmatically determine user who last modified file on Windows?

我的任務是在C#中編寫一個簡單的命令行實用程序,它將監視服務器上的一個目錄,該目錄將由多個用戶訪問以復制/剪切/粘貼/查看數據。 我使用FileSystemWatcher來做這個,但它缺少一些功能。

是否可以確定用戶或至少從訪問/修改文件的位置確定計算機名稱

(注意:這不一定是FileSystemWatcher,我正在尋找任何方法來做到這一點。)

我認為你不能直接從C#監聽這個。 無論如何,並非沒有主機操作系統的幫助。 Windows和NTFS允許您審核特定目錄並在主機的安全事件日志中記錄訪問(因此托管共享的服務器必須審核,而不是客戶端)。

來自KB310399 - 如何在Windows XP中審核用戶對文件,文件夾和打印機的訪問

審核文件,文件夾和打印機的用戶訪問權限

審核日志顯示在事件查看器的安全日志中。 要啟用此功能:

  1. 依次單擊“開始”,“控制面板”,“性能和維護”,然后單擊“管理工具”。
  2. 雙擊“本地安全策略”。
  3. 在左窗格中,雙擊“本地策略”以展開它。
  4. 在左窗格中,單擊“審核策略”以在右窗格中顯示各個策略設置。
  5. 雙擊“審核對象訪問”。
  6. 要審核指定文件,文件夾和打印機的成功訪問,請選中“成功”復選框。
  7. 要審核對這些對象的不成功訪問,請選中“失敗”復選框。
  8. 要啟用兩者的審核,請選中兩個復選框。
  9. 單擊確定。

指定要審核的文件,文件夾和打印機

啟用審核后,您可以指定要審核的文件,文件夾和打印機。 為此:

  1. 在Windows資源管理器中,找到要審核的文件或文件夾。 要審核打印機,請單擊“開始”,然后單擊“打印機和傳真”以找到它。
  2. 右鍵單擊要審核的文件,文件夾或打印機,然后單擊“屬性”。
  3. 單擊“安全”選項卡,然后單擊“高級”。
  4. 單擊“審核”選項卡,然后單擊“添加”。
  5. 在“輸入要選擇的對象名稱”框中,鍵入要審核其訪問權限的用戶或組的名稱。 單擊“高級”,然后在“選擇用戶或組”對話框中單擊“立即查找”,可以瀏覽計算機以查找名稱。
  6. 單擊確定。
  7. 選擇要審核的操作的“成功”或“失敗”復選框,然后單擊“確定”。
  8. 單擊“確定”,然后單擊“確定”。

服務器操作系統和Windows Vista / Windows 7的過程類似。如果你走這條路,你可以讓C#程序讀取事件日志(參見EventLog類)來查找你想要的數據。

注意:從vista開始,您必須(並在需要時提升UAC)管理員才能從代碼中讀取它們。

確保在PC上安裝或啟用了WMI,同時確保添加對System.ManagementSystem.Management.Instrumentation的引用。 還有一個C#和VB WMI腳本應用程序GUI,您可以下載它以運行和測試WMI查詢以及Google那個。 由於我在國防部工作,我可以從這里得到一些關於網絡的其他事情被阻止的事情所以請原諒我,如果我不發布某些網絡鏈接。

這是讓你入門的東西

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM