- PR -

C#でイベントログの「セキュリティログ」に書き込みたい

1
投稿者投稿内容
おむすび君
常連さん
会議室デビュー日: 2005/03/11
投稿数: 29
投稿日時: 2005-05-23 13:48
どなたか方法ご存知の方、教えてください。


以下によるとセキュリティログ読み取り専用ですと記載されているものの
じゃあどうすればよいかが書かれておらず、困っております。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdiagnosticseventlogclasstopic.asp

よろしくお願いします!
そうまさん
常連さん
会議室デビュー日: 2003/07/17
投稿数: 27
お住まい・勤務地: ジャポン
投稿日時: 2005-05-24 11:00
イベントログに関しては過去ログにもたくさんあるようなので、
一度検索してみてはいかがでしょうか?

ちなみにASP.NETアプリケーションの例ですが、
書込みエラーの対処法です。

http://support.microsoft.com/?id=329291
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-05-24 12:47
おむすび君さん、こんにちは。

引用:

以下によるとセキュリティログ読み取り専用ですと記載されているものの
じゃあどうすればよいかが書かれておらず、困っております。


どうすれば…って、だから勝手に書き込んではいけないって事なんじゃないですか?
おむすび君
常連さん
会議室デビュー日: 2005/03/11
投稿数: 29
投稿日時: 2005-05-24 13:03
ご回答ありがとうございます。

一応、イベントログとセキュリティログは検索してみたのですが
求めていたものが無かった(と思う)ので質問させていただきました。

普通C#でイベントログに書こうと思ったらEventlogクラスを使うと思います。
そのクラスは、アプリケーションログ、システムログ、その他任意ログetcは
書けるのですがセキュリティログについては機能として提供されておらず、
書けないと思っています。

では、どうすれば書けるようになるのでしょうか?
知ってる方教えて下さい。
というのが質問でした。わかりずらくてすみません。
宜しくお願いいたします。

おむすび君
常連さん
会議室デビュー日: 2005/03/11
投稿数: 29
投稿日時: 2005-05-24 13:05
>>きくちゃんさん
そうですね。
そうまさん
常連さん
会議室デビュー日: 2003/07/17
投稿数: 27
お住まい・勤務地: ジャポン
投稿日時: 2005-05-24 13:13
おおお・・・

セキュリティログとイベントログ勘違いしていました。
すいません。。
おむすび君
常連さん
会議室デビュー日: 2005/03/11
投稿数: 29
投稿日時: 2005-07-22 14:37
ちょっと古い投稿ですが
解決した。というかやはり.NETライブラリではできないみたい?で
結局 P/Invoke でしたか?昔のライブラリとかを使って実現しました。


以下長いですが

コード:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace SecLogProto
{
	public class SecurityLog
	{
		/// <summary>
		/// ログ出力には以下に同名のキーが必要
		/// HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Security
		/// </summary>
		const string APP_NAME                = "SecLogProto";

		const int    TOKEN_QUERY             = 0x00000008;
		const int    TOKEN_ADJUST_PRIVILEGES = 0x00000020;
		const string SE_SECURITY_NAME        = "SeSecurityPrivilege";
		const string SE_AUDIT_NAME           = "SeAuditPrivilege";
		const int    SE_PRIVILEGE_ENABLED    = 0x00000002;

		const ushort EVENTLOG_INFORMATION_TYPE = 0x0004;

		[DllImport("advapi32.dll")]
		private static extern bool OpenProcessToken(IntPtr ProcessHandle,int DesiredAccess,ref IntPtr TokenHandle);

		[DllImport("advapi32.dll")]
		private static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, ref long lpLuid);
		
		[DllImport("advapi32.dll") ]
		private static extern bool AdjustTokenPrivileges(
			IntPtr TokenHandle, 
			bool DisableAllPrivileges,
			ref TOKEN_PRIVILEGES NewState, 
			int BufferLength,
			IntPtr PreviousState,
			IntPtr ReturnLength 
			);
		
		[DllImport("advapi32.dll") ]
		private static extern IntPtr RegisterEventSource(string lpUNCServerName, string lpSourceName);

		[DllImport("advapi32.dll") ]
		private static extern bool DeregisterEventSource(IntPtr hEventLog);

		[DllImport("advapi32.dll", EntryPoint="ReportEventW", CharSet=CharSet.Unicode)]
		private static extern bool ReportEvent(
			IntPtr hEventLog,
			ushort   wType,
			ushort   wCategory,
			int      dwEventID,
			IntPtr   lpUserSid,
			ushort   wNumStrings,
			int      dwDataSize,
			string[] lpStrings,
			IntPtr   lpRawData
			);

		[StructLayout(LayoutKind.Sequential, Pack=4)]
		public struct TOKEN_PRIVILEGES
		{
			public int PrivilegeCount;
			public LUID_AND_ATTRIBUTES Privileges;
		}

		[StructLayout(LayoutKind.Sequential, Pack=4)]
			public struct LUID_AND_ATTRIBUTES
		{
			public long Luid;
			public int Attributes;
		}

		public SecurityLog()
		{
			IntPtr hToken = IntPtr.Zero;
			OpenProcessToken( Process.GetCurrentProcess().Handle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref hToken );

			EnablePrivilege( hToken, SE_SECURITY_NAME );
			EnablePrivilege( hToken, SE_AUDIT_NAME );
		}

		private void EnablePrivilege( IntPtr hToken, string name )
		{
			long LUID = 0;
			LookupPrivilegeValue( null, name, ref LUID );

			TOKEN_PRIVILEGES tp = new TOKEN_PRIVILEGES();
			tp.PrivilegeCount = 1;
			tp.Privileges = new LUID_AND_ATTRIBUTES();
			tp.Privileges.Luid = LUID;
			tp.Privileges.Attributes = SE_PRIVILEGE_ENABLED;

			AdjustTokenPrivileges( hToken, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero );
		}

		public void Write( string message )
		{
			IntPtr hEventLog = RegisterEventSource( null, APP_NAME );
			ReportEvent( hEventLog, EVENTLOG_INFORMATION_TYPE, 0, 1001, IntPtr.Zero, 1, 0, new string[]{ message }, IntPtr.Zero );
			DeregisterEventSource(hEventLog);
		}
	}
}



あとこんな感じのレジストリが必要です。
コード:
[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Security\\XXXXXX]
"EventMessageFile"="C:\\\\WINNT\\\\Microsoft.NET\\\\Framework\\\\v1.1.4322\\\\EventLogMessages.dll"
"TypesSupported"=dword:00000007



1

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