Useful PowerShell Scripts/Commands

Step 1: Get-Help, Get-Command, Get-Member and Get-Alias

Thanks to Justin for pointing out that I left out probably the most useful command. Get-Help. I’ve added some of my other favorite commands for learning as well, which I still use almost daily.

Get-Help is an amazingly useful command and is quite versatile.

Get-Help Get-WMIObject – Will output basic help and tips on a command but Get-Help has many useful parameters or switches;

-Full (Is the full help document) 
-Examples (Shows only examples of how to use the command, my personal favourite) 
-Online (Opens the MSDN page for the cmdlet or command) 
-ShowWindow (This puts the help into its own window)

Get-Command is another great learning tool, think something might be a command? Use Get-Command to find out. It accepts wildcards as well. A great example is;

Get-Command -Name Get-* (May be a bit overwhelming looking but most of PowerShells cmdlets are pretty self explanatory) 
The most common verbs if you will, in my opinion anyway are;

Get- 
Show- 
New- 
Remove- 
Start- 
Stop- 
Copy- 
Import- 
Export-

You can use the above Get-Command example on any and all of those.

Get-Member is probably my second most used command when I’m writing a script or even making a one-liner (a one-liner is basically a one lined script)

It’s the tool to use if you want to see every single property, method, and basically everything that’s stored inside of a variable that you create(Please feel free to chime in if I’ve explained that incorrectly). Here’s an example;

$Object=Get-WMIObject -Class Win32_ComputerSystem 
$Object | Get-Member 
(I’d paste the output in here but it’s going to be formatted very poorly so I suggest you try it out yourself)

Get-Alias is great for when you’re trying to search for a solution and come across one but the author is using what I call shorthand for commands which is great if you already know it. An example would be gwmi, if you’re unfamiliar with PowerShell that probably won’t mean anything to you, that’s where Get-Alias comes in. Here’s an example.

Get-Alias -Name gwmi

The output of that command will tell you that gwmi is an alias of the command Get-WMIObject

Step 2: Quickly get the Computer Name, Model, Make, and other useful information

Get-WMIObject -Class Win32_ComputerSystem 
information about the System

Get-WMIObject -Class Win32_BIOS 
Information about the BIOS

Get-WMIObject -Class Win32_Baseboard 
Information about the Motherboard

Get-WMIObject -Class Win32_Processor 
Information about the CPU

Get-WMIObject -Class Win32_LogicalDisk 
Information about Logical Drives (Includes mapped drives and I believe PSDrives)

Get-WMIObject -Class Win32_DiskDrive 
Information about Physical Drives

Get-WMIObject -Class Win32_PhysicalMemory 
Information about the Memory

Get-WMIObject -Class Win32_NetworkAdapter 
Information about the NIC

Get-WMIObject -Class Win32_NetworkAdapterConfiguration 
Information about the NIC’s Configuration

You can also shortform the command from; 
Get-WMIObject -Class Win32_ComputerSystem into gwmi Win32_ComputerSystem

Note – Some may not know, I didn’t know at first but PowerShell is NOT case sensitive with the exception of a few special cases, from what I recall. I just like how neat it looks.

Step 3: Check your PowerShell Version

$PSVersionTable

To the best of my knowledge the important bit you’re looking for is the “PSVersion”.

Step 4: Restart all Network Adapters *Must be run as admin or at least local admin*

Requires PowerShell 3.0+

Get-NetAdapter | Restart-NetAdapter

Step 5: You can browse UNC path with PowerShell

Unless I’ve been doing something wrong, you cannot browse UNC with command prompt.

To access UNC via PowerShell simply type;

cd \\servername\C$\Path\To\File

You will of course need the appropriate permissions to do this, just like in Explorer.

Step 6: Copy a file to all users Desktop’s

I know you can do this with GPO but if you need to do it quickly or just a one off, or for specific people this usually does the trick.

$Users = Get-ChildItem C:\Users\ -Exclude “Administrator”,”Public”,”Default*” # Exclude any other defaults that you don’t want.

