12

私は、C#で、データのコピー/切り取り/貼り付け/表示のために複数のユーザーがアクセスするサーバー上のディレクトリを監視する簡単なコマンドラインユーティリティを作成するという任務を負っています。これを行うためにFileSystemWatcherを使用しましたが、いくつかの機能が不足しています。

ファイルがアクセス/変更されているユーザーまたは少なくともコンピューター名を特定することは可能ですか?

(注:これはFileSystemWatcherである必要はありません、私はこれを行うための任意の方法を探しています。)

4

2 に答える 2

7

これをC#から直接監視することはできないと思います。とにかくホストオペレーティングシステムの助けなしではありません。WindowsとNTFSを使用すると、特定のディレクトリを監査し、ホストマシンのセキュリティイベントログにアクセスを記録できます(したがって、共有をホストしているサーバーは、クライアントではなく監査する必要があります)。

KB310399から-WindowsXPでファイル、フォルダ、およびプリンタのユーザーアクセスを監査する方法

ファイル、フォルダー、およびプリンターのユーザーアクセスの監査

監査ログは、イベントビューアのセキュリティログに表示されます。この機能を有効にするには:

  1. [スタート]、[コントロールパネル]、[パフォーマンスとメンテナンス]、[管理ツール]の順にクリックします。
  2. [ローカルセキュリティポリシー]をダブルクリックします。
  3. 左側のペインで、[ローカルポリシー]をダブルクリックして展開します。
  4. 左側のペインで[ポリシーの監査]をクリックして、右側のペインに個々のポリシー設定を表示します。
  5. [オブジェクトアクセスの監査]をダブルクリックします。
  6. 指定したファイル、フォルダー、およびプリンターへのアクセスの成功を監査するには、[成功]チェックボックスをオンにします。
  7. これらのオブジェクトへのアクセスの失敗を監査するには、[失敗]チェックボックスをオンにします。
  8. 両方の監査を有効にするには、両方のチェックボックスを選択します。
  9. [OK]をクリックします。

監査するファイル、フォルダー、およびプリンターの指定

監査を有効にした後、監査するファイル、フォルダー、およびプリンターを指定できます。そうするために:

  1. Windowsエクスプローラーで、監査するファイルまたはフォルダーを見つけます。プリンタを監査するには、[スタート]をクリックし、[プリンタとFAX]をクリックしてプリンタを見つけます。
  2. 監査するファイル、フォルダー、またはプリンターを右クリックし、[プロパティ]をクリックします。
  3. [セキュリティ]タブをクリックし、[詳細]をクリックします。
  4. [監査]タブをクリックし、[追加]をクリックします。
  5. [選択するオブジェクト名を入力してください]ボックスに、アクセスを監査するユーザーまたはグループの名前を入力します。[詳細設定]をクリックし、[ユーザーまたはグループの選択]ダイアログボックスで[今すぐ検索]をクリックすると、コンピューターで名前を参照できます。
  6. [OK]をクリックします。
  7. 監査するアクションの[成功]または[失敗]チェックボックスをオンにして、[OK]をクリックします。
  8. [OK]をクリックし、[OK]をクリックします。

このプロセスは、サーバーオペレーティングシステムとWindows Vista / Windows 7でも同様です。この方法を使用すると、C#プログラムでイベントログ(EventLogクラスを参照)を読み取って、必要なデータを探すことができます。

注:ビスタから始めて、コードからそれらを読み取るには、(必要に応じてUACを昇格させた)管理者である必要があります。

于 2011-12-06T21:05:10.933 に答える
0

PCにWMIがインストールまたは有効になっていることを確認してください。また、System.Managementおよびへの参照も追加してくださいSystem.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());
    }  
于 2011-12-07T15:51:23.303 に答える