Your basic ITPro blog... What's going on at work, what I'm interested in.

Monday, April 28, 2008

My Son Is Here!


God is good!

My wife and I are excited to announce the birth of our second son, Samuel. He was born on Sunday and is now doing well. He had a bit of 'respiratory distress', which is not totally uncommon for a baby a couple of weeks early. But, he is doing great and we are expecting to take him home in the next couple of days (he is still being watched in the NICU for a bit longer).

My wife is doing wonderfully. We had a much easier time with this one than with our first. Big brother just loves the new one, repeatedly telling everyone, "He is so cute!"

Events in life like this bring one word to my mind, 'PERSPECTIVE'. I often get so caught up in work; technology, projects, tasks and to-dos... And then LABOR STARTS! Suddenly priorities and perspectives shift. This kid is every thought and every moment to us right now.

Having family and friends around is such a huge blessing. God knows exactly what we need, and He is overflowing in His love to us. He has put so many wonderful people in our lives, we just feel His arms around us each time we get a visit, a call, a hug.

Yes, truly, GOD is GOOD!

Father, may we be faithful with this life you have entrusted to us. Help us to be parents that love, instruct, and point this soul to You. Thank you for this blessing. Thank you for Your love and salvation! AMEN.

Thursday, April 24, 2008

Upgrading Infrastructure

imageIt's nice when a project comes along that forces you to focus on other areas of your installation that you know need attention, but haven't made the time to tackle. We have a couple of things we are looking to do around here that are requiring us to upgrade some of our infrastructure gear and document as we go along (a nice side-effect).

Our current wireless installation is not really too robust. Using a variety of consumer-class WAPs, we have been endeavoring to provide LAN and guest access for wireless users. The implementation has been, well, support-intensive. This is all on our Mesa campus. On our Gilbert campus -- with its shiny new all-Cisco, highly-engineered and designed network -- we are using Cisco wireless technology. Specifically, we have a Wireless LAN Controller (WLC) and six Wireless Access Points (WAPs) providing both LAN and Guest access to our wireless population. We can do this because the network was engineered for it, set up with a sufficiently-robust VLAN/subnet infrastructure. The WLC that we have can support up to 12 WAPs. With our P2P link between the campuses, we were thinking that we could use this WLC to deploy a few WAPs on our Mesa campus too. Well... yes and no.

Our Mesa campus infrastructure is what I call 'typical'. That is, it has grown 'organically' over time. As such, we have a variety of hardware platforms, models, and capabilities. This is fine (though not ideal) until you try to run more complicated network services and configurations. But, getting back to my first comment, this is allowing us to use the 'wireless upgrade' project to push a mini- 'infrastructure upgrade' project.

imageTo that end, we will be replacing some older, less-functional Dell and HP switches with new Dell PowerConnect 5448 and 5424 switches. With this upgrade, we will have much improved VLAN and QoS support, two technologies that are critical for us moving forward. Our ultimate goal is to deploy a Cisco network on the Mesa campus as well, fully integrating the two campuses, including the Cisco phone system. But, these new Dell switches will get us through until that project gets 'front-burnered'.

Another related project that this is pushing forward is our IP Addressing scheme overhaul. We are currently not really using subnetting effectively on our Mesa campus. Also, our IP addressing scheme on the Mesa campus does not match our Gilbert campus. While this doesn't really matter from a functional standpoint (as long as routing is set up correctly), things would be much more comprehensible if these networks were more similar. Currently, we don't have the VLANs in place to support additional subnets. So, we learn! We learn new things like 802.1Q, GVRP, implementing QoS, WAN routing, etc. Fun stuff!

Our network here will take a major leap forward with these changes.

Thursday, April 17, 2008

Big Week Here At CCCEV

FirstVMAs you may have read, I am facing two significant projects here at Central. First, we ordered a Dell PowerEdge 2950 to use as a virtualization platform. This server will run Windows Server 2008 DataCenter Edition with Hyper-V.

The second big item (which ties in to, and was dependent on, the server) was the implementation of a Groove Server platform for team collaboration. I will hit on this item first.

I spent most of last weekend researching Groove and learning everything I could about it. It is a pretty slick technology. We knew that we could use the Groove application (part of Office 07) to create 'workspaces'. Our big issue, and one that prompted the idea of a Groove Server infrastructure, was backups. Groove workspace files would be sitting out on the members' computers, but there would be no central location (on a network resource) where we could then performs backups.

Well, through my poking around this weekend, I found that you can connect Groove to a SharePoint site. That is, you can have your Groove workspace synchronize with a SharePoint file folder. Pretty cool! So, we don't need a whole Groove Server infrastructure to get the files onto an easily 'backup-able' resource.

Our plan now is to implement a Groove workspace for our team, integrate it with a SharePoint site (which is accessible from the Internet), and let them run with it. Hopefully, it will work well, the team will be satisfied, we will get backups, and my shiny new server will be available for other fun! Which brings me to my second item...

I have read, watched, and generally consumed so much information about Hyper-V that I could hardly wait to play with it. As it turned out, there were many more steps (and mis-steps) involved to get me to the screencap you see above (which is of my first VM on Hyper-V running a Win2003Ent install).

After unboxing the server and having a look inside (you always have to look inside, right?!) I installed the 4-port NIC. This will give us six NIC ports total, enough to connect this server to our LAN, our SAN, and a few ports for VMs. Then it was time to install the OS. Windows 2008 DCE went on very smoothly using the Dell System Management Tools. The process of running updates was a bit different, as is most of the UI... Not crazy different, but just enough to slow me down. But, updates got on, as well as the Hyper-V Role.

I really like the idea of Roles for servers. I like that the OS comes stripped down and that each Role only installs what it essentially needs to function. This, of course, is even more drastic in the Server Core implementation, which I have not played with yet.

My next big issue was storage for this box... It came with 70GB drives mirrored for the OS, which isn't much for a machine that will eventually be hosting multiple VMs. But, that is why we have a SAN. I wanted to use a 300GB virtual disk from our MD3000i SAN for storing VMs and other related files (ISOs, etc.). I thought this was going to be a snap, after all, I had connected four other servers to our SAN already. Of course, nothing is as simple as it seems.

First of all, Server 2008 comes with an iSCSI Initiator already installed and ready to go.  When I went to install the MD Storage Manager software, I got an install failure. After some research, and a call to Dell, I downloaded a new version of the Storage Manager software. It's still 32bit, but it is Server 2008 aware. This got my server attached to the virtual disk I had created for it! On to Hyper-V and creating my first VM.

This process is a snap. The 'New Virtual Machine' wizard makes everything very easy. So, on the last screen of the wizard, I select 'Start this VM after creation' and click OK. The VM was created but did not start. I got an error stating that the hypervisor was not running! WHAT!? My first thought was to check the BIOS for any virtualization-related settings and make sure that they are right. Reboot...

It turns out that the 2950 came with hardware virtualization turned off by default. After thinking about it, I guess that makes sense. No sense running electrons through these chips if we aren't using the server as a virtual machine host. So, I enable this option and reboot once again.

Once I got back in to Hyper-V Manager, I right-clicked on the VM and selected Start... VIOLA! A running VM! I am anxious to explore all the other features of this new tool. We have bought in to virtualization in a big way (14 virtual servers in production) and are looking to Hyper-V going forward.

Monday, April 14, 2008

Service Management using PowerShell and WMI

PowerShell has some great cmdlets for managing services (Get-, New-, Restart-,Resume-, Set-, Start-, Stop-, and Suspend-Service). The problem is that with V1 of PowerShell, you can't run these against remote computers. Luckily though, we have complete access to WMI from within PowerShell. So, the seemingly impossible quickly becomes quite easy.

My task today was to find a series of services on multiple computers and both Disable and Shutdown these services. Of course, I could have gone to each computer and, using the Services MMC snap-in, disabled and shutdown these services. A little tedious, but doable. Not a big deal if you only have to do this on a few computers. But, imagine needing to do this on dozens or more.

Scripting this job made it much easier. And the great thing is that, once we are ready to, I can tweak this script and quickly re-enable these services.

## Stop-LandeskServices.ps1
## 2008-04-14
## Reads a list if computers from a text file
## For each computer,
##   Stops and disables the five Landesk services


