Posted on 01-02-2016
Filed Under (powercli, powershell) by admin

This is a quick one-liner to list the serial number of all your ESXi hosts. Enjoy!

Get-VMHost | Get-View | Select Name, @{l=”SerialNumber”; e={$_.Hardware.SystemInfo.OtherIdentifyingInfo.IdentifierValue.split(“,”)[0]}}

(0) Comments   
Posted on 17-08-2015
Filed Under (hardware) by admin

For years, I have enjoyed the power and freedom of running DDWRT on my home wireless routers. But when I moved last fall into a slightly larger home, I noticed some serious dead spots in certain rooms. I started hunting for access points in the DDWRT range, but wasn’t terribly pleased with the on-slaught of dlinksysnetisco options that were returned from my searches. I finally found what I have come to believe is the best, most reliable, and cheapest wireless solution available today. I have held my tongue, 1/2 expecting that things would go south with this setup. But alas, the time has come to release my secret to WIFI success with the world!


31IOApsDJgLThe secret device that has been hiding behind it’s sickeningly low price ($37 on amazon), and standard “blah” package is the TP-LINK TLWA901ND v3. Now, I know what you’re thinking, “TPLINK?! REALLY?! All credibility out the window.” To be honest, when I installed my first TLWA901ND (say that 5 times fast) in my home, I wasn’t terribly surprised to find that about after being in service for 2 hours, it completely stopped passing traffic for all wireless clients requiring a reboot to get it going again. I rebooted it a few times over the course of 2 days, and sent the first one back to amazon for a replacement unit thinking, “surely, this one slipped past QA” – TPLINK, you get one more chance to make things right. The new unit arrived with the same disappointing message of failure and reboots – OK these things are junk; or are they?


At first sight of the factory firmware, it’s fairly obvious that it’s garbage. UI and formatting errors are plenty, functionality minimum. So I thought, I wonder if there is any aftermarket firmware that could help the hardware perform better – it certainly couldn’t hurt. Low and behold, someone compiled this minimal OpenWRT image including the Luci web interface that simply makes this access point sing. Simply download the bin and upload it through the factory provided web interface and configure. The image includes everything you need to get the AP pumping out WIFI signal to all of your A/G/N clients with all of the extras you’ve come to expect from open-source firmware. But what’s most impressive about this firmware is just how stable it is. I have anywhere from 10-25 WIFI clients on in my house streaming TV and YouTube videos, passing MineCraft and XBL content, pushing VPN traffic, and this AP has not had a reboot in months! The throughput and uptime of these little wireless work horses leads me to believe the TLWA901ND v3 + OpenWRT firmware are the best wireless bang for the buck.


Hardware Details (including images): http://wiki.openwrt.org/toh/tp-link/tl-wa901nd

(0) Comments   
Posted on 17-10-2014
Filed Under (Uncategorized) by admin

Remember that application update you were doing at 2AM three months ago? You know, the one where step 1 in your change document was to take a VMWare snapshot of the VM you were about to make changes to? Of course you do, because you’re a good admin like that. We’ve all been there, you take a snapshot of a VM and after a successful change you jump right to the “Miller time” step, completely disregarding the “remove snapshot step”. Well instead of being reminded that you left that snapshot hanging out there with a full datastore, you should schedule this report to run daily or weekly and save yourself the headache. You’re welcome.


# Created on:   10/16/2014
# Created by:   Dan Wagoner
# Organization: NBN
# Filename:     Get-SnapShotReport.ps1
# Description:    This script generates an HTML report of outstanding
#                VMWare snapshots, and correlates them to a user via
#                VMWare events.
# Usage: Get-SnapShotReport.ps1 -Server <vCenter/ESXi Server Name>


Add-PSSnapin VMware.VimAutomation.Core
Connect-ViServer $Server

