0

アクセスしたファイルのユーザー名を取得したい (追加、削除、名前変更など)。実際には、filesystemwatcher を使用してファイル アクセスを監視し、ディレクトリでオブジェクト アクセスを有効にして、イベント ログ経由でユーザー情報を取得しました。多くのファイル イベントがあり、イベント ログ メッセージはそれほど詳細ではないため、このソリューションは完全ではありません。書き込みデータの eventd ID は 1 つだけです。これは、ファイルの追加、名前の変更、移動、...すべての書き込みデータに使用されます。さらに、イベントログ メッセージが filesystemwatcher イベントと一致することをクロスチェックする必要がありました。私はこれをよりよく処理したいと思います。だから私はグーグル、読書に多くの時間を費やしています...スタックオーバーフローに別の投稿があることを知っています

開いているファイルのユーザー名を取得する

しかし、Windows イベントはユーザー名を取得できるため、可能な解決策があるはずだと思います。

いくつかのページを読んで、netapi32.dll を使用して可能な解決策があるはずであることを発見しました。http://vbcity.com/forums/t/133307.aspx?PageIndex=2のサンプル コード は機能しません。ファイルIDを取得できなかったので、コードを次のように変更しました

private ulong GetFileIdFromPath(string filePath)
{

  WinAPI.BY_HANDLE_FILE_INFORMATION objectFileInfo = new WinAPI.BY_HANDLE_FILE_INFORMATION();

  Thread.Sleep(200);

  FileInfo fi = new FileInfo(filePath);

  FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read);

  WinAPI.GetFileInformationByHandle(fs.Handle, out objectFileInfo);


  fs.Close();


 ulong fileIndex = ((ulong)objectFileInfo.FileIndexHigh << 32) + (ulong)objectFileInfo.FileIndexLow;

  return fileIndex; 

}

このコードではファイル ID を取得できますが、ファイル ID とサンプル コードではユーザー名を取得できません。

4

1 に答える 1

1

前回のプログラム(2週間前)から-ファイル(ユーザー名も)の変更を監査するように依頼されました

解決策はfilesystemwatcherによるもので、イベントの後に->ウィンドウのイベントログに移動し、Xpath検索を実行します-どのユーザーがアクションを実行したかを確認します。

   public static EventUnit DisplayEventAndLogInformation(string fileToSearch, DateTime actionTime)
        {
            StringBuilder sb = new StringBuilder();
            const string queryString = @"<QueryList>
  <Query Id=""0"" Path=""Security"">
    <Select Path=""Security"">*</Select>
  </Query>
</QueryList>";
            EventLogQuery eventsQuery = new EventLogQuery("Security", PathType.LogName, queryString);
            eventsQuery.ReverseDirection = true;
            EventLogReader logReader = new EventLogReader(eventsQuery);
            EventUnit e = new EventUnit();
            bool isStop = false;
            for (EventRecord eventInstance = logReader.ReadEvent(); null != eventInstance; eventInstance = logReader.ReadEvent())
            {
                foreach (var VARIABLE in eventInstance.Properties)
                    if (VARIABLE.Value.ToString().ToLower().Contains(fileToSearch.ToLower()) && actionTime.ToString("d/M/yyyy HH:mm:ss") == eventInstance.TimeCreated.Value.ToString("d/M/yyyy HH:mm:ss"))
                    {
                        foreach (var VARIABLE2 in eventInstance.Properties) sb.AppendLine(VARIABLE2.Value.ToString());
                        e.Message = sb.ToString();
                        e.User = (eventInstance.Properties.Count > 1) ? eventInstance.Properties[1].Value.ToString() : "n/a";
                        e.File = fileToSearch;
                        isStop = true;
                        break;
                    }
                if (isStop) break;
                try
                {
                    //    Console.WriteLine("Description: {0}", eventInstance.FormatDescription());
                }
                catch (Exception e2)
                {
                }
            }
            return e;
        }
于 2011-10-22T18:10:48.330 に答える