MVP - Most Valuable Professional
rss

Just can't get enough of IT

This blog is about mostly anything in IT. But the primary focuses are Microsoft technologies like Exchange Server, Microsoft 365, Microsoft Teams, and Cloud Security.

Exchange Server 2013Exchange Server 2016Description

This script imports multiple PST files located in a single directory into a user mailbox or a user mailbox archive. 

Due to some filename limitations of the New-MailboxImportRequest cmdlet in reagards to the UNC path, the PST filenames are sanitized. Any unsupported (unwanted) character is removed. You can modify the replacement function as needed. This might be necessary as the PST filenames can be used as target folder names during import.

Original filenames:

Filenames before renaming

Renamed filenames:

Filenames after renaming

When using the FilenameAsTargetFolder switch each PST file is imported into a separate target folder.

PST filenames used as target folder

After successfully importing a PST file, the PST can optionally be renamed to .imported. This simplifies a re-run of the script in the case that you a lot of PST files for a user or a large number of files as part of archive solution offboarding process.

NOTE:
This script utilizes the GlobalFunctions PowerShell module for logging. Please prepare your system for the use of the GlobalFunctions module first.

Steps performed:

  1. Sanitize PST filenames
  2. Create new mailbox import request
  3. Monitor status of created import request
    1. When still running, continue monitoring status
    2. When successfully finished, save import request statistics report to log file and continue with next PST
    3. Rename the imported PST file to .imported
    4. When aborted, continue with next PST or exit script

Examples

 

Example PowerShell Output

.\Start-MailboxImport.ps1 -Identity JohnDoe -Archive -FilePath "\\ROBERTKWEISS\e$\PSTImport\JohnDoe" -FilenameAsTargetFolder -BadItemLimit 10 -ContinueOnError -SecondsToWait 90
Note: Script will wait 90s between each status check!
Create New-MailboxImportRequest for user: JohnDoe and file: \\ROBERTKWEISS\e$\PSTImport\JohnDoe\Myoldarchive.pst into the archive. Targetfolder:"Myoldarchive".
Waiting for import JohnDoe-Myoldarchive.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive.pst to be completed. Status: InProgress
Waiting for import JohnDoe-Myoldarchive.pst to be completed. Status: InProgress
Waiting for import JohnDoe-Myoldarchive.pst to be completed. Status: InProgress
Import request JohnDoe-Myoldarchive.pst completed successfully.
Import request JohnDoe-Myoldarchive.pst deleted.
Create New-MailboxImportRequest for user: JohnDoe and file: \\ROBERTKWEISS\e$\PSTImport\JohnDoe\Myoldarchive1.pst into the archive. Targetfolder:"Myoldarchive1".
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: Queued
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: InProgress
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: InProgress
Waiting for import JohnDoe-Myoldarchive1.pst to be completed. Status: InProgress
Import request JohnDoe-Myoldarchive1.pst completed successfully.
Import request JohnDoe-Myoldarchive1.pst deleted.
Script finished.

Version History

  • 1.0, Initial community release
  • 1.1, log will now be stored in a subfolder (name equals Identity)
  • 1.2, PST file renaming added
  • 1.3, Module ActiveDirectory removed
  • 1.4, AcceptLargeDatalost would now be added if BadItemLimit is over 51
  • 1.5, Parameter IncludeFodlers added
  • 1.6, Parameter TargetFolder added
  • 1.7, Parameter Recurse added
  • 1.8, PST file rename after successful import added

Links

Last updated: 2017-02-02

Follow me

Additional Note

This Powershell script has been optimized using the ISESteroids™ add-on. Learn more about ISESteroidshere.

 

 

Read More »

Description

This script fetches the disk volume (Win32_Volume) information via WMI and shows the results in the PowerShell command line window. Optionally, you can have the report sent as an Html email to a recipient of your choice.

The switch -AllExchangeServer simplifies gathering the disk volume information across all Exchange servers in your environment.

The following screenshot shows the command line output when using

.\Get-Diskpace.ps1 -ComputerName MYSERVER

Get-Diskspace command line output

The following screenshot shows an example of the html email output when using

.\Get-Diskpace.ps1 -ComputerName MYSERVER -SendMail -MailFrom postmaster@sedna-inc.com -MailTo exchangeadmin@sedna-inc.com -MailServer mail.sedna-inc.com

Get-Diskspace email example

Examples