$email_to = “email@domain.com”
$email_from = “email@domain.com”
$email_server = “server.domain.com”
$email_subject = “VMWare Snapshot Report”
$snaps = @()
$currsnaps = Get-VM | ?{$_.PowerState -eq “PoweredOn”} | Get-Snapshot | Select VM, Name, Created, SizeGB
$css = “<style>BODY{font-family: Arial; font-size: 10pt;}
TABLE{border: 1px solid black; border-collapse: collapse;}
TH{border: 1px solid black; background: #dddddd; padding: 5px;}
TD{border: 1px solid black; padding: 5px;}</style>

foreach ($snap in $currsnaps){
$user = ($snap.VM | Get-ViEvent | ?{$_.CreatedTime -match $snap.Created} | ?{$_.FullFormattedMessage -match “snapshot”}).Username
$builder = New-Object System.Object
$builder | Add-Member -Type NoteProperty -Name VM -Value $snap.VM
$builder | Add-Member -Type NoteProperty -Name SnapName -Value $snap.Name
$builder | Add-Member -Type NoteProperty -Name TimeStamp -Value $snap.Created
$builder | Add-Member -Type NoteProperty -Name SizeGB -Value $([math]::floor($snap.SizeGB))
$builder | Add-Member -Type NoteProperty -Name CreatedBy -Value $user
$snaps += $builder

Send-MailMessage -To $email_to -From $email_from -SmtpServer $email_server -Subject $email_subject -BodyAsHtml ($snaps | ConvertTo-Html -Head $css | Out-String)

(0) Comments   
Posted on 10-09-2014
Filed Under (Uncategorized) by admin

Windows Server 2012 brings PowerShell capabilities to tons of Windows services. This quick little script makes use of some of these new capabilities as they apply to Windows DHCP services. I wanted to create a script that monitors DHCP scope utilization to ensure I have plenty of free leases available in all of my scopes – so that’s exactly what this script does. Use task scheduler to run the script at some interval and rest assured your clients will always get an IP address right when they need it most. Enjoy!


$threshold = 90
$email_to = “<name@domain.com>”
$email_from = “<name@domain.com>”
$email_server = “<smtp server name>”
$scopes = Get-DhcpServerv4ScopeStatistics

foreach ($scope in $scopes) {
if($scope.PercentageInUse -gt $threshold){
$email_body = “Scope: $($scope.ScopeId) – pool IPs in use is $([math]::round($scope.PercentageInUse, 0))%”
Send-MailMessage -To $email_to -From $email_from -SmtpServer $email_server -Subject “scope threshold exceeded – $($scope.ScopeId)” -Body $email_body

(0) Comments   
Posted on 26-10-2013
Filed Under (Uncategorized) by admin

A few weeks ago we had some power fluctuations that resulted in the power flickering on and off a handful of times before going out completely. Every time this happens, I hold my breath right after the power comes back on and hope that none of my beloved electronics are fried; but this time, I wasn’t so lucky. My Asus RT-N16 router was toast.

Symptoms: When I plugged the power adapter into the router, the power light came on for a few seconds. Shortly afterwards I would hear a slight “click” and the device would just power down.

This definitely sounded like a power issue, so I wasn’t hopeful. But knowing that my warranty had long expired, I was definitely going to peel it open and check out the situation. Before I got the screw drivers and soldering iron out, I plugged in the wall wart and did a quick voltage test to ensure that wasn’t the culprit. 12.56V output from this 12V 1.25A power adapter was definitely within spec.

The RT-N16 case is a simple assembly; remove the 4 sticky rubber feet to uncover 4 philips-head screws. After removing the screws, the top pops right off with ease. Upon inspecting the circuitry, I immediately noticed a 680uF capacitor that had crowned a bit. I de-soldered this  capacitor and scrounged around until I found a 480uF capacitor (close enough). I know it’s a major pain to solder through-hole components into vias that have already been used, so I just soldered a couple of wires to the bottom of the board and soldered my new capacitor to the other end of the wires. A bit of masking tape for mounting (couldn’t find my hot glue gun), and we were back in business.

Hopefully this will encourage a few people out there to break the warranty seal and poke around for themselves. I’m sure there are tons devices out there that have been thrown away and replaced when the fix was a $0.5 capacitor and 15 minutes of time.

Bad capacitor in Asus RT-N16 Bad capacitor in Asus RT-N16 Asus RT-N16 capacitor replaced


(40) Comments   
Posted on 07-06-2013
Filed Under (powershell) by admin

printerI recently had a request to audit printer usage on specific printers in the organization. All of our network-enabled printers are shared from a single Windows 2003 Server, so my first thought was parsing event logs. The result is the attached Powershell script. Just feed the script a start and end date to filter by and it will parse the event log entries into Powershell properties that can be filtered, exported or mangled in any way you see fit. I’ve also added a department look up using the Quest AD tools since that was one of the key pieces of information we were interested in gathering. Feel free to make use of the script and modify the output however it suits your needs.


Download Get-PrinterEvents.ps1

(0) Comments   
Posted on 09-10-2012
Filed Under (powershell) by Dan

A quick and dirty script for listing all distribution groups that a mailbox user is a member of. Seems easy enough, but I couldn’t find anything on the googlez…so here ya go!

$user = Read-Host “Please enter the name of a user”

if (Get-Mailbox $user){
$dgs = Get-DistributionGroup -ResultSize unlimited

write-host “$user is a member of the following distribution groups (this may take a few minutes):”

$dgs | foreach {if ((Get-DistributionGroupMember $_.Name) -match $user){write-host $_.Name}}
Write-Host “User not found…run script again. Sober up first.” -foregroundcolor red


(0) Comments   
Posted on 15-06-2012
Filed Under (powershell) by Dan


Just a quick script that lists all Windows VMs on a VMWare host and returns the version of Windows that is running. It goes without saying that you must have Administrative privileges on the machines being queried (this could be changed with a slight tweak to the Get-WMIObject command). Without further ado:

$output_file = “path_to_file”
$vms = Get-VM | ?{$_.PowerState -eq “PoweredOn”}
$vmos = foreach($vm in $vms) {Get-WmiObject -ComputerName $vm.Name Win32_OperatingSystem -EA SilentlyContinue | Select-Object @{Name=”ComputerName”; Expression={$vm.Name}}, @{Name=”OSVersion”; Expression={$a = $_.Name.split(“|”); $a[0]}}}
$vmos | Export-Csv $output_file -NoTypeInformation

write-host “Process complete. Output saved to $output_file” -foregroundcolor “yellow”

(1) Comment   
Posted on 22-11-2011
Filed Under (Arduino, electronics) by Dan

I tried compiling Hangmanduino (see original post here) again using v 0021 of the Arduino IDE and found out quickly that things had changed. So I began troubleshooting and found that the WString library I was using was obsolete in the new IDE. Long story short, I was able to make a few adjustments to the code and got it up and running. Get the new code here (no need to download any additional libraries).


(0) Comments   
Posted on 07-10-2011
Filed Under (powershell) by Dan

So I haven’t been completely truthful with everyone up until this point. The truth is, my day job consist of a lot of corporate-like tasks since I’m a Systems Administrator. One of my many responsibilities is administration of an Exchange 2010 environment. I’m constantly being thrown curve balls and tasks that cause me to think outside of the Microsoft box. I’ve decided to branch out and share some of the problems and (more importantly) solutions that I’ve come up with. Hopefully these will help someone out there.

This is a problem we’ve been dealing with since day 1 with our Exchange environment. We have separate partitions dedicated to each database’s logs. Once and a while a client or end device burps and causes the logs to grow out of control and cause major problems for the database. We have a monitoring solution, however, that is even prone to issues once and while. The cure was a 2nd layer of protection in the form of the following powershell script. This script runs every 5 mins and reports the percent of free space remaining of each of the log partitions (luckily we named the partitions appropriately so filtering VolumeName for “LOG” was a quick fix). If the free space remaining is less than the configured threshold (20% in my case), an email/page is sent. Nothing too fancy, but definitely a handy little life saver. And without further ado – the code:

$mbxs = “[mailboxserver1]”, “[mailboxserver2]”, “[mailboxserver3]”
$maxthreshold = 20  # disk remaining percentage threshold.
$email_to = “[email_to_address]”  # where you want the alert email sent
$email_from = “[email_from_address]”  # where you want the alert email to come from
$email_smtp_server = “[your_smtp_server]”  # smtp server used to send alert email
$email_subject = “EXCHANGE LOG LUN SPACE ISSUE!”  # subject of the alert email
$email_body = “”

for ($i = 0; $i -lt $mbxs.Length; $i++){
Get-WMIObject Win32_LogicalDisk -Computer $mbxs[$i] | where {$_.VolumeName -match “LOG”} | foreach{
$server = $mbxs[$i];
$volname = $_.VolumeName;
$freegbs = [math]::round($_.FreeSpace / 1GB, 0);
$sizegbs = [math]::round($_.Size/ 1GB, 0);
$percentfree = [math]::round(($freegbs / $sizegbs) * 100, 0);

if ($percentfree -le $maxthreshold){
$email_body = “Server: ” + $mbxs[$i] + “`r Volume Name: ” + $volname + “`r Disk Size: ” + $sizegbs + “GB `r Space Remaining: ” + $freegbs + “GB `r Percent Remaining: ” + $percentfree + “%”
Send-MailMessage -To $email_to -SmtpServer $email_smtp_server -Subject $email_subject -From $email_from -Body $email_body

(0) Comments    Read More