Random Password Generator in PowerShell

Here is a quick and dirty PowerShell script that you can use to generate pseudo-random passwords using dictionary words, numbers and special characters.

This kind of script is good for environments such as schools and universities where mass-enrolment is quite common before the start of the academic year.

You can incorporate the function in your own script or come up with something new.

Credit goes to setgetgo.com for making the random word generator API available for public use.

The code is available on my GitHub page and is a good place to check for the latest iteration of code as well as some examples. Below is the code as of 14/06/2016

<#
	.SYNOPSIS
		Generate a random password
	
	.DESCRIPTION
		Uses the setgetgo.com random word API to generate random words. A random number and special character is then appended
	
	.PARAMETER numberOfPasswords
		Number of passwords to generate. Default is 1.
	
	.PARAMETER wordLength
		Word length. Default is 8.
	
	.PARAMETER allowedSpecialCharacters
		Special characters that are allowed to be appended to the password. Default is ! * and ?
		If defining your own, use the format:
		Generate-Password -allowedSpecialCharacters "!","?",",","/"
	
	.PARAMETER maximumNumber
		Default number to append to word will be between 0 and 999.
	
	.EXAMPLE
		PS C:\> Generate-Password
		This will generate a random 8 character word, append a number between 0 and 999 and finally append a special character.
	
	.NOTES
		Additional information about the function.
#>
function Generate-Password
{
	[CmdletBinding()]
	[OutputType([string])]
	param
	(
		[Parameter(Mandatory = $false)]
		[int]$numberOfPasswords = 1,
		[Parameter(Mandatory = $false)]
		[int]$wordLength = 8,
		[Parameter(Mandatory = $false)]
		$allowedSpecialCharacters = @('!', '*', '?'),
		[Parameter(Mandatory = $false)]
		[int]$maximumNumber = 999
	)
	
	for ($i = 1; $i -le $numberOfPasswords; $i++)
	{
		$randomWord = Invoke-WebRequest -URI http://randomword.setgetgo.com/get.php?len=$wordLength
		$randomNumber = Get-Random -Maximum $maximumNumber
		$randomSpecialCharacter = $allowedSpecialCharacters | Get-Random
		Write-Output "$($randomWord.content)$randomNumber$randomSpecialCharacter"
	}
}

Office 365 Quarantine Tool

If you find yourself using the Office 365 (Exchange Online) e-mail quarantine often then you probably know how frustrating and slow it can be to quickly find and release quarantined items. Often times you’ll find yourself waiting for a few minutes only to realise it’s not doing anything. Then you have to refresh the page and re-enter your search criteria. The fact you can’t even wildcard searches is also unforgivable (it’s 2016 Microsoft, why can we not wildcard search the subject and sender fields?!)

This annoyance coupled with my eagerness to play with PowerShell led me to develop a quick and dirty quarantine tool or viewer if you like. The tool is quite basic but it will let you do the following:

  • Wildcard search the subject and sender fields
  • Configure the number of results to return
  • Release a message based on message ID

2016-06-07 20_17_07-Office 365 Quarantine Tool v012016-06-07 20_19_19-Office 365 Quarantine Tool v01
If you want to have a play with the tool, it’s on my GitHub along with the source code if you feel like suggesting some improvements.

Creating Office 365 Mailboxes in a Hybrid Setup

In this article I will show you how to create Exchange Online mailboxes in a hybrid environment such that the maiboxes also show up on the on-premises Exchange server management console.

The most logical way of creating an Exchange Online mailbox (you’d think) is to let AD users DirSync across to 365, assign them licenses and be done with it. However doing it this way doesn’t create a link between Exchange Online and your On-Premises Exchange server which means you can’t do things like manage the user’s mailbox from EMC or migrate the mailbox between on-premises and Exchange Online.

Continue reading Creating Office 365 Mailboxes in a Hybrid Setup

Bulk Licensing Office 365 Users with PowerShell

Licensing Office 365 users manually can be a tedious task; especially if you are tasked with licensing hundreds or even thousands (think educational institutes that need to license user’s every semester or academic year).

I created a fairly basic script that will take a .CSV input and license your users according to your Office 365 environment and the licenses you have available.

Continue reading Bulk Licensing Office 365 Users with PowerShell

Downloading the Latest Malwarebytes Definitions File for Offline Use with PowerShell

Looking through my blog stats I saw that one of my old articles was still getting a lot of views – the one about downloading an offline copy of the Malwarebytes definitions file.

I decided to write a quick version 2 of the script so that it can now run natively in PowerShell without any third party tools (wget) – it’s also easier to understand and slightly more elegant only requiring four lines to do the job.

Continue reading Downloading the Latest Malwarebytes Definitions File for Offline Use with PowerShell

Remove Old ActiveSync Devices on Exchange Using PowerShell

This will be a quick how-to guide on removing old/stale ActiveSync devices from Microsoft Exchange.

Note 1: I have only run this on an on-premises Exchange 2007 server so I am not sure if it will work in 2010, 2013 or Office 365 but hopefully the script will come in handy anyway

Note 2: This is my first ever PowerShell script so I am sure there are better ways of doing this but it does the job!

Okay so if you want to run a report on old devices (I have defined old as no successful sync in the past 30 days but you can change this to whatever you want) before you go ahead and remove them, run the following command:

Get-Mailbox | ForEach {Get-ActiveSyncDeviceStatistics -Mailbox:$_.Identity} | where {$_.LastSuccessSync -lt ((Get-Date).AddDays(-30))}

To actually remove these devices (this command removes the relationship between the device and Exchange – it will NOT wipe the device) run this command:

# Assign the full identity string for each of the old devices to the $staleDevices variable - this identity string is required for the Remove-ActiveSyncDevice cmdlet
$staleDevices = Get-Mailbox | ForEach {Get-ActiveSyncDeviceStatistics -Mailbox:$_.Identity} | where {$_.LastSuccessSync -lt ((Get-Date).AddDays(-30))} | select -expand Identity
# Loop through the identities and pass them in to Remove-ActiveSyncDevice. The -confirm at the end forces the command to go through. Remove it if you want to manually confirm each removal
foreach ($device in $staleDevices) {Remove-ActiveSyncDevice -Identity $device -confirm:$false}