Nov 112014

Here is a way for you to keep your EMIE site list up to date using CI. Enterprise Mode IE is Microsoft’s method for allowing backwards compatibility with sites that do not fully support Internet Explorer 11’s Edge mode. I don’t go into detail about how to set up EMIE, more information on how to set it up can be found via MSDN.

First we start with the detection script. This script returns the version number of your site list XML. Be sure to replace the $file string listed with the correct path and file name of your EMIE list XML.

# EMIE XML Version Check (Detection) Script for CM12 Compliance Settings
# by Robert Hollingshead

# November 11th, 2014
# Find more CM12 Compliance Setting scripts at!

# Supress error messages.
$ErrorActionPreference = "SilentlyContinue"

# Enter the path and name of the XML file here. 
$file = '{enter path and filename here}'

# Get the XML Content and then unwrap its tags into individual lines.
# We could leave out the split method and just go by the entire InnerXml,
# but IMHO, this way makes more sense and is friendly to ANY 
# odd modifications of the remediation script should they be needed. 

Try {
    [xml]$sites = Get-Content $file
    $unwrappedsites = $sites.innerxml.split('</>')

    # Look for the rules version, split out the line, 
    # and output the second string which will be the
    # version itself. 

    ForEach($line in $unwrappedsites) {
        if ($line -like "*rules version*") {
            write-host $line.split('"')[1]

    # If the split of $sites failed, we'll catch it and
    # spit out versin 0 to indicate the file doesn't exist.

    } catch {   
    write-host 0

The detection script is going to return the current version of the XML file on the client, not a true or false. So your compliance rule will be equal to the version you want all your clients to be at. How to get that updates can be done via this remediation script. First thing, there are two values that must be changed, the $version, and the $file strings. $version will be the equal to the version you want all your clients to be at. Make sure  you have it set to the same version as in your compliance rule or you’ll never be compliant. The second is the $file string, which will be the same as in the detection script.

Next  you will add all the domains. There are four lines beginning with “$domain = New-Object PSOBject.” We are building an array of Domains as well as if they are to be excluded or included in EMIE. Each domain will be a TLD. True means “exclude this site from EMIE” and is useful for preventing an intranet site from running in compatibility mode. False means “include this site in EMIE” and is useful for placing a site on the internet in compatibility mode, or if the site is setting its compatibility via META tag and you wish to override. Here is the script, stay tuned after the script for a few notes.

# EMIE XML Update (Remediation) Script for CM12 Compliance Settings
# by Robert Hollingshead

# November 11th, 2014
# Find more CM12 Compliance Setting scripts at!

# This script keeps your EMIE (Enterprise Mode IE 11) XML up to date.

# Enter the resultant version here. This is your XML list version.
# Increment when there are changes. 
# Make sure that you change the compliance rule to match. 
$version = "{enter version number here}"

# Enter the path and name of the XML file here. 
$file = '{enter path and filename here}'

# Setup Array for domains and the resulting xml 

[system.array]$domains = $null
[system.array]$sitesxml = $null

#Add domain here.
#False indicates that EMIE should run for non-intranet site. 
#False also indicates that EMIE should run for intranet sites that are saying they are
#compatible via server meta tag.
#True indicates that EMIE should not run for intranet site. 
# Copy the following four lines for each new domain. Don't forget to increment the version
# if you make any changes. 
$domain = New-Object PSObject
$domain | Add-Member -membertype noteproperty -Name Domain -Value "{tld like}"
$domain | Add-Member -membertype noteproperty -Name Exclude -Value "{false or true}"
$domains = $domains + $domain

#Now let's write out the XML. We build an array that will be written out to file. 

# Compile the version line and the opening EMIE tag.
$line = New-Object PSObject
$line = ''
$sitesxml = $line
$line = '  '
$sitesxml = $sitesxml + $line

# Compile the domain tags.
ForEach ($domain in $domains) {
    $line = '    ' + $domain.Domain + ''
    $sitesxml = $sitesxml + $line

# Compile the closing tags.
$line = '  '
$sitesxml = $sitesxml + $line
$line = ''
$sitesxml = $sitesxml + $line

# Output to the file. 
$sitesxml | out-file $file

write-host TRUE

Obviously there is some room for improvement in this script. While I can include TLD’s right now, I cannot include subdomains just yet, that ability will be forthcoming in another update of this script, or if you wish to update it yourself and contribute back that is fine too.


Jul 182014

A while back I wrote a MS SQL query to gather vitals for a PC Fleet in SCCM 2012. I have now updated it to include some more information like Make and information for the system partition (size/free/% used). I’ve also changed some of the columns to use the more Appealing Giga units of measurement instead of Mega.

This is so that if anyone ever asks what you have out there,  you can run a quick query and say “HERE YOU GO!” Enjoy! Written in Microsoft SQL Server Management Studio 2012.

NOTE: Search and replace {domain\} with your domain name or the query will fail, just FYI. Also, when you copy and paste, the lines will remain intact.

select distinct

CS.Manufacturer0 [Make],
CS.Model0 [Model],
CS.Name0 [Hostname], 
replace(CS.UserName0,'{domain\}','') [Primary User],
OS.Caption0 [OS],
OS.InstallDate0 [Image Date],
cast(CPU.MaxClockSpeed0/1000.00 as decimal(10,2)) [Speed (MHz)],
CPU.Name0 [CPU],
CPU.NumberOfCores0 [Cores],
CPU.IsHyperthreadCapable0 [Hyperthread],
DSK.Caption0 [HDD],
cast(DSK.Size0/1000.00 as decimal(10,2)) [HDD Capacity (GB)],
cast(LDSK.Size0/1000.00 as decimal(10,2)) [C Size (GB)],
cast(LDSK.FreeSpace0/1000.00 as decimal(10,2)) [C Free (GB)],
cast((LDSK.FreeSpace0 * 100.00)/(LDSK.Size0 * 1.00) as decimal(10,2)) [C %Free],
cast(OS.TotalVirtualMemorySize0/1000.000 as decimal(10,3)) [Virtual Memory (GB)],
cast(OS.TotalVisibleMemorySize0/1000.000 as decimal(10,3)) [Visible Memory (GB)]


left join v_GS_PROCESSOR CPU on CS.ResourceID = CPU.ResourceID
left join v_GS_DISK DSK on CS.ResourceID = DSK.ResourceID
left join v_GS_OPERATING_SYSTEM OS on CS.ResourceID = OS.ResourceID
left join v_GS_SYSTEM SYS on CS.ResourceID = SYS.ResourceID
left join v_GS_LOGICAL_DISK LDSK on CS.ResourceID = LDSK.ResourceID

SYS.SystemRole0 like 'Workstation'  and
LDSK.Caption0 like 'C:' and
DSK.DeviceID0 like '\\.\PHYSICALDRIVE0' 

order by Make, Model


Jan 212014

I admit that as far as technical support experience goes I’m somewhere in between, having worked in the IT industry since 2004, roughly a decade now. But I have seen it all, I might be bold in saying that I have done it all. I have made mistakes and have witnessed mistakes with customers over the phone. I have learned that even the most irate user on the phone can be singing your praises, but not without battle scars.

Here are my “Golden Rules” for technical support:

1. You are the expert, act like one.

You’re in control over the phone. The user has attempted within the bounds of their own knowledge to resolve their issue, but they’ve given it their last keystroke and now they want someone else to take control of the situation and fix their problem. By virtue of a phone call, they have given control to you, a person whom they know to be an expert.

Hint: Even if you’re not an expert at what you are troubleshooting, you can be an expert in finding out the answer.

2. The user you are working with is not an idiot.

If the user is an idiot, then why are they calling you? What’s idiotic about calling you? Resist the temptation to put the phone on hold and say something about the “ID10T error on the phone” in order to share what really is just their ignorance with your co-workers. Your moment of arrogance will bleed through the phone like a snake, and it will end up biting you in the end.

3. Never say: “I don’t know” or “that’s impossible”

User’s don’t like to hear this. It gives them the impression that they have hit a dead end and will have to do more work to resolve the issue. It also gives them the false assumption that you’re not an expert. After all, you’re the expert. Remember rule 1.

4. Your user’s time is ALWAYS more valuable than your own.

In the IT support industry, more often than not you’re working in a cost center, not a profit center. Because of this, your time costs the company money. The more you do within a given amount of time saves money for the company, and if you put things off, or blow off a customer, you’re wasting time and therefore costing more money.

I like to argue that there really isn’t any good way to get a quantitative metric on something so variable as rendering IT support, given that every single problem always has something that sets it apart from others, even password resets. So what I like to follow is to err on the side of caution and make my users time more valuable than my own. Sure, in practice we all slip, so treat this as a guideline. It cannot hurt.

5. Never place blame in front of a user.

It’s important to present a united front to your customers, be it internal or external. We all make mistakes, there are decisions made that we don’t agree with, and from time to time these will make it harder to support our user base. The right way to deal with this is within your own IT organization. Don’t complain to your users. Chances are this will not effect the change you are looking for, instead it will alienate your user base.

Hint: Your user’s don’t care that you have to go through a lengthy process to request access to a widget, they only care that you get their widget access approved in a timely fashion.

6. Never assume.

It’s said that “assume makes an ass of you and me.”

We work in a field where objective information is the rule. There can never be an opinion about how a computer or piece of software works. Because of this, IT affords you a luxury of never having to assume something. Computers work on true and false, never a “maybe.” If you don’t know a fact, you can look it up.

Assumptions are dangerous in IT, because when they prove to be incorrect, something happens that can be catastrophic. For instance, I assumed once that I was on a different print server and ended up deleting all the printers off of a mission critical server. We recovered, but because I was going by assumptions, it made an “ass of me.”

7. Take notes.

When you’re on the phone with lots of users on any given Monday, having notes to fall back on is a good thing, whether it be in the ticketing system or in a spiral notebook. I prefer the ticketing system because it creates an instant troubleshooting log. Be thorough and collect any information you can no matter how useless it seems. This is because of one of your colleagues are helping you and the see a pattern in your notes that you didn’t see,  you just saved yourself a lot of time.

8. Know your toolkit. Use it.

No one ever expects us to be “computer whisperers.” One cannot solve a computer by laying hands on it and yelling “heal thyself…”

…Unless there’s a grounding problem and you’re completing a circuit by doing such, but realistically, aside from the fact that such a thing will probably kill you, you have a toolkit.

Software like the Sysinternals Suite or GRC’s Spinrite, are examples. There are many more tools, too many to list, but if you’ve read this far you already have a toolkit that you use on a daily basis. It’s good to know those tools and the information they provide. They will save you time and make you the expert, so know your toolkit.

9. Be thorough. Never leave out information because it is “obvious.”

What’s obvious to you may not be obvious to a colleague no matter how technically proficient they are. I believe this is the chief cause of effort duplication. If two technicians find the same setting, and the first one made an assumption (there’s that word) that it was a known condition and left it out of their notes, while the second realized it was the root cause but it took them hours to get there, then time was wasted.

10. This is not magic. You are not a wizard. Don’t be arrogant.

It is so easy to become elitist in IT. You learn things that your users may not know. I’ve had users tell me I must be really smart since I’m able to solve their problem. These are people who have intimate knowledge in their own fields. They know things about their own fields that I would never hope to understand. My usual reply to them is “You wouldn’t want me doing your job.”

The answer is that we are specialists in our own field, we are computer experts, we are not financial exports, nor are we doctors. This is not wizardry, this is just a profession.

11.  Never “cold hold” a user on the phone.

This is rude, and no, saying “please hold” does not give you a pass. Always give the choice to the user. More specifically I am talking about the pesky mute button. If I ever ran a call center, I’d give the mute button a timer and call it a cough button.

People are psychological creatures. When you hear someone on the other end of the line it has better psychological impact than whenever the person on the other end of your line is met with a wall of silence. Plus, if they speak up and you forget your mute button is on its pretty embarrassing.

So unless you get permission from the user, no mater how odd this sounds, don’t mute.

12. There are no problems, only opportunities.

This may be the most important. Take responsibility for resolving the problems you are presented with and treat them as an opportunity. This allows you to prove yourself, and this is where the pay raises and promotions come from.

Always go above and beyond in doing technical support. It seems like a mundane job that lacks the real meat and bones of working with servers and configuring databases, but in the end you are the conduit between the user and the rest of IT. Treat that time as an opportunity, and good things will come.

I know some of this sounds like a self help guide, and perhaps some of it is. Perhaps I should write a book on it. 🙂

If you have additional rules or something you’d like to add, just comment, and perhaps I will edit them into this post.