$computers = Get-Content '.\computerList.txt'

foreach ($computer in $computers) {
    Write-Host "`nNow processing computer: $computer"
    $services = Get-WmiObject win32_service -computer $computer | `
        where {$_.Name -eq 'LDXDD' `
        -or $_.Name -eq 'ISSUSER' `
        -or $_.Name -eq 'Intel Targeted Multicast' `
        -or $_.Name -eq 'CBA8' `
        -or $_.Name -eq 'softmon'}
    foreach ($service in $services) {
        Write-Host "... processing service:" $service.Name "... stopping... " -NoNewline 
        $null = $service.StopService()
        Write-Host "disabling..." -NoNewline 
        $null = $service.ChangeStartMode("Disabled")
        Write-Host " DONE!"

Saturday, April 12, 2008

A Little PowerShell Fun

On a challenge from a co-worker, I wrote this little script. I am new to scripting, .NET, COM, etc. so I had to research most of this (which, I guess, was the whole point!) These types of exercises, while not too practical in and of themselves, are a great way for me to learn about the features and functions of these technologies.

Write-Host "Reading your inbox...`n`n"
# Folder IDs
#$olAppointmentItem = 1
#$olFolderDeletedItems = 3
#$olFolderOutbox = 4
#$olFolderSentMail = 5
$olFolderInbox = 6
#$olFolderCalendar = 9
#$olFolderContacts = 10
#$olFolderJournal = 11
#$olFolderNotes = 12
#$olFolderTasks = 13
#$olFolderDrafts = 16
# Connect to Outlook Inbox
$outlook = New-Object -ComObject Outlook.Application
$session = $outlook.Session
$inbox = $outlook.session.GetDefaultFolder($olFolderInbox)
# Create Voice Object
$speaker = New-Object -ComObject sapi.spvoice
# Set voice to something a bit more pleasant
$speaker.Voice = $speaker.GetVoices().Item(1)
# Count number of unread items in INBOX
$unreadCount = (%{$inbox.Items | where {$_.UnRead}}).Count
# Get Mailbox User's First Name
$firstName = $outlook.Session.CurrentUser.Name.Split()[0]
# Say it
Write-Host "Hello $firstName. You have " -NoNewline 
Write-Host $unreadCount -ForegroundColor Green -NoNewline 
Write-Host " unread items in your inbox.`n`n"
$null = $speaker.Speak("Hello $firstName. You have $unreadCount unread items in your inbox.")
$speaker = $inbox = $session = $outlook = $Null

Tuesday, April 8, 2008

RSS Readers...

It looks like I am not the only one who is frustrated with the fact that RssReader does not import/export its feed list as OPML. Luckily, this guy did something about it.

Now, I can test out using Outlook 2007 as my RSS reader. I have tried many different readers, apps and online services, but have always come back to RssReader. We will see how Outlook07 does.

What are you using as an RSS reader?

2008-04-08 PowerShell Exercise

UPDATE! MoW posted about this same thing here! Must read!

NOTE: MoW (The PowerShell Guy) has lately been doing the same thing that I have been doing here... converting Scripting Guys! scripts to PowerShell solutions. If you are interested in this as all, I would definitely check his Blog out! MoW is some kind of PowerShell Savant! His scripts blow mine away.

This entry, in specific, illustrates this. When I worked through this item, I basically re-wrote the VB solution in PowerShell. As I was doing so, I was thinking, "Rather than transliterating VB scripts in PowerShell, there has to be a 'PowerShell' was of doing this... a completely different methodology." And, if you look at MoW's solution, you will see what I was hinting at. Pretty cool!

For today's entry, we see a pretty radical example of how PowerShell's treatment of the Registry (treating it as just other directory) is so powerful.


Hey, Scripting Guy! Do you have a script that will enable me to enumerate all the values in a registry key?
-- DG


   1: Const HKEY_CURRENT_USER = &H80000001
   3: Const REG_SZ = 1
   4: Const REG_EXPAND_SZ = 2
   5: Const REG_BINARY = 3
   6: Const REG_DWORD = 4
   7: Const REG_MULTI_SZ = 7
   9: strComputer = "."
  11: Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
  13: strKeyPath = "Software\Microsoft\Internet Explorer\Main"
  14: objRegistry.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValueNames, arrValueTypes
  16: For i = 0 to UBound(arrValueNames)
  17:     strText = arrValueNames(i)   
  18:     strValueName = arrValueNames(i)
  20:     Select Case arrValueTypes(i)
  21:         Case REG_SZ
  22:             objRegistry.GetStringValue HKEY_CURRENT_USER,strKeyPath, strValueName,strValue 
  23:             strText = strText & ": "  & strValue
  24:         Case REG_DWORD
  25:             objRegistry.GetDWORDValue HKEY_CURRENT_USER,strKeyPath, strValueName, intValue    
  26:             strText = strText & ": "  & intValue
  27:         Case REG_MULTI_SZ
  28:             objRegistry.GetMultiStringValue HKEY_CURRENT_USER,strKeyPath, strValueName,arrValues  
  29:             strText = strText & ": "
  30:             For Each strValue in arrValues
  31:                 strText = strText & "   " & strValue 
  32:             Next  
  33:         Case REG_EXPAND_SZ
  34:             objRegistry.GetExpandedStringValue HKEY_CURRENT_USER,strKeyPath, strValueName,strValue    
  35:             strText = strText & ": "  & strValue
  36:        Case REG_BINARY
  37:             objRegistry.GetBinaryValue HKEY_CURRENT_USER,strKeyPath, strValueName,arrValues    
  38:             strText = strText & ": "
  39:             For Each strValue in arrValues
  40:                 strText = strText & " " & strValue 
  41:             Next  
  42:         End Select 
  44:     Wscript.Echo strText
  45: Next


   1: Get-ItemProperty 'HKCU:\software\microsoft\internet explorer\main'

Friday, April 4, 2008

2008-04-04 PowerShell Exercise

I wanted to share today's exercise because it deals with the Registry. Powershell treats the registry like any other directory. This can be a good thing or a bad thing, depending on your competence. As you know, the Registry is not to be trifled with! That being said, Powershell is a great tool to use to explore and modify the Registry.

Here's a nice blog post that discusses the Registry and Powershell. Googling 'PowerShell Registry' will give you a bunch of great posts as well. It's worth checking out.

And now, for today's QUESTION:

Hey, Scripting Guy! Is there any way to determine the currency symbol that’s in use on a computer?
-- IR


   1: Const HKEY_CURRENT_USER = &H80000001
   3: strComputer = "."
   5: Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
   7: strKeyPath = "Control Panel\International"
   8: strValueName = "sCurrency"
  10: objRegistry.GetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strValue
  12: Msgbox strValue


   1: $(Get-ItemProperty 'HKCU:\Control Panel\International').sCurrency

The main thing to remember is that you can use the Registry as you would any other directory. So, you can CD, DIR, etc. through the structure. You can also create, delete, and modify keys and values. Very powerful tool!

P.S. Thank you to everyone who gave me tips on code formatting in blog posts. I got a bunch of recommendations and have landed on this Windows Live Writer Plug-in.

Thursday, April 3, 2008

Forays Into 64bit Computing

Dell PE2950We have ordered our first piece of 64bit hardware. We are getting a Dell PowerEdge 2950 that we will use as a VM Host server. We will run Windows Server 2008 DCE and Hyper-V. This will give us the ability to host 32bit and 64bit guests. The initial specs on this box include dual quad-core processors, 8GB RAM (expandable to 32GB), six NIC ports (one for net access, two for SAN connectivity, and three for VM guest connectivity), and mirrored boot disks.

The main thrust for this server is that we are looking to implement Microsoft Groove as a collaboration tool for some of our users. We will be testing things out over the coming weeks and the piloting this service with a small set of users. It looks like a pretty cool product and we hope that it will 'grease the wheels' for some of our more active collaboration groups.

I am very excited about this project for many reasons. First, I haven't worked with 64bit hardware before. Nor have I worked with a multi-proc server before. Windows Server 2008 and Hyper-V will also be new to me (as far as hands-on goes). Lots of fun stuff!

Additional Info

My photo
email: support (AT) mangrumtech (DOT) com
mobile: 480-270-4332