📄 subject_60700.htm
字号:
<hr size=1>
<blockquote><p>
回复者:Solon 回复日期:2003-11-14 23:04:10
<br>内容:一般都是按日志里位置偏移取值的。<BR>如:<BR>lpszComputerName = (TCHAR *)GlobalAlloc(GPTR, (_MAX_PATH + 1) * sizeof(TCHAR));<BR><BR>详细做法,看例子。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:swiq 回复日期:2003-11-15 09:32:09
<br>内容:是啊,按位置偏移取,可是那也得知道是在哪个位置里啊。 我取不出UserSid,按道理UserSid应该在ComputerName的后面,可是无论怎么取,取出来的都是空的。查看内存,那一段也是空的,什么也没有。只是对于不同的用户,比如:N/A,内存长度为0,对于SYSTEM,那一段的长度为12,还有一种长度为28的。而“分类”是在日志的哪一个位置上呢?如果不知道在哪一个位置上,怎么能够用偏移取出呢? 谢谢楼上!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:微笑的撒旦 回复日期:2003-11-16 00:38:57
<br>内容:1.你可以通过LookupAccountSid方便的得到用户这一项的string值:<BR>PSID psid = ptr->UserSidOffset+(LPBYTE)ptr;<BR>CHAR szAccName[256] = "\0";<BR>DWORD dwLen = 256;<BR>CHAR szDomainName[256] = "\0";<BR>DWORD dwDoLen = 256;<BR>SID_NAME_USE nameuse;<BR>LookupAccountSid(lpszComputerName, psid, szAccName, &dwLen,<BR> szDomainName, &dwDoLen, &nameuse);<BR>但是Category(分类)的string值会麻烦一点,你需要查注册表得到CategoryMessageFile这个Dll所在的具体路径,它在HKEY_LOCAL_MACHINE<BR> SYSTEM<BR> CurrentControlSet<BR> Services<BR> EventLog<BR> Application<BR> AppName<BR> Security<BR> System<BR> DriverName<BR> CustomLog<BR> AppName<BR>下。之后,你需要使用LoadLibrary和FormatMessage来得到这个字符串:<BR>if (strcmp(lpszSourceName, "Automatic Updates") == 0) {<BR> HANDLE handle = LoadLibrary("wuaueng.dll");<BR> char szBuffers[256] = {0};<BR> FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, handle,<BR> ptr->EventCategory, 0, szBuffers, 4096, NULL);<BR>}<BR>其中"wuaueng.dll"是上述system下的Automatic Updates的MessageFile。ptr->EventCategory是Category的ID,szBuffers取得的就是Category的string值。<BR><BR>2.ReadEventLog一次读出的并不是一条log记录,而是尽可能多的完整的记录。所以buff越大,一次读出的记录越多,而程序中把这许多记录只作为一条来处理。这个函数的使用在msdn上有解释,可以参考。<BR><BR>以下是修改后的代码,查找system的log,省略查注册表而直接使用"wuaueng.dll"。<BR>////////////////////////////////////////////////////////////<BR>// testlog.cpp : Defines the entry point for the console application.<BR>//<BR><BR>#include "stdafx.h"<BR>#include <Windows.h><BR><BR>int _tmain(int argc, _TCHAR* argv[])<BR>{<BR> HANDLE hdle;<BR> EVENTLOGRECORD *ptr;<BR> BYTE buff[40960]; //注:第二个问题;<BR> DWORD read_len, next_len;<BR> ptr=(EVENTLOGRECORD *)&buff;<BR> hdle=OpenEventLog("", /*"Application"*/"System");// System<BR> if (hdle==NULL)<BR> {<BR>// MessageBox("??????");<BR> }<BR> else <BR> {<BR> long mRet;<BR> char lpszSourceName[255]={0};<BR> char lpszComputerName[255]={0};<BR> unsigned uStepOfString;<BR> char* pStrings;<BR> char szExpandedString[1024]={0};<BR><BR> int i = 0;<BR> while(ReadEventLog(hdle,EVENTLOG_FORWARDS_READ|EVENTLOG_SEQUENTIAL_READ,<BR> 0,ptr,sizeof(buff),&read_len,&next_len)) <BR> {<BR> while (read_len > 0) {<BR> i++;<BR> mRet=ptr->EventID;//事件id<BR> mRet=ptr->EventType;//事件类型<BR><BR> mRet=ptr->TimeWritten;//<BR> mRet=ptr->NumStrings;//<BR> mRet=ptr->Length;//<BR> mRet=sizeof(EVENTLOGRECORD);<BR> strcpy(lpszSourceName, (LPTSTR)((LPBYTE)ptr +mRet));//事件源<BR> //////////////////////////////////////////////////////////////////////////<BR> if (strcmp(lpszSourceName, "Automatic Updates") == 0) {<BR> HANDLE handle = LoadLibrary("wuaueng.dll");<BR> char szBuffers[256] = {0};<BR> FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, handle,<BR> ptr->EventCategory, 0, szBuffers, 4096, NULL);<BR> }<BR> //////////////////////////////////////////////////////////////////////////<BR><BR> mRet+= strlen(lpszSourceName) + 1;<BR> strcpy(lpszComputerName, (LPTSTR)((LPBYTE)ptr + mRet));//机器名<BR> mRet+= strlen(lpszComputerName) + 1;<BR> if(ptr->UserSidLength>0){;}//<BR><BR> /////////////////////////////////////////////////////<BR> PSID psid = ptr->UserSidOffset+(LPBYTE)ptr;<BR> CHAR szAccName[256] = "\0";<BR> DWORD dwLen = 256;<BR> CHAR szDomainName[256] = "\0";<BR> DWORD dwDoLen = 256;<BR> SID_NAME_USE nameuse;<BR> LookupAccountSid(lpszComputerName, psid, szAccName, &dwLen,<BR> szDomainName, &dwDoLen, &nameuse);<BR> /////////////////////////////////////////////////////<BR><BR><BR> mRet=ptr->DataOffset-ptr->StringOffset;<BR> if (mRet>0)//事件描述<BR> {<BR> pStrings=new char[mRet];<BR> memcpy(pStrings,(LPBYTE)ptr+ptr->StringOffset,mRet);<BR> uStepOfString=0;<BR> for(int x=0;x<ptr->NumStrings;x++)<BR> {<BR> if(x==0)<BR> {<BR> strcpy(szExpandedString, (TCHAR *)pStrings + uStepOfString);<BR> if(x<(UINT)ptr->NumStrings - 1)strcat(szExpandedString, ",");<BR> }<BR> else strcat(szExpandedString, pStrings + uStepOfString);<BR> uStepOfString = strlen(pStrings + uStepOfString) + 1;<BR> }<BR><BR> delete [] pStrings;<BR> }<BR> // MessageBox(lpszSourceName,szExpandedString);<BR> read_len -= ptr->Length;<BR> ptr = (EVENTLOGRECORD *)((LPBYTE)ptr + ptr->Length);<BR> }<BR> ptr=(EVENTLOGRECORD *)&buff;<BR> }<BR> CloseEventLog(hdle);<BR> }<BR> return 0;<BR>}<BR><BR><BR><BR>2003-11-16 0:40:26
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -