5 Myths of Modern IT


These are just five (5) of the most common statements/assertions/quotes I’ve overheard over the years while working in IT.  Every time I hear them, I have to take a deep breath and suppress my inner angst (to put it mildly).  This post isn’t all that funny actually, but I ran out of coffee and it’s too late for bourbon on a weeknight.  So I attached my custom-fit tin-foil hat and henceforth pontificate…

“The goal of Automation is that it frees up employees to focus on other important tasks”

Conceptually, this is plausible.  But, and this is a big BUT (and I cannot lie, all you other brothers can’t, oh never mind…), it depends on the source.  ‘Who’ initiates the push towards automation is what determines the validity of this statement the most.  If the premium placed on automation is cultivated in the ranks, this statement can be, and often is, very real.  However, when it’s initiated from the “top” (usually business, rather than technical ranks) it’s almost always (okay, 99.999999999999999999999999999999999999999999999999999999999% of the time) aimed at reducing staff and employee costs.

I’ve seen various spins and flavors of this, depending upon business culture.  The “reduction” can range from departmental shifts, to demotions, contracting-out, layoffs, and outright terminations (depending upon applicable labor laws).  Indeed, as much as I love (and earn a handsome living on) business process automation, using IT resources, I never allow myself to forget the ultimate goal: to reduce human labor demand.  The more I spend time with non-IT management, the more I see evidence to prove this assertion every day.

With that said, if your particular automation incentives are derived internally, push onward and upward.  Don’t let me talk you out of that (why would I?)

“The value of the cloud is that it enables on-prem expansion with fewer constraints”

This is a contextual statement.  Meaning, taken out of context, it is indeed a valid statement.  However, when inserted into standard sales talk (also commonly and scientifically referred to as “talking shit”) it’s often sold as being the premium value in the over-arching model.  In reality, I have seen only two (2) cases, and only heard of two (2) others, out of dozens of cases, where an infinite hybrid model was the ultimate goal of a cloud implementation project.

The majority of enterprise cloud projects are aimed at reducing on-prem datacenters, often to the point of complete elimination.  There’s nothing inherently wrong with that; it makes good business sense.  But selling it under a false pretense is just wrong.  Indeed, of the last five (5) cloud migration projects I’ve been involved with, the customer stated something akin to “I want to get rid of our datacenters” or “I want all data centers gone“.  The latter quote came from a Fortune 100 company CIO, with a lot of datacenters and employees.

“Who needs sleep?”

Don’t fall victim to this utter bullshit.  If you believe you only need a “reboot” as often as your servers do, you’re putting your own life at a lower value than common hardware.  If you’re a “night owl”, that’s fine, but only as long as you adjust your wake-up time to suit.  Always ask yourself where this inclination to never sleep starts.  Is it coming from management?  From your peers?  From personal habit?  If it’s coming from management, move on to a better workplace.  If it’s coming from your peers, you need to expand your network.  If it’s coming from personal habit, fix it.

A few years ago, I fell into the habit of working myself almost (literally) to death.  Mostly from what I call “code immersion”.  That urge to “get one more line done” and then another, and it never ends.  I was averaging 2-3 hours of sleep over the course of a year.  It finally caught up to me in a very bad way.  I’ve since taken action to prevent that from happening again.  I’ve seen way too many people die from not taking care of themselves.  Way too many.  Don’t be another statistic.

“This is cutting edge”

I have another quote (and I’m still trying to identify the true source of it), that runs counter to that: “We live in ancient times“.

Everything we do in IT, and I mean EVERYTHING, will be gone from this Earth long before most of the furniture in your house.  Long before your house is gone.  Statistically speaking, this is a valid statement.  Information Technology is a process, not an end result.  It’s a process of optimizing information access and accuracy, which evolves over time.  The tools and technologies employed to that purpose also evolve.

“The customer is always right”

If they were, then why do they need you?  And more importantly, why are they paying you to help them?  That said, the customer holds the purse strings, and the promise of future work, so don’t ever charge out of the gate with a smug demeanor.  Every new customer engagement should start off deferential.  It should then evolve and progress based on circumstances and communication.   However, anyone who works in IT and insists that the customer is “always right” is misguided or just stupid AF.

