- PR -

ファイル監視について

投稿者投稿内容
take
会議室デビュー日: 2005/09/01
投稿数: 11
投稿日時: 2005-12-08 14:26
ファイル監視についてですが、現在C#でSystemFileWatcherで利用してイベントを取得
しているのですが、ファイルを開いたイベントやコピーが行われた際のイベントが
得られず困っております。具体的には最終更新日を張っているのですが分解能が1日
の為1日一回しかイベントが受け取れず対処に困っております。
又、過去ログでGetFileSecurityを利用する事で誰がアクセスしたのかが取れる様な
記述を見付けましたが、アクセス者の情報まで取得出来るのでしょうか?
現在、GetFileSecurityが動作せず{戻り(aaa)が偽}検証出来ずにおります。

ファイルを開いた、コピーした際のイベントの受け取り方、GetFileSecurityに
ついてご存知の方おられましたらご教授願います。

環境 Windows XP
言語 C#

// ACL の定義
[StructLayout(LayoutKind.Sequential)]
public struct ACL
{
public byte AclRevision;
public byte Sbz1;
public int AclSize;
public int AceCount;
public int Sbz2;
}

// SECURITY_DESCRIPTOR の定義
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_DESCRIPTOR
{
public byte Revision;
public byte Sbz1;
public int Control;
public int Owner;
public int Group;
public ACL Sacl;
public ACL Dacl;
}

// InitializeSecurityDescriptor の宣言
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool InitializeSecurityDescriptor(ref SECURITY_DESCRIPTOR pSecurityDescriptor, uint dwRevision);

// GetFileSecurity の宣言
[DllImport("advapi32.dll")]
public static extern int GetFileSecurity(string lpFileName, int RequestedInformation, [MarshalAs(UnmanagedType.Struct)] ref SECURITY_DESCRIPTOR pSecurityDescriptor, int nLength, int lpnLengthNeeded);

#使用箇所
SECURITY_DESCRIPTOR psd = new SECURITY_DESCRIPTOR();
bool binitSD = InitializeSecurityDescriptor(ref psd, 1);

aaa = GetFileSecurity(e.FullPath, 1, ref psd, 1000, sdsize);

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-09 00:31
引用:

takeさんの書き込み (2005-12-08 14:26) より:

現在C#でSystemFileWatcherで利用してイベントを取得しているのですが、
ファイルを開いたイベントやコピーが行われた際のイベントが得られず困っております。


FileSystemWatcher ではないのですか?

引用:

具体的には最終更新日を張っているのですが分解能が1日
の為1日一回しかイベントが受け取れず対処に困っております。


こちらの意味が判りませんでした。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
take
会議室デビュー日: 2005/09/01
投稿数: 11
投稿日時: 2005-12-09 15:17
仰る通りFileSystemWatcherの記述ミスです。

分解能が1日の為とは以下のMSのサイトを見て貰うと判るのですが、処理の最小単位
が1日の為、ファイルを開いた際のイベント(最終アクセス日)を取得しようとすると、
同日内で2回目以降のアクセスは日付が変わらない為イベントが発生しない。という
事です。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpsysinf/html/_win32_getfiletime.asp

きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-12-09 17:23
takeさん、こんばんは。

引用:

分解能が1日の為とは以下のMSのサイトを見て貰うと判るのですが、処理の最小単位
が1日の為、ファイルを開いた際のイベント(最終アクセス日)を取得しようとすると、


FAT なんですか?
リンク先のドキュメントには
引用:

NTFS では、アクセス時刻の分解能は 1 時間です。


とありますので、NTFS に CONVERT してみる、というのはダメでしょうか。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-12-09 17:28
引用:

FAT なんですか?
(略)
とありますので、NTFS に CONVERT してみる、というのはダメでしょうか。



ですね。

それで不足なら、自分でポーリングをするとか、システム監査機能を使ってどうにかするとか、そういう感じになると思います。
take
会議室デビュー日: 2005/09/01
投稿数: 11
投稿日時: 2005-12-09 17:44
いや、私の環境はNTFSですから厳密には1時間ですが、分解能が1日(1時間)
の為最終アクセスから1時間以上経過しないと最終アクセスのChangeイベント
が取得出来ません。
実際にファイルを開いて頂ければ判ると思いますが、1時間以上アクセスして
いないファイルを開くと最終アクセス(アクセス日時)が更新されます。
この際はChangeイベントが走りますが、その後1時間経過しない状態でファイル
を開いても最終アクセスが更新されません。この為イベントが走りません。

ポーリングを掛けるにしても最終アクセスが更新されていないので同様です。

渋木宏明(ひどり)様

システム監査に関してはXPでも可能なのでしょうか?
ローカルセキュリティポリシーにてオブジェクトへの成功/失敗を監視する設定
にしたのですが、監視対象のディレクトリでプロパティを開いても監査系のタブ
が存在しないのですが、何か設定等あるのでしょうか?



渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-12-09 18:10
引用:

システム監査に関してはXPでも可能なのでしょうか?



できるはずです。

引用:

ローカルセキュリティポリシーにてオブジェクトへの成功/失敗を監視する設定
にしたのですが、監視対象のディレクトリでプロパティを開いても監査系のタブ
が存在しないのですが、何か設定等あるのでしょうか?



エクスプローラの「フォルダオプション」で「簡易ファイル共有」か何かのオプションを外せば「セキュリティ」タブが表示されるようになるはずです。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-12-09 18:12
引用:

takeさんの書き込み (2005-12-09 17:44) より:
最終アクセスから1時間以上経過しないと最終アクセスのChangeイベント
が取得出来ません。


ああ、1日が1時間でもダメなわけですね。失礼しました。

スキルアップ/キャリアアップ(JOB@IT)