Analyzing Exchange Transaction Log Generation Statistics – Revisited

Almost 4 years ago, I wrote a script called GetTransactionLogStats.ps1, and originally blogged about it here. At the original time of writing, the primary purpose of the script was to collect transaction log generation data, and use that to determine the percentage of transaction logs generated per hour in an environment. This could in turn be used to populate the related fields in the Exchange Server Role Requirements Calculator.

Since originally writing this script, I’ve made some significant updates to how the script functions, and also added a handful of new features along the way, which were significant enough that I wanted to have a new post about it. Of note, the script now:

  • Uses PowerShell Remoting to collect data from many remote servers in Parallel. This significantly speeds up collection speeds.
  • Generates a database heat map, that compares the number of logs generated for each database to the number of logs generated for all databases. This can be used to identify databases that may be overloaded or underloaded.
  • Uses only log generation information from active database copies to determine log generation statistics.
  • Accepts the target servers via a script parameter instead of via a text file.


The script has the following requirements;

  • Target Exchange Servers must be running Exchange 2010, 2013, or 2016
  • PowerShell Remoting must be enabled on the target Exchange Servers, and configured to allow connections from the machine where the script is being executed.


The script has the following parameters:

  • Gather: Switch specifying we want to capture current log generations. If this switch is omitted, the -Analyze switch must be used.
  • Analyze: Switch specifying we want to analyze already captured data. If this switch is omitted, the -Gather switch must be used.
  • ResetStats: Switch indicating that the output file, LogStats.csv, should be cleared and reset. Only works if combined with –Gather.
  • WorkingDirectory: The directory containing LogStats.csv. If omitted, the working directory will be the current working directory of PowerShell (not necessarily the directory the script is in).
  • LogDirectoryOut: The directory to send the output log files from running in Analyze mode to. If omitted, logs will be sent to WorkingDirectory.


Runs the script in Gather mode, taking a single snapshot of the current log generation of all databases on servers server1 and server2:

PS C:> .GetTransactionLogStats.ps1 -Gather -TargetServers “server1?,”server2”

Runs the script in Gather mode, specifies an alternate directory to output LogStats.csv to, and resets the stats in LogStats.csv if it exists:

PS C:> .GetTransactionLogStats.ps1 -Gather -TargetServers “server1?,”server2” -WorkingDirectory “C:GetTransactionLogStats” -ResetStats

Runs the script in Analyze mode:

PS C:> .GetTransactionLogStats.ps1 -Analyze

Runs the script in Analyze mode, and specifies an alternate directory to send the output files to:

PS C:> .GetTransactionLogStats.ps1 -Analyze -LogDirectoryOut “C:GetTransactionLogStatsLogsOut”

Output File After Running in Gather Mode


When run in Gather mode, the log generation snapshots that are taken are sent to LogStats.csv. The following shows what this file looks like:


Output Files After Running in Analyze Mode


This is the primary output file for the script, and is what is used to populate the hourly generation rates in the Exchange Server Role Requirements Calculator. It consists of the following columns:

  • Hour: The hour that log stats are being gathered for. Can be between 0 – 23.
  • LogsGenerated: The total number of logs created during that hour for all days present in LogStats.csv.
  • HourToDailyLogGenRatio: The ratio of all logs that that particular hour accounts for. The sum of values for this column in all 24 hours in the table should be 1, and can be copied directly into the Exchange Server Role Requirements Calculator.
  • NumberOfHourlySamples: The number of hourly samples that were used to calculate each hour value.
  • AvgLogGenPerHour: The average number of logs generated per database per hour.



This file contains a heat map showing how many logs were generated for each database during the duration of the collection. This information can be used to figure out if databases, servers, or entire Database Availability Groups, are over or underutilized compared to their peers. It consists of the following columns:

  • DatabaseName: The name of the database being measured.
  • LogsGenerated: The total number of logs created by primary copies of that database during the duration of the collection.
  • LogGenToTotalRatio: The ratio of logs generated for this database compared to logs generated for all databases.
  • NumberOfHours: The number of hourly samples that were taken for this database.
  • LogsGeneratedPerHour: The average number of logs generated per hour for this database.



This file is similar to LogGenByDB.csv, but shows the log generation rates per hour for each database. It consists of the following columns:

  • DatabaseName: The name of the database being measured.
  • Hour: The hour that log stats are being gathered for. Can be between 0 – 23.
  • LogsGenerated: The total number of logs created by primary copies of that database during that hour.
  • HourToDailyLogGenRatioForDB: The ratio of logs generated for this hour and this database compared to the total logs generated for this database.


Running As a Scheduled Task

Since the script is designed to be run an hourly basis, the easiest way to accomplish that is to run the script via a Scheduled Task. The way I like to do that is to create a batch file which calls Powershell.exe and launches the script, and then create a Scheduled Task which runs the batch file. The following is an example of the command that should go in the batch file:

powershell.exe -noninteractive -noprofile -command “”

In this example, the script is located in C:LogStats. Note that I specified a WorkingDirectory of C:LogStats so that if the Scheduled Task runs in an alternate location (by default C:WindowsSystem32), the script knows where to find and where to write LogStats.csv. Also note that the command does not load any Exchange snapin, as the script doesn’t use any Exchange specific commands.

Mike Hendrickson

Resident Evil 7 guide: How to beat the chainsaw boss in the basement's Dissection Room

Resident Evil 7 is a stunning return to form for the classic horror franchise, but it can be quite difficult.

Aside from Resident Evil 7’s atmospheric horror gameplay, puzzle solving and tense exploration, it’s also peppered with boss fights that are everything from mildly interactive events to fairly difficult duels to the death. The chainsaw fight in the morgue is one of the latter.