Honorable mentions (phrases that annoy the $%^&* out of me)

  • “You can’t afford NOT to!”
  • Excessive use of buzzwords like “holistically”, “literally” and “ummm”
  • “It pays for itself!”
  • “It’s the next ______, only better!”
  • “Why? Because ours is a better solution”
  • “The Cloud is a fad”


Everything you read above could, quite possibly, be entirely rubbish.  After all, I’m a nobody.  I just call it as I see it.

What Would it Take to Move from SCCM to Intune?


Every week I’m on a conference call with customers who are using, or interested in using, SCCM and Intune/EMS.  Every single conversation finds its way into the following questions:

  1. “Should I use Intune to manage Windows 10 Surface Pro and Dell/HP laptops outside the network?”
  2. “Should I integrate SCCM and Intune?”
  3. “Can I just move all my SCCM infrastructure into Azure?”

Good questions.  Unfortunately, the answers aren’t yet fully-baked.  The answer to each is “it depends”.

But during one call in particular, we had a bunch of crusty old SCCM engineers discussing the past, present and future of the product.  This wound up in a discussion about “what would it take?” …to switch to Intune as the primary management interface, even for on-prem devices.  The gist of this was not about “eventually” or long-term, but rather, what could be dropped in our lap sooner, and make us say “oh, snap! time to reconsider!”

Anyhow, we came up with the following:

1 – Hybrid Deployments

The ability to configure application deployments in a cloud console, while directing clients to fetch the content from on-prem sources.  The reverse of cloud DPs, if you will.  The application configuration resides in the cloud, and the source content, and deployment content, are hosted on-prem.

This could be handled with the Intune client being equipped to poke for the on-prem location as a means to determine on/off prem status.  If on-prem, download the content from the on-prem DP.  Otherwise, follow the configuration (wait, or download from another source).  The goal would be to support cloud clients, mobile clients and on-prem clients, where each could pull content based on proximity, performance and least cost.

This would also span out to OSD as well.  If the WIM files, driver packages, and other bits were available from an on-prem source (via PXE/WinPE) it could work. Maybe it would require something like iPXE Anywhere, or maybe not.

2 – Expanded Deployment Types

Intune would need to be able to deploy more flexible types of instructions.  Such as EXE files with additional parameters (aka “switches”), MSI’s with MST transforms.  PowerShell scripts would be nice too.

3 – Full Inventory

This is actually two parts combined.  The first being a split inventory detection that pulls a complete (e.g. SCCM-style) WMI inventory data set from a full Windows client, but does the status quo for other clients.  The second part being a means for leveraging that extended inventory to save time/effort in other areas (targeting policies, apps, etc.)

And speaking of inventory, is there a CIM-like equivalent for mobile platforms like iOS, Android, etc.?


Granted, this is *not* enough for SCCM to throw in the towel and surrender.  But these seem to be the most-used features in SCCM which are not replaceable with Intune, yet.

If this is true, or “accurate”, then it doesn’t seem like such a tall hill to climb.  We were not entirely sober at the time, so it’s quite possible we overlooked something here.  Maybe something embarrassingly obvious, but hey.

Thoughts?  Substance or Garbage?  Let me know.




This is extracted from a real, actual conversation from this past week.  Names have been obfuscated to avoid being litigated and imprisonated, er, something like that.  Anyhow, grab your popcorn and enjoy!

Customer: “What are the new Dev and Test environments going to look like?”

Architect: “They will look exactly like the production environment, except that the domain names will end with ‘.dev’ and ‘.test'”

Customer: “But how will it be configured?”

Architect: “Exactly the same as the production environment, except that the domain names will end with ‘.dev’ and ‘.test'”

Customer: “Do you have an architectural diagram for each, so I can get a better idea of how they’re going to be configured?”

Architect: “Did you receive the design document for the production environment?”

Customer: “Yes.”

Architect: “Did you have a chance to look at the diagram in the design document?”

Customer: “Yes.”