# EXAMPLE 1
# Get disk information from computer MYSERVER in MB

Get-Diskpace.ps1 -ComputerName MYSERVER -Unit MB

# EXAMPLE 2
# Get disk information from all Exchange servers and send html email

Get-Diskpace.ps1 -AllExchangeServer -SendMail -MailFrom postmaster@sedna-inc.com -MailTo exchangeadmin@sedna-inc.com -MailServer mail.sedna-inc.com

Version History

  • 1.0, Initial community release
  • 1.1,  Email reports added
  • 1.11, Send email issue fixed
  • 1.12, PowerShell hygiene applied

Links

Follow

Additional Note

This Powershell script has been optimized using the ISESteroids™ add-on. Learn more about ISESteroids™ here.

Read More »
On April 22, 2016
0 Comment
6348 Views

The PowerShell script Get-Diskspace.ps1 uses a pretty basic inline CSS approach to generate a more nicely html email from a PowerShell output.

You can use the following description for your own PowerShell script.

First a new html block is configured and the inline CSS is embedded into the head tag.

# Some CSS to get a pretty report
# Variable containing the inline CSS and the full html head tag
$head = @'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html><head><title>$($ReportTitle)</title>
<style type=”text/css”>
<!–
body {
    font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
}
h2{ clear: both; font-size: 100%;color:#354B5E; }
h3{
    clear: both;
    font-size: 75%;
    margin-left: 20px;
    margin-top: 30px;
    color:#475F77;
}
table{
    border-collapse: collapse;
    border: none;
    font: 10pt Verdana, Geneva, Arial, Helvetica, sans-serif;
    color: black;
    margin-bottom: 10px;
}
 
table td{
    font-size: 12px;
    padding-left: 0px;
    padding-right: 20px;
    text-align: left;
}
 
table th {
    font-size: 12px;
    font-weight: bold;
    padding-left: 0px;
    padding-right: 20px;
    text-align: left;
}
->
</style>
'@

The recurring data content is added to a global varibale using the -Fragment attribute. This ensures that no full html document data is being created.

$global:Html += $wmi | ConvertTo-Html -Fragment -PreContent "<h2>Server $($ServerName)</h2>"

Before sending the html result the full body html is generated by combinding the html fragments and the manually defined html head.

[string]$Body = ConvertTo-Html -Body $global:Html -Title "Status" -Head $head

Send-Mail -From $MailFrom -To $MailTo -SmtpServer $MailServer -MessageBody $Body -Subject $ReportTitle  

Enjoy.

Read More »

The new community script Get-Diskspace helps to fetch disk volume information from a single server or across multiple servers.

Currently the script supports a command line switch to gather disk volume information across all Exchange servers in your environment.

The following screenshot shows the command line output

Screenshot command line output

The following screenshot shows the html email

Screenshot html email

# Get disk information from computer MYSERVER
    
.\Get-Diskpace.ps1 -ComputerName MYSERVER


# Get disk information from computer MYSERVER in MB

.\Get-Diskpace.ps1 -ComputerName MYSERVER -Unit MB


# Get disk information from all Exchange servers and send html email

.\Get-Diskpace.ps1 -AllExchangeServer -SendMail -MailFrom postmaster@sedna-inc.com -MailTo exchangeadmin@sedna-inc.com -MailServer mail.sedna-inc.com

 

Links

Enjoy.

 


You need assistance with your Exchange Server setup? You have questions about your Exchange Server infrastructure and going hybrid? You are interested in what Exchange Server 2016 has to offer for your environment?

Contact me at thomas@mcsmemail.de
Follow at https://twitter.com/stensitzki

Read More »

Sometimes you need to know the version of the installed .NET Framework version quickly.

Simply use the following PowerShell one-liner:

(Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' ).Release
DWORD Value Version
378389 .NET Framework 4.5
378675 .NET Framework 4.5.1 installed with Windows 8.1 or Windows Server 2012 R2
378758 .NET Framework 4.5.1 installed on Windows 8, Windows 7 SP1, or Windows Vista SP2
379893 .NET Framework 4.5.2
On Windows 10: 393295
All other OS: 393297
.NET Framework 4.6
On Windows 10 November Update: 394254
All other OS: 394271
.NET Framework 4.6.1
On Windows 10 Insider Build 14295: 394747
All other OS: 394748
.NET Framework 4.6.2 Preview

Enjoy!

Links

 

Read More »