Once you finish your exploration of the Baker house’s basement, you will have to do battle with a chainsaw-wielding madman. Warning: Spoilers ahead.

HP rolling out yet another firmware update for the Elite x3

HP is rolling out yet another firmware update for its HP Elite x3 running Windows 10 Mobile, featuring more performance and under the hood improvements. HP is yet to release an official changelog for this update, but when they do we’ll update this post accordingly.

The new firmware update in question is rolling out as version 0002.0000.0023.0113, up from the previous firmware version 0002.0000.0018.0105, and so far we’ve noticed Windows Hello feels a tad-faster than previously, which is always welcome. We’re still digging for new changes, so let us know below if you notice anything new.

This is HPs 4th firmware update for the Elite x3 in just a few months, which is great news as it means HP is committed to supporting their Windows 10 Mobile device. We suspect today’s firmware update will improve the experience when using the HP Lap Dock too, as that device launched with some minor bugs and issues.

Thanks for the tip, @SilverFoxxx1

New enhanced access controls in Azure AD: Tenant Restrictions is now Generally Available!

Howdy folks,

Today I’m happy to announce that our new Tenant Restrictions capability is Generally Available! We built Tenant Restrictions with extensive input from our customer in finance, healthcare and pharmaceutical, industries which have relatively strict information access and compliance requirements.

Tenant restrictions gives customers with these kinds of requirements enhanced control over access to SaaS cloud applications. Admins can now restrict employees using their corporate network to only being able to use Azure AD identities in tenants they have approved.

To give you the details about this important new capability, I’ve asked Yossi Banai, a PM in our Identity Security and Protection team to write a blog about this feature. You’ll find it below.

I those of you in highly regulated industries will find this featureuseful! And as always, we would love to receive any feedback or suggestions you have!

Best Regards,

Alex Simons (Twitter: @Alex_A_Simons)

Director of Program Management

Microsoft Identity Division



I’m Yossi Banai, a Program Manager on the Azure Active Directory team. In today’s blog post I’ll cover Tenant Restrictions a new feature we released today for general availability.


Companies that want to move their employees to SaaS apps like Office 365 are sometimes worried about opening their networks to information leaks. If users can access Office 365 with their corporate identity, they can also access these same services with other identities.

Before cloud services, network admins could simply block access to unwanted apps or websites by blocking their URL or IP address. This is no longer an option with SaaS apps, where a single endpoint (like is used by all consumers of the SaaS app.

Our solution for this common IT challenge is Tenant Restrictions. This new feature enables organizations to control access based on the Azure AD tenant the applications use for single sign-on. For example, you can use Tenant Restrictions to allow access to your organization’s Office 365 applications, while preventing access to other organizations’ instances of these same applications.

How it works

An on-premises proxy server is configured to intercept authentication traffic going to Azure AD. The Proxy inserts a new header called “Restrict-Access-To-Tenants” that lists the tenants that users on the network are permitted to access. Azure AD reads the permitted tenant list from the header, and only issues security tokens if the user or resource is in a tenant on that list.

The following diagram illustrates the high-level traffic flow.

End-user Experience

If a user on the Contoso network tries to sign in to the instance of an unpermitted tenant, he or she will see this message on the web page:

Admin Experience

While configuration of Tenant Restrictions is done on the corporate proxy infrastructure, admins can access the Tenant Restrictions reports in the Azure Portal directly from the Overview page of Azure Active Directory, under ‘Other capabilities’.

Using the report, the admin for the tenant specified as the “Restricted-Access-Context” can see all sign-ins blocked because of the Tenant Restrictions policy, including the identity used and the target Tenant ID:

Learn more

When you’re ready to get started, see Use Tenant Restrictions to manage access to SaaS cloud applications for more information.

We appreciate your feedback

As always, we want to hear your feedback about this new feature. If you have any feedback, questions, or issues to report, please leave a comment at the bottom of this post or tweet with the hashtag #AzureAD.

Best regards,


Colonize the final frontier with Space Settlers Pro, today's myAppFree Deal

Arcade games for Windows 10 are often not very complicated, but they can be enjoyable time wasters.

Space Settlers Pro lets you colonize planets by guiding and landing a series of spaceships on a planet’s surface. While this sounds easy, the path is filled with moving obstacles and your landing area is in a constant state of rotation. If your timing and aim are slightly off, your colonization efforts may fall short.

Space Settlers Pro is available for Windows 10 Mobile, and it regularly costs $1.99. However, with the help of this myAppFree promotion, you can pick up Space Settlers Pro free during the next 24 hours. Graphics are colorful, the mechanics simple and overall Space Settlers Pro is a challenging game.

Microsoft details new Edge features coming in the Windows 10 Creators Update

Microsoft has today outlined all the new features you can expect to see in Microsoft Edge with the new Windows 10 Creators Update coming in April this year. Microsoft Edge is one app on Windows 10 that could definitely use some attention, and it appears Microsoft is doing just that with the Creators Update.

Edge’s new features are highlighted in a video released by Microsoft on its official YouTube page. The video gives a brief overview of new tab organization features, Microsoft Wallet integration, 3D support, extensions and more.

Ebooks are another big deal in the Creators Update for Microsoft Edge, as Edge will be the default app used to read books that are downloaded from the new Windows Store books area. Finally, the video touches on extensions, which are already available on the Anniversary Update but are improved with the Creators Update.

Microsoft has also made improvements under the hood that should improve Microsoft Edge’s performance when browsing the web. A big complain with users so far is that Edge can be slow and often lag and crash, so with the Creators Update Microsoft is trying to solve these issues and make Edge a viable Google Chrome competitor.

What are you most looking forward to in Microsoft Edge with the Creators Update? Let us know in the comments!