Architect: “Dev and Test will be exactly the same.  Including the diagrams.  The only difference will be the domain suffixes.”

Customer: “I would still like to see a diagram to better understand.”

Approximately 30 seconds of complete silence…

Architect: (softly) “I’m not sure what you really need.”

Customer: “I would just feel better having a diagram.”

Architect: “Like the one shown in the production design document?”

Customer: “Yes! Exactly like that!”

Architect: “Dev and Test are identical.  Only the two domain names have different endings.”

Customer: “Ok. I understand.”

Architect: “Ok. That’s good.  Are there any other questions?”

Customer: “So, when do you think you could send me the diagrams for the Dev and Test environments?”

wash. rinse. repeat.

The Ballad of Orchestrator

wpid-chinese-take-out.jpgIf I had a dollar for every time I’ve had a discussion with someone who works with Microsoft System Center, while I stare at the floor, wondering why they never bothered to have that weird reddish-brown stain removed, and it’s in their main lobby, as they describe the pain, and effort they endured to build some crazy semi-automated chain of mouse traps using a wheelbarrow full of third-party utilities, truckloads of scripting, and a few crates of some long-forgotten Windows CLI utilities, registry hacks and whatever, and after they were done, I’d be thinking to myself “that was one stupidly-long run-on sentence”, but I end up saying, “You know? You could’ve knocked that out in a lot less time using Orchestrator”, well, I’d be rich enough to not have time to write a blog.  I’d be too busy having my toenails custom painted while skydiving from my private jet onto the deck of my private yacht. Floating in the lagoon of my private island.  Okay, that’s a big stretch.


First off, 99.999999999% of the time, here’s what the response is, “What’s Orchestrator?”

(15 seconds of awkward silence ensues)

Whatever Microsoft has paid their marketing folks, I would like to officially ask for 10% of it, just for doing my part to inform their customers, “well, it’s this amazing virtual Lego kit that you can use to build just about anything. Oh, and by the way, you already paid for it.”  That might help pay a few bills at least.  I think that I’ve earned it.  Or I could be delusional too.

Anyhow, for those who still begin every explanation with “it was called Opalis, once…”, and have ripped open that Christmas box and put the batteries inside, you know what I’m talking about.  You also know the dreaded feeling of hearing someone say one of the following:

“They didn’t make any changes to it in System Center 2016”

“It’s dead, Jim.  Long live the cloud.”

Sad.  Truly sad. It never really had it’s glory day (imho).  Isolated moments of sheer awesomeness are to be found, for sure.  But on a ubiquitous (see?  you didn’t think I could whip out a big word like ubiquitous, did you?) and pervasive scale? No; not what it really deserved. It was that incredible 2nd string player, drafted in the 2nd round, that was capable of smashing records, but never got on the field, and now it’s hitting retirement age.

Not so fast.

Just like Arnold Schwarzenegger (I cheated on the spelling, I had to), it can still press a few hundred pounds while smiling.  Maybe while clenching a cigar in it’s mouth at the same time.

Some interesting use-cases I’ve seen in the past year or two…

  • The typical New-Hire / Employee-Term scenario runbooks, but with extensions for ordering facilities services (phone, desk, chair, whiteboard), telecom (phone), computer equipment (HR app checkbox for “mobile user” triggers order for laptop or tablet), and notifying front desk security personnel with employee photo.  And don’t forget the standard AD group memberships, attributes, and OU management stuff.
  • Monitoring file system folder where app-devs upload final code check-ins, read specific files to create SCCM applications, deployment types, detection methods, requirements, as well as distribute to certain DP groups, and deploy to Collections (with additional parameters)

There have been a few others.  Some were just discussions around “what if…”, which could have easily turned into more amazing concoctions, but I didn’t stick around long enough to find out if they did.

Alas, before I toss back a ceremonial shot (of something cheap, like me), I have to say I’ve spent some time with Azure Automation runbook authoring and I have to say, it’s very, very promising indeed.

Bonus: BoxStarter Server Config Script


Sort of a Part II – This part was somewhat eluded to in the previous post, this script is run immediately after provisioning a toothless Hyper-V guest running Windows Server 2016.