foreach($User in $Users.name){ 
$Path = “C:\Users\$User\Desktop”; 
Copy-Item -Path “\\Path\To\Source\File.txt” -Destination $Path\File.txt 
}

Step 7: Function for adding a system restart with a prompt for users.

[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.VisualBasic”)

Function RestartPrompt { 
$Prompt1 = [Microsoft.VisualBasic.Interaction]::MsgBox(“IT is rebooting your machine. Please save and close any open work, if you wish to cancel the reboot please hit cancel.”, “OKCancel,Information”,”IT”)

if ($Prompt1 -eq “Ok”) { 
[Microsoft.VisualBasic.Interaction]::MsgBox(“Reboot will occur in 5 minutes.”, “OkOnly,Information”,”IT”) 
shutdown /r /t 300 
}

if ($Prompt1 -eq “Cancel”) { 
[Microsoft.VisualBasic.Interaction]::MsgBox(“Reboot has been canceled.”, “OKOnly,Information”,”IT”) 
break 

}

RestartPrompt

Step 8: Get free disk space on drives

This can either be run locally or part of a larger script to hit multiple machines.

$Drive=Get-WmiObject Win32_LogicalDisk -Filter “DriveType = 3” 
$DriveSize=$Drive.Size;$DriveSize=[math]::Round($DriveSize/1GB) 
$FreeSpace=$Drive.FreeSpace;$FreeSpace=[math]::Round($FreeSpace/1GB) 
$DriveName=$Drive.Name 
$ComputerName=Get-WmiObject Win32_ComputerSystem;$ComputerName=$ComputerName.Name 
$UsedSpace=$DriveSize – $FreeSpace;$UsedSpace=[string]$UsedSpace+” GB free on drive $DriveName on computer $ComputerName”

Step 9: Monitor Windows Server Backup

I’m quite proud of this, it’s worked well for me for a while and hopefully someone else can use it.

This works on Windows Server 2008R2+ and needs the Windows Server Backup feature installed along with the command line tools. I believe the command line tools comes as part of the feature in Server 2012.

You can set up the use of SSL and credentials if you choose to as well.

$Date=Get-Date; $Date=$Date.AddDays(-1).ToShortDateString() 
$WBS=Get-WBSummary 
$LastBackupResult=$WBS.LastBackupResultDetailedHR 
$LastSuccessfulBackup=$WBS.LastSuccessfulBackupTime.ToShortDateString() 
$LastBackup=$WBS.LastBackupTime 
$Versions=$WBS.NumberOfVersions 
$ErrorDesc=Get-WBJob -Previous 1; $ErrorDesc=$ErrorDesc.ErrorDescription

$SuccessfulBackupBody=@” 
Date: $LastSuccessfulBackup 
Backups Available: $Versions 
“@

$FailedBackupBody=@” 
Last Backup: Failed 
Date: $LastBackup 
Reason: $ErrorDesc 
“@

$RecurringFailedBackupBody=@” 
Last Backup: Failed 
Date: $LastBackup 
Last Successful Backup: $LastSuccessfulBackup 
Reason: $ErrorDesc 
“@

if($LastBackupResult -eq 0){ 
Send-MailMessage -To “recepient@email.com” -From “sender@email.com” -Subject “Backup Successful – $ENV:COMPUTERNAME” -Body $SuccessfulBackupBody -SmtpServer YourSMTPServer 

elseif($LastBackupResult -ne 0 -or $LastSuccessfulBackup -lt $Date){ 
if($LastSuccessfulBackupTime -lt $Date){ 
Send-MailMessage -To “recepient@email.com” -From “sender@email.com” -Subject “Backup Failed – $ENV:COMPUTERNAME” -Body $RecurringFailedBackupBody -SmtpServer YourSMTPServer 

else{ 
Send-MailMessage -To “recepient@email.com” -From “sender@email.com” -Subject “Backup Failed – $ENV:COMPUTERNAME” -Body $FailedBackupBody -SmtpServer YourSMTPServer 

}

Well hopefully these were helpful to some people and maybe a few people got to learn something new.