<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Windows Security Logging and Other Esoterica</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/ericfitz/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/ericfitz/feed.xml</link>
    <description>thoughts from the Windows auditing team</description>
    <lastBuildDate>Sat, 04 Apr 2015 02:58:38 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Farewell for now...</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/farewell-for-now</link>
      <pubDate>Sun, 10 Jun 2012 22:44:09 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2012/06/10/farewell-for-now/</guid>
      <description><![CDATA[I have resigned from Microsoft and am moving to another company. &nbsp;I hope my blog has been...]]></description>
      <content:encoded><![CDATA[<p>I have resigned from Microsoft and am moving to another company. &nbsp;I hope my blog has been helpful to you all!</p>
<p>Feel free to contact me at my hotmail address (eric_fitzgerald). &nbsp;I'll be up and blogging somewhere else soon.</p>
<p>Best regards,</p>
<p>Eric</p>]]></content:encoded>
    </item>
    <item>
      <title>Off Topic: Unicode Right-to-Left Override character used by malware</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/off-topic-unicode-right-to-left-override-character-used-by-malware</link>
      <pubDate>Mon, 22 Aug 2011 13:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2011/08/22/off-topic-unicode-right-to-left-override-character-used-by-malware/</guid>
      <description><![CDATA[Here's an interesting thing for you security types to be aware of.&nbsp; Many of you probably are...]]></description>
      <content:encoded><![CDATA[<p>Here's an interesting thing for you security types to be aware of.&nbsp; Many of you probably are careful to screen attachment types to make sure that you don't unintentionally execute code that might be malicious.</p>
<p>Malware authors have discovered that by embedding a unicode control character in file names, they can cause the file name to read right-to-left (instead of the normal English left-to-right) and therefore obfuscate file extensions.</p>
<p>For example, "innocuous_cod.exe" could have the RLO character inserted after the underscore, and then it would read as "innocuous_exe.doc" (everything after the "_" is read right-to-left).</p>
<p>Here's a write-up with links to detected variants: <a href="https://blog.commtouch.com/cafe/malware/exe-read-backwards-spells-malware/">https://blog.commtouch.com/cafe/malware/exe-read-backwards-spells-malware/</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>An interesting logging regulation that doesn't apply to Windows event logs...</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/an-interesting-logging-regulation-that-doesnt-apply-to-windows-event-logs</link>
      <pubDate>Fri, 27 May 2011 10:08:00 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2011/05/27/an-interesting-logging-regulation-that-doesnt-apply-to-windows-event-logs/</guid>
      <description><![CDATA[I was browsing around looking for logging regulations and stumbled across this.&nbsp; It's the...]]></description>
      <content:encoded><![CDATA[<p>I was browsing around looking for logging regulations and stumbled across <a target="_blank" href="https://www.regulations.gov/#!searchResults;dct=FR;a=NHTSA;rpp=10;po=0;s=NHTSA-2006-25666" title="US NHTSA EDR Rule">this</a>.&nbsp; It's the United State's federal regulation on EDRs - Event Data Recorders - installed in automobiles.</p>
<p>EDRs are little log engines, like the "black box" flight data recorders on commercial airliners.&nbsp; They are typically part of the airbag system on an automobile. They record specific data about the operation of the vehicle including speed, etc., and they record incident data like airbag sensor activation or airbag deployment.</p>
<p>Anyway, if you want to see an example of a really different kind of logging, the PDF document of NHTSA rule 2006-25666 describes what data must be logged, and how often (sampling rate), and retention policy.</p>
<p>Sample logs are available <a href="https://www.nhtsa.gov/EDR">here</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Decoding UAC Flags Values in events 4720, 4738, 4741, and 4742</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/decoding-uac-flags-values-in-events-4720-4738-4741-and-4742</link>
      <pubDate>Thu, 28 Apr 2011 11:19:12 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2011/04/28/decoding-uac-flags-values-in-events-4720-4738-4741-and-4742/</guid>
      <description><![CDATA[In Windows Vista, Windows Server 2008, Windows 7, and Windows Server 2008 R2, there are four events...]]></description>
      <content:encoded><![CDATA[<p>In Windows Vista, Windows Server 2008, Windows 7, and Windows Server 2008 R2, there are four events that contain a user account control (UAC) flags value:</p>
<ul>
<li>4720 - user account creation</li>
<li>4738 - user account change</li>
<li>4741 - computer account creation</li>
<li>4742 - computer account change</li>
</ul>
<p>This value is a bitmask value, and it's represented in textual format as&nbsp;a hexadecimal value, e.g. 0x1234.</p>
<p>The "decoder key" for this value is in Knowledge Base article <a href="https://support.microsoft.com/kb/305144" title="KB article 305144">305144</a>.&nbsp; If you're a developer type, the actual declaration is in IADS.H in the Windows SDK.</p>
<p>Ned points out that the article is missing an entry:</p>
<p>0x04000000 - PARTIAL_SECRETS_ACCOUNT&nbsp; (i.e. "Read-Only Domain Controller")</p>
<p>I also want to point out that Windows will set the undeclared value 0x4.&nbsp; I don't know what this value does, if anything.</p>
<p>To decode this value, you can go through the property&nbsp;value definitions in the KB article&nbsp;from largest to smallest.&nbsp; Compare each property value to the flags value in the event.&nbsp; If the flags&nbsp;value in the event is greater than or&nbsp;equal to&nbsp;the property value, then the property is "set" and applies to that event.&nbsp; Subtract the property value from the flags value in the event and note that the flag applies and then go on to the next flag.&nbsp; Here's an example:</p>
<p>Flags value from event: 0x15</p>
<p>Decoding:</p>
<ul>
<li>PASSWD_NOTREQD 0x0020</li>
<li>LOCKOUT 0x0010</li>
<li>HOMEDIR_REQUIRED 0x0008</li>
<li>(undeclared) 0x0004</li>
<li>ACCOUNTDISABLE&nbsp;&nbsp;0x0002</li>
<li>SCRIPT 0x0001</li>
</ul>
<p>0x0020 &gt; 0x15, so PASSWD_NOTREQD does not apply to this event</p>
<p>0x10 &lt; 0x15, so LOCKOUT applies to this event.&nbsp;&nbsp; 0x15 - 0x10 = 0x5 </p>
<p>0x4 &lt; 0x5, so the undeclared value is set.&nbsp; We'll pretend it doesn't mean anything.&nbsp;&nbsp; 0x5 - 0x4 = 0x1</p>
<p>0x2 &gt; 0x1, so ACCOUNTDISABLE does not apply to this event</p>
<p>0x1 = 0x1, so SCRIPT applies to this event.&nbsp; 0x1 - 0x1 = 0x0, we're done.</p>
<p>So&nbsp;this&nbsp;UAC flags value decodes to: LOCKOUT and SCRIPT.</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Auditing Changes to Audit Policy</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/auditing-changes-to-audit-policy</link>
      <pubDate>Fri, 16 Jul 2010 13:21:46 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2010/07/16/auditing-changes-to-audit-policy/</guid>
      <description><![CDATA[Mitsuru, one of our support engineers in Japan, actually did some excellent&nbsp;research recently...]]></description>
      <content:encoded><![CDATA[<p>Mitsuru, one of our support engineers in Japan, actually did some excellent&nbsp;research recently into exactly what our behavior is for auditing audit policy and I wanted to share that with you.</p>
<p>In Windows, we've always had auditing for changes to security policy.&nbsp; Audit policy has always been one aspect of that policy.</p>
<p>However, it's not so clear how to audit changes to audit policy.&nbsp; The reason is, because the change itself might affect whether or not the audit is generated.&nbsp; Usually in Windows, we generate audit after the operation that we are auditing, is performed.&nbsp; When we generate audit, we always check audit policy to see if we need to generate an event.</p>
<p>So what would happen if you turned off the setting "audit changes to audit policy"?&nbsp; Well, if we implemented it in the way we generally implement audit policy, nothing would happen- no event.&nbsp; As described above, if we checked audit policy after we disabled audit policy, then the effective policy would say "don't generate audit".</p>
<p>But consider the case where a malicious audit or system administrator wants to cover their tracks.&nbsp; One thing such a person might do, to not leave as much of a trace, is to disable audit policy before they do the bad thing, and re-enable it afterwards.&nbsp; If we implemented audit normally, then there would be no trace of this.</p>
<p>To avoid this undesirable case, we changed around the instrumentation a little so that we always generate audit for certain audit policy change events.&nbsp; This means that you might not get EXACTLY what you intended, but it also ensures that you can always find the significant events when someone disables&nbsp; audit policy.</p>
<p>Anyway, to sum up, the following events are always audited when audit policy is disabled regardless of the "Audit Policy Change" subcategory setting in Windows Vista+:</p>
<p>4715 The audit policy (SACL) on an object was changed.<br />4719 System audit policy was changed.<br />4906 The CrashOnAuditFail value has changed.<br />4908 Special Groups Logon table modified.<br />4912 Per User Audit Policy was changed.</p>
<p>The following events are only audited when success auditing is enabled for the "Audit Policy Change" subcategory:<br />4902 The Per-user audit policy table was created.<br />4904 An attempt was made to register a security event source.<br />4905 An attempt was made to unregister a security event source.<br />4907 Auditing settings on object were changed.</p>
<p>Special thanks to Mitsuru for documenting this.</p>]]></content:encoded>
    </item>
    <item>
      <title>XPath to generate a list of NTLM authentications on Windows Vista or Later</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/xpath-to-generate-a-list-of-ntlm-authentications-on-windows-vista-or-later</link>
      <pubDate>Thu, 13 May 2010 15:51:00 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2010/05/13/xpath-to-generate-a-list-of-ntlm-authentications-on-windows-vista-or-later/</guid>
      <description><![CDATA[Hi Everyone,
Sas sent me an email complaining that I am not posting as often as I should- sorry...]]></description>
      <content:encoded><![CDATA[<P>Hi Everyone,</P>
<P>Sas sent me an email complaining that I am not posting as often as I should- sorry about that.&nbsp; I am working on a different project now but I am still in close touch with the auditing team and I'll try to do better.</P>
<P>Anyway a question that I hear regularly is, "how do I find all the NTLM authentications on my network"?</P>
<P>Other than running a network trace, the best way I have found (ok invented :-)&nbsp; to do this is to look at the logon events in the audit log.</P>
<P>One of the changes we made to the logon events in Windows Vista (and therefore&nbsp;subsequent releases of Windows) was to include the NTLM protocol level in the logon events, if the NTLM auth package was used.</P>
<P>Now, with the new EventLog ecosystem, it's easy to generate some XPath to find just these events.</P>
<P>Here's the query:</P>
<P>
<TABLE style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-COLLAPSE: collapse; BACKGROUND: #f2f2f2; BORDER-TOP: medium none; BORDER-RIGHT: medium none; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-border-alt: solid windowtext .5pt" class=MsoTableGrid border=1 cellSpacing=0 cellPadding=0 class="MsoTableGrid">
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 286.25pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt" vAlign=top width=382>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt">*[System<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>[Provider<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>[@Name='Microsoft-Windows-Security-Auditing']<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>and Task = 12544<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>and (band(Keywords,9007199254740992))<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>and (EventID=4624)<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>]<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>and<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>EventData<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>[Data<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>[@Name='LmPackageName'] != '-'<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>]<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes"></SPAN></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 9pt"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>]<o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE></P>
<P mce_keep="true">&nbsp;</P>
<P>To use this in Event Viewer:</P>
<OL>
<LI>Find the Security log under Windows Logs in the tree pane.</LI>
<LI>Right-click the Security log, and choose "Filter Current Log..."</LI>
<LI>Select the "XML" tab.</LI>
<LI>Check the "Edit query manually" box.</LI>
<LI>Replace the default query ("*", or everything in the "&lt;Select&gt;" element), with the text in the box above.&nbsp; I've formatted it for readability.</LI>
<LI>Click OK</LI></OL>
<P>The event view will now be filtered and you'll only see NTLM logon events.&nbsp; Additionally, each filtered event will contain a "Detailed Authentication Information" section containing the protocol level&nbsp;(e.g. LM, NTLM, NTLM V2) in the "Package Name" field, and the session key length, if one was negotiated.</P>
<P>
<TABLE style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-COLLAPSE: collapse; BACKGROUND: #f2f2f2; BORDER-TOP: medium none; BORDER-RIGHT: medium none; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-border-alt: solid windowtext .5pt" class=MsoTableGrid border=1 cellSpacing=0 cellPadding=0 class="MsoTableGrid">
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 286.25pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt" vAlign=top width=382><SPAN lang=EN>
<P>Detailed Authentication Information:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logon Process: NtLmSsp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Authentication Package: NTLM<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transited Services: -<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Package Name (NTLM only): NTLM V2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key Length: 128</P></SPAN></TD></TR></TBODY></TABLE></P>
<P mce_keep="true">&nbsp;</P>]]></content:encoded>
    </item>
    <item>
      <title>Auditing system impact on performance</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/auditing-system-impact-on-performance</link>
      <pubDate>Mon, 10 Aug 2009 10:26:00 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2009/08/10/auditing-system-impact-on-performance/</guid>
      <description><![CDATA[UPDATE 2010-06-06 (EricF) - Fixed Vista+ architecture image; link was broken on migration to new...]]></description>
      <content:encoded><![CDATA[<p><span style="color: #ff0000;"><em>UPDATE 2010-06-06 (EricF) - Fixed Vista+ architecture image; link was broken on migration to new blog platform</em></span></p>
<p>I get questions from time to time, such as my recent offline question from Steve, about what performance impact auditing has on the system as a whole.</p>
<p>To answer this you need to understand a couple of things:</p>
<ol>
<li>Auditable activity is implemented as instrumentation (e.g. a function call to the auditing system) inside the code that does something auditable.</li>
<li>The auditing system in Windows has two sets of&nbsp;programmatic interfaces for introducing an event, one in kernel mode and one in user mode - so the component generating audit does not need to switch between kernel and user modes.</li>
<li>Although audit policy is stored in user mode, we cache a copy of the relevant policy for kernel-mode components, in kernel mode.&nbsp; This means that no mode switch is necessary to check audit policy to decide whether to generate an event.</li>
<li>There are user-mode and kernel-mode queues for audit events.&nbsp; The call to generate an audit event actually just queues the event, assuming the queue is not full.&nbsp; So from the perspective of the component generating audit, audit has an "asynchronous" flavor under light-medium loads.&nbsp; Under heavy loads when the queues fill, audit blocks the component raising the audit until the event can be queued, showing its true synchronous behavior.</li>
<li>Dequeuing audit events always occurs on a separate thread than enqueueing so that raising audit events and writing them to the log don't affect each other's perf under light to moderate load.</li>
<li>The pre-Vista auditing system in the kernel delivers events to LSA.&nbsp; The Vista+ auditing system in the kernel delivers most events directly to ETW, the kernel mode event trace engine, which means that most of the kernel audit (including the potentially perf impacting object access events) doesn't require a mode switch at all.</li>
<li>The LSA formats events and then delivers them to the event log.&nbsp; In WS03, events are batched in the RPC call to eventlog.&nbsp; In Vista+,&nbsp;delivery is done by means of ETW in almost all cases.</li>
<li>ETW queues events and spools them to the Windows eventlog service as fast as the service will accept them.</li>
<li>The eventlog service writes the events to the log file as they arrive.</li>
</ol>
<p>I have uploaded graphics of the Windows XP/Windows Server 2003 auditing architecture, and the Windows Vista/WS08/Windows 7 architecture, to make this process more clear:</p>
<p><img height="468" width="953" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/09/86/33/78/Windows%20Server%202003%20Auditing%20Architecture.jpg" original-url="https://blogs.msdn.com/photos/ericf/images/9863378/original.aspx" alt="Pre-Vista Windows Auditing Architecture" title="Pre-Vista Windows Auditing Architecture" style="width: 953px; height: 468px;" /></p>
<p>&nbsp;</p>
<p><strong>Windows Vista+ Auditing Architecture</strong></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/41/14/Images/2330.Windows%20Vista%20Auditing%20Architecture%20(public).jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-41-14-Images/2330.Windows-Vista-Auditing-Architecture-_2800_public_2900_.jpg" border="0" /></p>
<p>&nbsp;</p>
<p>So now back to the original question- what is the impact of auditing on performance?</p>
<p>At low auditing loads, auditing generally has no discernable impact on perf.&nbsp; If you were hardcode with a profiler and iterated an auditable activity a million times I am sure you'd be able to measure it, but for reasonable audit policies you won't notice a significant difference.</p>
<p>At high auditing loads, auditing has a significant performance impact.&nbsp; This is more true of pre-Vista multiprocessor systems than of systems with the new eventlog system.</p>
<p>For example, a multi-processor domain controller (say a 32-processor box) running Windows Server 2003, might run into problems under extreme load.&nbsp; Why is that?&nbsp; Because ultimately the limiting factor on event rate is how fast you can write the events to disk.&nbsp; Pre-Vista eventlog has a single thread writing events to disk.&nbsp; So even though you might have 32 threads servicing authentication requests (an auditable activity), each of them is queueing to a single audit queue which is ultimately despooling to eventlog via RPC on a single thread, and eventlog is only writing to the security log with a single thread.&nbsp; What we observe in practice in this case is that a single processor on the system goes to 85-100% utilization, and the other processors drop to a very low utilization as the authentication threads are blocked waiting for the audit function call to return.&nbsp; This call won't return until the queue is not full, and the queue is waiting on RPC which is waiting on eventlog...&nbsp; so eventlog governs the rate.</p>
<p>In Windows Server 2003, we added a particular optimization only for the security event log, which batches events in the RPC call to eventlog.&nbsp; This means that you can get more event throughput in the security log than in other logs on the system.&nbsp; It didn't eliminate the bottleneck, but it pushed back the limit, so WS03 on typical hardware should be able to log several thousand events per second to the security event log.&nbsp; Previous versions were only able to log about 1000 events per second.</p>
<p>Note that the change in performance characteristics occurs all at once.&nbsp; So the impact tends to be trivial until the queues fill, at which point the impact is severe.&nbsp; It does not scale linearly, there's a discrete behavior change.&nbsp; What this means realistically is that if you ever encounter&nbsp;a performance problem with auditing, then you probably just need to turn it down a little and you won't have a problem&nbsp;any more.&nbsp;</p>
<p>In Vista and subsequent releases, audit queues events via ETW.&nbsp; ETW was designed for high-performance kernel tracing, and in the auditing team we tested it to over 10,000 (10.000 for you folks in Germany :-)&nbsp;events per second before we decided that we had hit our scale targets.&nbsp; We never tested exactly how high it would go, but we were satisfied that the eventlog service was no longer a bottleneck in realistic scenarios.</p>
<p>There are some edge cases where you might run into performance problems by trying to audit too much in a critical path.&nbsp; For instance, it is a really really bad idea to put SACLs on your entire registry.&nbsp; If you monitor registry activity with a tool like <a href="https://technet.microsoft.com/en-us/sysinternals/bb896645.aspx" title="SysInternals Process Monitor">Process Monitor</a>, you will notice that when a system is not idle, there are often&nbsp;hundreds or thousands of registry accesses per second.&nbsp; If you impose an auditing tax on each of those activities you will notice a degradation in performance.&nbsp; Not to mention that the resultant mountain of events is probably not very valuable.&nbsp; Of course you can <a href="https://blogs.msdn.com/ericfitz/archive/2005/01/11/keeping-the-noise-down-in-your-security-log.aspx" title="Eric's Blog">tune SACLs</a> as I have mentioned before, but I doubt that it's useful to take the time to tune SACLs for the entire registry.</p>
<p>One last point is that the eventlog is writing the events somewhere.&nbsp; Wherever it is writing events, it is consuming disk I/Os and competing with anything else writing to the same volume.&nbsp; If you have a disk performance problem on that disk, it can result in an auditing performance problem, as everything else will back up if the eventlog can't write events to disk fast enough.&nbsp; So one thing you can do is ensure that the disk where your log is placed has enough I/Os.</p>
<p>In summary audit has very minimal impact unless you do a whole lot of it, in which case it can have severe impact on your system.&nbsp; The change happens suddenly, not gradually, so you can do a lot of auditing with no problem.&nbsp; If you run into a problem, turn it down just a little (or little by little) and at some point the behavior will change such that you won't have any significant perf impact anymore.</p>]]></content:encoded>
    </item>
    <item>
      <title>Mapping pre-Vista Security Event IDs to Security Event IDs in Vista+</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/mapping-pre-vista-security-event-ids-to-security-event-ids-in-vista</link>
      <pubDate>Wed, 10 Jun 2009 19:09:00 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2009/06/10/mapping-pre-vista-security-event-ids-to-security-event-ids-in-vista/</guid>
      <description><![CDATA[I've written twice (here and here) about the relationship between the "old" event IDs (5xx-6xx) in...]]></description>
      <content:encoded><![CDATA[<P>I've written twice (<A title="Vista Security Events Get Noticed" href="https://blogs.msdn.com/ericfitz/archive/2007/04/18/vista-security-events-get-noticed.aspx" mce_href="https://blogs.msdn.com/ericfitz/archive/2007/04/18/vista-security-events-get-noticed.aspx">here</A> and <A title="Documentation on the New Security Events" href="https://blogs.msdn.com/ericfitz/archive/2007/07/31/documentation-on-the-windows-vista-and-windows-server-2008-security-events.aspx" mce_href="https://blogs.msdn.com/ericfitz/archive/2007/07/31/documentation-on-the-windows-vista-and-windows-server-2008-security-events.aspx">here</A>) about the relationship between the "old" event IDs (5xx-6xx) in WS03 and earlier versions of Windows, and between the "new" security event IDs (4xxx-5xxx)&nbsp;in Vista and beyond.</P>
<P>In short, EventID(WS03) + 4096 = EventID(WS08) for almost all security events in WS03.</P>
<P>The exceptions are the logon events.&nbsp; The logon success events (540, 528) were collapsed into a single event 4624 (=528 + 4096).&nbsp; The logon failure events (529-537, 539) were collapsed into a single event 4625 (=529+4096).</P>
<P>Other than that, there are cases where old events were deprecated (IPsec IIRC), and there are cases where new events were added (<A title="DS Auditing in WS08" href="https://technet.microsoft.com/en-us/library/cc731607.aspx" mce_href="https://technet.microsoft.com/en-us/library/cc731607.aspx">DS Change</A>).&nbsp; These are all new instrumentation and there is no “mapping” possible- e.g. the new DS Change audit events are complementary to the old DS Access events; they record something different than the old events so you can’t say that the old event xxx = the new event yyy because they aren’t equivalent.&nbsp; The old event means one thing and the new event means another thing; they represent different points of instrumentation in the OS, not just formatting changes in the event representation in the log.</P>
<P>Of course I explained earlier <A title="Why we renumbered the security events in Vista" href="https://blogs.msdn.com/ericfitz/archive/2007/04/18/vista-security-events-get-noticed.aspx" mce_href="https://blogs.msdn.com/ericfitz/archive/2007/04/18/vista-security-events-get-noticed.aspx">why</A> we renumbered the events, and (in the same place) why the difference is "+4096" instead of something more human-friendly like "+1000".&nbsp; The bottom line is that the event schema is different, so by changing the event IDs (and not re-using any), we force existing automation to be updated rather than just misinterpreting events when the automation doesn't know the version of Windows that produced the event.&nbsp; We realized it would be painful but it is nowhere near as painful as if every event consumer had to be aware of, and have special casing for, pre-Vista events and post-Vista events with the same IDs but different schema.</P>
<P>So if you happen to know the pre-Vista security events, then you can quickly translate your existing knowledge to Vista by adding 4000, adding 100, and subtracting 4.&nbsp; You can do this in your head.</P>
<P>However if you're trying to implement some automation, you should avoid trying to make a chart with "&lt;Vista" and "&gt;=Vista" columns of event ID numbers, because this will likely result in mis-parsing one set of events, and because you'll find it frustrating that there is not a 1:1 mapping (and in some cases no mapping at all).</P>
<P>Eric</P>
<P mce_keep="true">&nbsp;</P>
<P mce_keep="true">&nbsp;</P>
<P mce_keep="true">&nbsp;</P>]]></content:encoded>
    </item>
    <item>
      <title>Minimizing Directory Service Audit Event Noise</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/minimizing-directory-service-audit-event-noise</link>
      <pubDate>Thu, 04 Sep 2008 17:51:00 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2008/09/04/minimizing-directory-service-audit-event-noise/</guid>
      <description><![CDATA[I've written before on noise reduction in the Windows security event log.&nbsp; I've also written to...]]></description>
      <content:encoded><![CDATA[<P>I've written before on <A class="" title="Reducing the noise in the security event log" href="https://blogs.msdn.com/ericfitz/archive/2005/01/11/350848.aspx" mce_href="https://blogs.msdn.com/ericfitz/archive/2005/01/11/350848.aspx">noise reduction</A> in the Windows security event log.&nbsp; I've also written to describe <A class="" title="How object access events are generated" href="https://blogs.msdn.com/ericfitz/archive/2006/10/26/how-are-object-access-events-generated.aspx" mce_href="https://blogs.msdn.com/ericfitz/archive/2006/10/26/how-are-object-access-events-generated.aspx">how object access auditing works</A>.&nbsp; But, I still get questions on how to reduce noise from object access events.&nbsp; The other day I got&nbsp;that question, specific to Directory Service objects,&nbsp;on an internal discussion list so I thought I'd clean up the answer a bit and share it with the world.&nbsp; In general the same is true for any type of object, although there are a few more knobs to control for DS objects.</P>
<P>Object access audit is generated when the system access control list (SACL) on the object matches the access that was performed on ALL of the following conditions:</P>
<OL>
<LI>Object&nbsp;- the object that was accessed must have either an explicit or inherited SACL.&nbsp; The access performed is compared against the ACEs in that SACL.<BR></LI>
<LI>Success or failure of activity - every audit access control entry (ACE) in a SACL will be either of type AUDIT_SUCCESS or AUDIT_FAILURE.&nbsp; The access performed must match the access type of the ACE for the rest of the ACE to be considered.<BR></LI>
<LI>User account - the accessing user's token is compared against each ACE matching the access type.&nbsp; If the user, or a group the user belongs to, matches the SID in the ACE, then an audit might be generated.<BR></LI>
<LI>Access - the access being performed must match the audited accesses in the access mask in an otherwise&nbsp;matching ACE.</LI></OL>
<P>The specific auditing algorithm is discussed <A class="" title="Access Check and Audit Generation" href="https://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/distrib/dsce_ctl_tmvc.mspx" mce_href="https://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/distrib/dsce_ctl_tmvc.mspx">here</A>.</P>
<P>So the way to reduce the number of audit events (566 on Windows Server 2003, 4662 on Windows Server 2008, or one of the <A class="" title="Windows Server 2008 DS Change Auditing" href="https://blogs.msdn.com/controlpanel/blogs/be%20placed%20in%20a%20product,%20please%20go%20to%20the" mce_href="https://blogs.msdn.com/controlpanel/blogs/be placed in a product, please go to the">new DS Change events</A> on Windows Server 2008) is to cause one or more of those conditions to fail, except in the specific cases that you care about.</P>
<P>The SACL which will generate the most audit events is "Everyone:Success &amp; Failure:All accesses" on the domain head with OI,CI (object inherit &amp; container inherit flags) for all object types.&nbsp; This SACL matches all of the above conditions in all cases.&nbsp; (Incidentally I think that this is pretty close to the default SACL- with the exception of failures-&nbsp;for Windows 2000 Active Directory installations, and SACLs are not updated when DCs are upgraded from version to version.&nbsp; Windows Server 2003 has much more conservative SACLs for new installations of AD.)</P>
<P>To reduce noise, I offer the following suggestions, addressing each of the above conditions:</P>
<OL>
<LI>Audit only the objects that you care about.&nbsp; User accounts and groups already are well-audited with "Account Management" auditing, so don't audit them with DS access.&nbsp; Perhaps audit OUs, or other DS objects.&nbsp; Use the Object Type and attribute type restrictions that you have in DS Access auditing.&nbsp; Also, in Windows Server 2008, you can affect auditing on a per-object basis <A class="" title="Windows Server 2008 DS Change Auditing" href="https://blogs.msdn.com/controlpanel/blogs/be%20placed%20in%20a%20product,%20please%20go%20to%20the" mce_href="https://blogs.msdn.com/controlpanel/blogs/be placed in a product, please go to the">by adjusting the SearchFlags attribute</A> in the AD schema for the object.&nbsp; SACLs are more easily reversed so are probably a more acceptable method of controlling audit for most organizations.<BR></LI>
<LI>Audit successful accesses only.&nbsp; Failed accesses are common and are NOT indicative of any security problem; in fact many failures are not even explicit requests by the user but are just normal requests made by the OS, and the OS will re-try with less access if the operation fails.&nbsp; In my experience failure auditing is primarily useful for troubleshooting, not for security.<BR></LI>
<LI>Audit the "Everyone" group.&nbsp; Although this matches any user, you will not accidentally miss any accesses that you care about due to failing to audit a user account who has access to the objects in question.&nbsp; The only time that you would NOT audit "Everyone" is if you had an application or service account which was very noisy; in that case you'd need to create a group with all accounts EXCEPT the noisy accounts, and audit that group.<BR></LI>
<LI>Audit only the accesses that you care about.&nbsp; Specifically, read accesses occur much more often (in my experience, a conservative estimate is about a 100:1 ratio) than write accesses.&nbsp; If you restrict your auditing to "write" type accesses (including change, delete, change permissions, create, etc.) then you will end up generating far fewer events.&nbsp; Auditing for read access is very noisy.&nbsp; If you must audit for reads, consider auditing fewer objects, perhaps only auditing reads on the container object instead of the objects in the&nbsp;container,&nbsp;or on one "interesting" object in any given container as a "canary".</LI></OL>
<P mce_keep="true">&nbsp;</P>]]></content:encoded>
    </item>
    <item>
      <title>Tracking User Logon Activity Using Logon Events</title>
      <link>https://docs.microsoft.com/archive/blogs/ericfitz/tracking-user-logon-activity-using-logon-events</link>
      <pubDate>Wed, 20 Aug 2008 19:32:00 GMT</pubDate>
      <dc:creator><![CDATA[Eric Fitzgerald]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ericfitz/2008/08/20/tracking-user-logon-activity-using-logon-events/</guid>
      <description><![CDATA[I get the question fairly often, how to use the logon events in the audit log to track how long a...]]></description>
      <content:encoded><![CDATA[<P>I get the question fairly often, how to use the logon events in the audit log to track how long a user was using their computer and when they logged off.</P>
<P>As I have written about previously, <A class="" title="The Trouble with Logoff Events" href="https://blogs.msdn.com/ericfitz/archive/2007/05/08/the-trouble-with-logoff-events.aspx" mce_href="https://blogs.msdn.com/ericfitz/archive/2007/05/08/the-trouble-with-logoff-events.aspx">this method of user activity tracking is unreliable</A>.&nbsp; It works in trivial cases (e.g. single machine where the user doesn't have physical access to the power switch or power cord), and it works most of the time in simple cases where there is good network connectivy and the user is not trying to evade detection.&nbsp; If the user has physical access to the machine-- for example, can pull out the network or power cables or push the reset button-- and if the user is actively trying to evade time tracking, then the only reliable solution is to surreptitiously put a video camera (subject to local laws) in&nbsp;a place that can monitor the user's presence in front of the keyboard (yes I am aware of research done to track sound of keyboard clicks, etc.).</P>
<P>There is no way to instrument the OS to account for someone who just backs away from the keyboard and walks away.&nbsp; The screen saver, if configured, will come on after a configurable delay since the last keypress or mouse movement.&nbsp; Yes, if you know the SS delay then you could just work that into your calculations.&nbsp; However the workstation does not lock until the screen saver is dismissed (some of you might have noticed that when you bump the mouse to dismiss the screensaver, sometimes you see your desktop for a fraction of a second- that’s because your machine isn’t locked while the screen saver is being displayed).&nbsp; And the events don't tell you whether the workstation was locked or auto-locked so you don't really know whether to add in the screen saver delay factor.&nbsp; Plus, prior to Windows Vista, there is no workstation lock event at all, only an unlock event, which is constructed in a way which makes it difficult to correlate with the original logon event.</P>
<P>So the bottom line is, I don't advocate or recommend this method for tracking the time a user spends at the keyboard.&nbsp; If I were hypothetically called as an expert witness, I would testify that such a method is unreliable and trivially circumvented.&nbsp; You have been warned, I've beaten that dead horse enough I guess.</P>
<P>Given that you are disregarding all my contrary advice, how are you going to accomplish this?</P>
<P>First, we need a general algorithm.</P>
<BLOCKQUOTE>
<P><EM>Use time (for a given logon session) = Logoff time - logon time</EM></P></BLOCKQUOTE>
<P>Now, what about the cases where the user powers off the machine, or it bluescreens, or a token leak prevents the logoff event from being generated, etc.?&nbsp; We can use the BEGIN_LOGOFF event to handle token leak cases.&nbsp; We can use the shutdown event in cases where the user does not log off.&nbsp; And in case of crashes, the only event we can use is the startup event.&nbsp; Note that each of these introduces increasing levels of uncertainty.</P>
<BLOCKQUOTE>
<P><EM>Logoff time = (logoff time | begin_logoff time | shutdown time | startup time)</EM></P></BLOCKQUOTE>
<P>This is good, but what about the time the workstation was locked?</P>
<BLOCKQUOTE>
<P><EM>Workstation lock time = unlock time - lock time<BR></EM><EM>Total workstation lock time (for a given logon session) = SUM(workstation lock time)</EM></P></BLOCKQUOTE>
<P>How about remote desktop &amp; terminal server sessions, and fast user switching?&nbsp; You can connect and disconnect from logon sessions, during which time the user technically isn't using the computer.</P>
<BLOCKQUOTE>
<P><EM>Session idle time = session connect time - session disconnect time<BR></EM><EM>Total session idle time (for a given logon session) = SUM(session idle time)</EM></P></BLOCKQUOTE>
<P>How about times when the machine was idle?&nbsp; We can estimate that by looking at the time the screen saver was in place and adding the screen saver timeout.</P>
<BLOCKQUOTE>
<P><EM>Console idle time = (screen saver dismiss time - screen saver invoke time + screen saver delay)<BR></EM><EM>Total console idle time = SUM(console idle time)</EM></P></BLOCKQUOTE>
<P>Putting all of this together and modifying our original formula, we get:</P>
<BLOCKQUOTE>
<BLOCKQUOTE>
<P><EM>Use time (for a given logon session)&nbsp;=<BR></EM><EM>&nbsp;&nbsp; Logoff time - logon time<BR></EM><EM>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - SUM(workstation lock time)<BR></EM><EM>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - SUM(session idle time)<BR></EM><EM>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - SUM(console idle time)</EM></P></BLOCKQUOTE></BLOCKQUOTE>
<P>When we expand it, it is not quite so pretty:&nbsp;</P>
<BLOCKQUOTE>
<BLOCKQUOTE>
<P><EM>Use time (for a given logon session)&nbsp;=<BR></EM><EM>&nbsp;&nbsp; ( (logoff time | begin_logoff time | shutdown time | startup time) - logon time )<BR></EM><EM>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - SUM(unlock time - lock time)<BR></EM><EM>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - SUM(session connect time - session disconnect time)<BR></EM><EM>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - SUM(screen saver dismiss time - screen saver invoke time + screen saver delay)</EM></P></BLOCKQUOTE></BLOCKQUOTE>
<P>You have to be very careful that you only look at events that are properly contained chronologically between two other appropriate events, to avoid accidentally pairing the wrong logon and logoff events, or pairing a lock workstation event from one logon session with a different logon session.&nbsp; The best correlation field is the Logon ID field, the next best are timestamp and user name.&nbsp; At various times you need to examine all of these fields.</P>
<P>Now, which event IDs correspond to all of these real-world events?</P>
<P>They are all found in the Security event log.&nbsp; The pre-Vista events (ID=5xx) all have event source=Security.&nbsp; The Vista/WS08 events (ID=4xxx) all have event source=Microsoft-Windows-Security-Auditing.</P>
<P><BR>512 / 4608&nbsp; STARTUP<BR>513 / 4609&nbsp; SHUTDOWN<BR>528&nbsp;/ 4624&nbsp;&nbsp;LOGON<BR>538 / 4634&nbsp; LOGOFF<BR>551 / 4647&nbsp; BEGIN_LOGOFF<BR>N/A / 4778&nbsp; SESSION_RECONNECTED<BR>N/A / 4779&nbsp; SESSION_DISCONNECTED<BR>N/A / 4800&nbsp; WORKSTATION_LOCKED <BR>* / 4801&nbsp;&nbsp;&nbsp; WORKSTATION_UNLOCKED<BR>N/A / 4802&nbsp; SCREENSAVER_INVOKED<BR>N/A / 4803&nbsp; SCREENSAVER_DISMISSED<BR><BR>* prior to Windows Vista, there was no event for locking the workstation.&nbsp; Unlocking the workstation generated&nbsp;a pair of events, a logon event and a logoff event (528/538) with logon type 7.&nbsp; These events had the same user name as the "original" logon session and were completely enclosed chronologically by the logon/logoff events for the "real" logon session, but did not contain the Logon ID of the original logon session or other unambiguous correlator.&nbsp; This makes correlation of these events difficult.</P>
<P>All of these events are generated in the Logon/Logoff audit policy category, although on Windows Vista and Windows Server 2008 they are scattered among the various subcategories in this audit policy category.&nbsp; The <A class="" title="Windows Server 2008 Security Events" href="https://blogs.msdn.com/ericfitz/archive/2008/04/16/windows-server-2003-security-events-posted.aspx" mce_href="https://blogs.msdn.com/ericfitz/archive/2008/04/16/windows-server-2003-security-events-posted.aspx">audit event spreadsheet</A> that Ned wrote has all the policy subcategory mappings as well as the event descriptions.</P>
<P>Sorry that this is more of a do-it-yourself than a solution-in-a-box, but this is pretty difficult to script and so far I haven't worked on a project that required this.</P>
<P>Eric</P>]]></content:encoded>
    </item>
  </channel>
</rss>