Sequence of events:

  1. Provision VM guest:
    1. 12-16 GB memory
    2. 1 or 2 vCPU
    3. 1 Differencing Disk pointed to a VHD with sysprepped Windows Server 2016 (I’m too lazy and cheap to stand up a real VMM environment, and I don’t have the right hardware for it anyway)
    4. Two (2) SCSI disks, at 200 GB each, dynamic sized VHDX (lab environment only)
  2. Boot the VM guest
  3. Finish the OOBE process
  4. Edit the TXT script in GitHub (Gist item)
  5. Click RAW view, copy URL
  6. Restart (to invoke Hyper-V guest tools, and enable the guest clipboard)
  7. Open PowerShell console
  8. Type http://boxstarter.org/package/nr/url? followed by the URL to the raw Gist file
  9. Press Enter

What it does:

  • Rename the VM
  • Assign a static IPv4 address and gateway
  • Initialize and format the 2 secondary disks at 64k units, with labels
  • Join to domain
  • Reboot
 invoked from BoxStarter to prepare a general Windows Server configuration
 other scripts follow on to this to create specific roles

 written by David Stein
 1. powershell console
 2. start http://boxstarter.org/package/nr/url?(paste the raw-view URL here)
 1. Machine has Windows Server 2012 R2 or 2016 installed
 2. Machine has 1 OS disk and 2 additional disks
 note: using hyper-v with differencing disk as disk[0]
 3. The additional disks are not online (vmguest default)
 note: using hyper-v with 2 scsi vhdx disks as disk[1] and disk[2]
 4. [global parameters] below are configured prior to running
 powershell start http://boxstarter.org/package/nr/url?....

# global parameters
$ServerName = "CM01"
$DomainName = "CONTOSO"
$OuPath = "OU=Servers,OU=Corp,DC=contoso,DC=com"
$DomainUser = "$DomainName\sccmadmin"
$IPv4Address = ""
$IPv4Mask = ""
$IPv4Gateway = ""
$IPv4DNS = ""

$ScriptVersion = "2016.12.19.01"

$Boxstarter.RebootOk = $true

write-host "Script Version $ScriptVersion" -ForegroundColor Green


write-output "info: configuring static ip address: $IPv4Address ..."
$wmi = Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IpEnabled = 'true'"
if ($wmi -ne $null) {
  $wmi.EnableStatic($IPv4Address, $IPv4Mask)
  $wmi.SetGateways($IPv4Gateway, 1)
else {
  write-output "error: no active network adapter found"

$HostName = $($env:computername).ToUpper()
if ($HostName -ne $ServerName) {
  write-output "info: renaming host to $ServerName..."
  Rename-Computer -NewName $ServerName
  if (Test-PendingReboot) { Invoke-Reboot }
else {
  write-output "info: computer is already named $ServerName"

write-output "info: provisioning secondary disks..."
$disks = @("1=APPS","2=DATA")
foreach ($disk in $disks) {
  $diskset = $disk.Split("=")
  Get-Disk -Number $diskset[0] |
  New-Partition -AssignDriveLetter -UseMaximumSize |
  Format-Volume -FileSystem NTFS -NewFileSystemLabel $diskset[1] -AllocationUnitSize 65536 -Force -Confirm:$False
write-output "info: secondary disks have been provisioned."

write-output "info: checking domain join status..."
$Dom = $env:userdomain
if ($Dom -ne $DomainName) {
  write-output "info: joining computer to domain $DomainName..."
  Add-Computer -DomainName "$DomainName" -Credential $DomainUser -OUPath $OuPath
else {
  write-output "info: computer is already domain joined."

$sm = Get-ItemProperty -Path HKCU:\Software\Microsoft\ServerManager -Name DoNotOpenServerManagerAtLogon -ErrorAction SilentlyContinue
if ($sm -eq $null) {
  write-output "info: disabling server manager at startup..."
  New-ItemProperty -Path HKCU:\Software\Microsoft\ServerManager -Name DoNotOpenServerManagerAtLogon -PropertyType DWORD -Value "0x1" -Force


write-output "info: base configuration is finished!"

$Boxstarter.RebootOk = $False
Restart-Computer -Force

Sa-mo Azure Funk-shunz

Yo. Dig.  These are primarily for serialized PowerShell use, not template use (i.e. JSON-infused).  Peace.


function Make-ResourceGroup {
  param (
    [parameter(Mandatory=$True)] [string] $Name,
    [parameter(Mandatory=$True)] [string] $Loc
  $rgx = Get-AzureRmResourceGroup -Name $Name -Location $Loc -ErrorAction SilentlyContinue
  if ($rgx -eq $null) {
    Write-Verbose "info: creating resource group: $Name..."
    $(New-AzureRmResourceGroup -Name $Name -Location $Loc -ErrorAction SilentlyContinue)
  else {
    Write-Verbose "info: resource group already exists: $Name"

Verify requested image publisher, offer and SKU exist in the marketplace…

# verify marketplace image publisher is valid

function Test-ImagePublisher {
  param (
    [parameter(Mandatory=$True)] [string] $Publisher,
    [parameter(Mandatory=$True)] [string] $Loc
  $(!(Get-AzureRmVMImagePublisher -Location $Loc | ?{$_.PublisherName -eq $Publisher}) -ne $null)

# verify marketplace image publisher offername is valid

function Test-ImageOffer {
  param (
    [parameter(Mandatory=$True)] [string] $Publisher, 
    [parameter(Mandatory=$True)] [string] $OfferName,
    [parameter(Mandatory=$True)] [string] $Loc
  $(!(Get-AzureRmVMImageOffer -Location $Loc -PublisherName $Publisher | ?{$_.Offer -eq $OfferName}) -ne $null)

# verify marketplace SKU exists for specified publisher and offer

function Test-ImageSKU {
  param (
    [parameter(Mandatory=$True)] [string] $Publisher, 
    [parameter(Mandatory=$True)] [string] $OfferName, 
    [parameter(Mandatory=$True)] [string] $Sku,
    [parameter(Mandatory=$True)] [string] $Loc
  $(!(Get-AzureRmVMImageSku -Location $Loc -PublisherName $Publisher -Offer $OfferName | ?{$_.Skus -eq $Sku}) -ne $null)


$PubName  = "MicrosoftWindowsServer"
$Offer    = "WindowsServer"
$SkuName  = "2012-R2-Datacenter"
$Location = "East US"

if (!(Test-ImagePublisher $PubName $Location)) {
  Write-Output "Hold up! You best take yo ass back to the shed, G!"
if (!(Test-ImageOffer $PubName $Offer $Location)) {
  Write-Output "Oh, no no no... this is wack."
if (!(Test-ImageSku $PubName $Offer $Location $SkuName)) {
  Write-Output "That's it. Now I gotta choke yo ass!"
# all good, continue on...

Does Blob Exist? Good Blob. Good Blob

Azure powershell stuff again.  Because it’s all I’ve been doing for 20 hrs straight.  I’m a zombie.  Need sleep….

Warning: no error/exception handling.  This is the economy class. :/

# Return $TRUE if blob (file) exists in specified location

function Test-BlobExists {
  param (
    [parameter(Mandatory=$True)] [string] $BlobName,
    [parameter(Mandatory=$True)] [string] $ResourceGroupName,
    [parameter(Mandatory=$True)] [string] $StorageAccountName,
    [parameter(Mandatory=$True)] [string] $ContainerName
  Write-Verbose "[test-blobexists]"
  Write-Verbose "info: BlobName............. $BlobName"
  Write-Verbose "info: ResourceGroupName.... $ResourceGroupName"
  Write-Verbose "info: StorageAccountName... $StorageAccountName"
  Write-Verbose "info: ContainerName........ $ContainerName"

  $StorageKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $ResourceGroupName -Name $StorageAccountName)[0].Value
  $StorageContext = New-AzureStorageContext –StorageAccountName $StorageAccountName -StorageAccountKey $StorageKey
  $(Get-AzureStorageBlob -Context $StorageContext -Container $ContainerName | ?{$_.Name -eq $BlobName})