Showing posts with label tutorials. Show all posts
Showing posts with label tutorials. Show all posts

Sunday, November 11, 2012

Crude But Effective: Part 2, the Electric Boogaloo

In my previous article I described a system for replicating some of the functionality of the ConfigMgr Right-Click Tools (aka "SCCM Right-Click Tools"), through a web interface (intranet web portal application) using a combination of HTML, ASP, and a database back-end   What I planned to do was provide a little more detail of each of the pieces in follow-on articles.  This way, if you really cared enough, you could build your own setup (and probably do a better job of it than I have).

In this article I'm going to expand on the part of the process which involves the database back-end  and the script that runs on a schedule to query, process and update the database table.

The Database Table

To bring all of the processing into one central "hub", I chose to use a Microsoft SQL Server database, and create a table to capture the incoming requests from the portal.   My database server is named "DB1" and is running on SQL Server 2012, but it doesn't matter what version you use really.  I've tested this setup on 2005, 2008 and 2008 R2 with equal results.  The name of my database is "AMS" (for Asset Management Services), but you can call it whatever you want, just modify the names below to suit your needs.  The table I created is named "ClientToolsLog", but again, that's not required, so you could name it "DogPoo" and it won't matter.

USE [AMS]

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[ClientToolsLog](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [ActionName] [varchar](50) NOT NULL,
 [Network] [varchar](50) NOT NULL,
 [Comment] [varchar](255) NULL,
 [AddedBy] [varchar](50) NOT NULL,
 [DateAdded] [smalldatetime] NOT NULL,
 [DateProcessed] [smalldatetime] NULL,
 [ResultData] [varchar] (50) NULL,
)
GO

GRANT SELECT, INSERT, UPDATE, DELETE on ClientToolsLog TO amsManager
GO
 
GRANT SELECT on ClientToolsLog TO amsReadOnlyUser
GO

The Table Structure

Each of the columns has a purpose, so I'll explain them each below:
  • ID - This is used to identify the specific row in the table.  Because it's an integer value, and auto-incremented by 1, you don't specify a value for this field when inserting a new row. You only need it if you want to query, modify, or delete a specific row.
  • ActionName - (required) This is where the specific action name is entered.  I use my own abbreviated codenames to save on space (this log can easily grow very quickly with multiple users!).  For example, I use "MACHINE_POLICY" to indicate "Machine Policy Retrieval and Evaluation", and "HWINV" to indicate "Hardware Inventory Cycle", and so on. (see image below for the list of default available actions for ConfigMgr 2012 clients)
  • Network - (required) This is for storing the AD domain name or the CM site name, the choice is yours and it really doesn't matter, but I made it mandatory so you can modify "NOT NULL" to "NULL" if you prefer.  It's just there to enable filtering on specific environments when needed.
  • Comment - (optional) This is for entering a comment if desired. I had initially intended this to be a [textarea] field on the web form, but decided to skip it to avoid unnecessary data.
  • AddedBy - (required) This stores the username of the person who submitted the request from the web site form.  For this to work, you MUST enable "Windows Authentication" in IIS for the web site or the virtual folder.  If you leave it on "Anonymous" there won't be any way to track who the user was unless you build in forms-based authentication (yuck!)
  • DateAdded - (required) This stores the date and time when the request was submitted
  • DateProcessed - This is initially NULL until the script comes along and processes the request, at which time it enters the date and time it was completed.
  • ResultData - This is also initially NULL until the script updates the row when the request has been processed.

Security

I chose SQL accounts for this setup, but you could use mixed-mode.  I do a lot of things by force of habit, so SQL accounts are pretty common for my work, so I tend to use mixed-mode setups.  In any case, I have two user accounts for this system:
  • amsManager - This account has rights to SELECT, INSERT, UPDATE and DELETE data and rows in the table.  I use this account from within the web application to insert new records, and it's used in the script (discussed later) to update the rows when requests are processed.
  • amsReadOnlyUser - This account only has SELECT rights, and is used for any applications/scripts/processes where someone needs to be able to consume (read) the data but not have the ability to modify or delete anything.

The Script

Now that the database is created, the table created and the permissions applied to the table, the next step is getting a script to work with it to do the heavy-lifting.  You can do this with almost any language, including PowerShell, VBscript, KiXtart, Perl, Python or whatever.  As long as the language you choose can do the following things it should work fine:
  • Open a database connection to query (read) and update data in the rows.
  • Execute shell operations to call external .exe applications (SendSchedule.exe), as well as invoke COM interfaces such as WMI and SWBEM requests.
Again, out of habit, I chose VBScript.  I was going to do it with PowerShell, but I got lazy.  Here's the code, but I have to mention that one key "action" is left out for now, and that's the "Re-Run Advertisement" option.  The reason is that I'm still working on this part and having some challenges.  When I get it working reliably and consistently I will post an update:

'****************************************************************
' Filename..: ams_client_tools.vbs
' Author....: David M. Stein
' Date......: 11/11/2012
' Purpose...: invoke ConfigMgr Agent "client actions" on remote clients
'             using a SQL table and WMI invocation
' SQL.......: DB1\AMS
' Comment...: Beware of line-wrapping!  If I wrap it I used [& _]
'****************************************************************
Dim query, conn, cmd, rs, objShell, scriptPath, recID, objFSO

' controls DebugPrint output
Const verbose = True

' database connection
Const dsn = "DRIVER=SQL Server;SERVER=DB1;database=AMS;UID=amsManager;PWD=P@ssw0rd$123;"

' database table name
Const strTable = "dbo.ClientToolsLog"

'------------------------------------------------------------
scriptPath = Replace(wscript.ScriptFullName, "\" & wscript.ScriptName, "")
'------------------------------------------------------------
' constants used by this script (abridged format)
'------------------------------------------------------------
Const adOpenDynamic = 2 Const adOpenStatic = 3 Const adLockReadOnly = 1 Const adLockPessimistic = 2 Const adLockOptimistic = 3 Const adUseServer = 2 Const adUseClient = 3 Const adCmdText = &H0001 Const adStateClosed = &H00000000 Const adStateOpen = &H00000001 Const ForReading = 1 Const ForWriting = 2 Const ForAppend = 8 Const TristateUseDefault = -2 Const TriStateTrue = -1 Const TriStateFalse = 0 '------------------------------------------------------------ DebugPrint "info: begin processing..." Set objShell = CreateObject("Wscript.Shell") query = "SELECT * FROM " & strTable & _ " WHERE DateProcessed IS NULL ORDER BY ID" Set conn = CreateObject("ADODB.Connection") Set cmd = CreateObject("ADODB.Command") Set rs = CreateObject("ADODB.Recordset") On Error Resume Next conn.ConnectionTimeOut = 5 conn.Open dsn If err.Number <> 0 Then wscript.echo "fail: database connection failed" wscript.quit(err.Number) Else On Error GoTo 0 End If rs.CursorLocation = adUseClient rs.CursorType = adOpenStatic rs.LockType = adLockReadOnly Set cmd.ActiveConnection = conn cmd.CommandType = adCmdText cmd.CommandText = query rs.Open cmd If Not(rs.BOF And rs.EOF) Then xrows = rs.RecordCount counter = 0 Do Until rs.EOF recID = rs.Fields("ID").value compName = rs.Fields("ClientName").value actName = rs.Fields("ActionName").value actCode = ClientActionCode(actName) addBy = rs.Fields("AddedBy").value DebugPrint "record id...... " & rs.Fields("ID").value DebugPrint "client name.... " & compName DebugPrint "action name.... " & actName DebugPrint "action code.... " & actCode DebugPrint "requestor...... " & addBy DebugPrint "request date... " & rs.Fields("DateAdded").value DebugPrint "network........ " & rs.Fields("Network").value If IsOnline(compName) Then retval = ExecAction(compName, actName, actCode, addBy) Else DebugPrint "result......... offline!" retval = 100 End If DebugPrint "result......... " & retval MarkRecord recID, retval DebugPrint "-------------------------------------------" rs.MoveNext Loop DebugPrint "info: " & counter & " processed" Else DebugPrint "info: no records found" End If rs.Close conn.Close Set rs = Nothing Set cmd = Nothing Set conn = Nothing '------------------------------------------------------------ ' function: return datestamp formatted for log file use '------------------------------------------------------------ Function LogTime() LogTime = FormatDateTime(Now, vbShortDate) & " " & _ FormatDateTime(Now, vbLongTime) End Function '------------------------------------------------------------ ' function: return TRUE if computer responds to a PING request
' note: this features can be impacted by firewall settings!
'------------------------------------------------------------

Function IsOnline(strComputer)
  Dim objPing, query, objStatus, retval
  If strComputer <> "" Then
    query = "SELECT * FROM Win32_PingStatus WHERE Address='" & strComputer & "'" 
    Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
      ExecQuery(query)
    For Each objStatus in objPing
      If Not(IsNull(objStatus.StatusCode)) And objStatus.StatusCode = 0 Then
        IsOnline = True
      End If
    Next
  End If
End Function

'------------------------------------------------------------
' function:
'------------------------------------------------------------

Function ClientActionCode(actionName)
  Select Case actionName
    Case "MACHINE_POLICY":
      ' Machine Policy Retrieval and Evaluation Cycle
      ClientActionCode = "{00000000-0000-0000-0000-000000000021}"
    Case "HWINV":
      ' Hardware Inventory Cycle
      ClientActionCode = "{00000000-0000-0000-0000-000000000001}"
    Case "SWINV":
      ' Software Inventory Cycle
      ClientActionCode = "{00000000-0000-0000-0000-000000000002}"
    Case "DISCOVERY":
      ' Discover Data Collection Cycle
      ClientActionCode = "{00000000-0000-0000-0000-000000000003}"
    Case "RERUN_ADV":
      ' Re-Run Advertisement
      ClientActionCode = "RERUNADV"
    Case "INST_SOURCE":
      ' Windows Installer Source List Update Cycle
      ClientActionCode = "{00000000-0000-0000-0000-000000000032}"
    Case "UPDATE_SCAN":
      ' Software Updates Scan Cycle
      ClientActionCode = "{00000000-0000-0000-0000-000000000113}"
    Case "AMT_PROV":
      ' AMT Auto Provisioning Policy / Out-of-Band Mgt Scheduled Event
      ClientActionCode = "{00000000-0000-0000-0000-000000000120}" 
    Case "BRANCH_DP":
      ' Branch Distribution Point Maintenance Task 
      ClientActionCode = "{00000000-0000-0000-0000-000000000062}"
    Case "UPDATE_DEP":
      ' Software Updates Deployment Evaluation Cycle 
      ClientActionCode = "{00000000-0000-0000-0000-000000000108}"
    Case "SW_METERING":
      ' Software Metering Usage Report Cycle 
      ClientActionCode = "{00000000-0000-0000-0000-000000000031}"
    Case "USER_POLICY":
      ClientActionCode = "{00000000-0000-0000-0000-000000000027}"
    Case Else:
      ClientActionCode = ""
  End Select
 
  ' list of codes for future inclusion...
  '
  '{00000000-0000-0000-0000-000000000010}  File Collection
  '{00000000-0000-0000-0000-000000000021}  Request machine assignments
  '{00000000-0000-0000-0000-000000000023}  Refresh default MP
  '{00000000-0000-0000-0000-000000000024}  Refresh location services
  '{00000000-0000-0000-0000-000000000025}  Request timeout value for tasks
  '{00000000-0000-0000-0000-000000000026}  Request user assignments
  '{00000000-0000-0000-0000-000000000032}  Request software update source
  '{00000000-0000-0000-0000-000000000061}  DP: Peer DP status report
  '{00000000-0000-0000-0000-000000000062}  DP: Peer DP pending status check
  '{00000000-0000-0000-0000-000000000111}  Send unset state messages
  '{00000000-0000-0000-0000-000000000112}  Clean state message cache
  '{00000000-0000-0000-0000-000000000114}  Refresh update status
End Function

'--------------------------------------------------------
' function: 
'--------------------------------------------------------

Function ExecAction(clientName, actionName, actionCode, userID)
  Dim strCmd, result

  DebugPrint "info: executing action request for " & clientName

  If actionCode = "RERUNADV" Then
    ' result = RerunAdv(compName, advID)
    ' [[ I will cover this in part 4 of this article ]]
    result = 200 ' denotes request was ignored (for now)
  Else
    strCmd = scriptPath & "\SendSchedule.exe " & actionCode & " " & clientName
    wscript.echo "info: command = " & strCmd
    result = objShell.Run(strCmd, 1, True)
  End If

  '--------------------------------------------------------

  ExecAction = result

End Function

'------------------------------------------------------------
' function: 
'------------------------------------------------------------

Sub MarkRecord(recID, pVal)
  Dim query, conn, cmd, rs

  wscript.echo "info: marking record completed..."

  DebugPrint "info: id = " & recID & " / result = " & pval

  query = "SELECT * FROM " & strTable & " WHERE id=" & recID
 
  Set conn = CreateObject("ADODB.Connection")
  Set cmd  = CreateObject("ADODB.Command")
  Set rs   = CreateObject("ADODB.Recordset")
 
  On Error Resume Next
  conn.ConnectionTimeOut = 5
  conn.Open dsn
  If err.Number <> 0 Then
    wscript.echo "fail: connection failed"
    wscript.quit(err.Number)
  Else
    On Error GoTo 0
  End If
 
  rs.CursorLocation = adUseClient
  rs.CursorType = adOpenDynamic
  rs.LockType = adLockPessimistic
 
  Set cmd.ActiveConnection = conn
 
  cmd.CommandType = adCmdText
  cmd.CommandText = query
  rs.Open cmd
 
  If Not(rs.BOF And rs.EOF) Then
    rs.Fields("DateProcessed").value = Now
    rs.Fields("ResultData").value = pVal
    rs.Update
  Else
    DebugPrint "error: no records found"
  End If
 
  rs.Close
  conn.Close
  Set rs = Nothing
  Set cmd = Nothing
  Set conn = Nothing

End Sub

'------------------------------------------------------------
' function: verbose echo printing
'------------------------------------------------------------

Sub DebugPrint(s)
  If verbose = True Then
    wscript.echo s
  End If
End Sub

What The Script Does

As I mentioned before, each time the Scheduled Task runs, it calls the script.  The script performs the following actions in the order/sequence listed below:
  • Opens a Connection to the database using ADO (COM) with SQL user permissions
  • Submits a Query for all rows where the DateProcessed value is NULL (indicating the request has not been processed yet).  The results are obtained as an ADO RecordSet object.
  • Iterates the RecordSet rows to gets the remote Computer Name, and ActionName field to determine the specific things that need to be done for the requested action (for example: look up the Action Code GUID)
  • Initiates a WMI (Win32_Ping) request to determine if the remote computer is online.
    • If not online, the ResultData column is updated with a value to indicate the client was offline
    • If online, the Action is processed...
  • Executes the requested Action:
    • If a "Client Action" is requested: Open a Shell session using WScript Shell object (COM) and executes the SendSchedule.exe application with the appropriate GUID for the Action and the name of the remote computer.  Gets the result/exit code from the SendSchedule process.
    • If "Re-Run Advertisement" is requested:  (to be continued)
  • Updates the database table row by entering the appropriate result code (ResultData) and the timestamp of the completion (DateProcessed)
  • Exits
Not really complicated actually.  This is a pretty straightforward and common process for interacting with database tables with ADO.  You could separate the requests and the results into two tables if you prefer, but I'm not shooting for 3NF or 4NF here.  I'm too lazy for that much work.

The Scheduled Task

This is where the Security aspect comes into play.  You need to execute the script under a context which has permissions to invoke the Configuration Manager Agent on remote computers over your network from a WMI interface.  I created a special Domain user account for this and added to the local Administrators group on every desktop and laptop computer using Group Policy and Restricted Groups.

Before setting up the Scheduled Task, I highly recommend testing the script directly.  Open a session (interactive login or use RunAs to open a CMD console) under the credentials of the user account you intend to use for the Scheduled Task.  Test the script until you are satisfied it works correctly.

As a force of habit, I use a simple BAT script to wrap my calls to VBScript to I can pipe the output (wscript.echo or DebugPrint results) to a log file if I want.  Or you can do it from within the VBScript code using basic FileSystemObject (FSO) methods if you prefer.  Either way, it can be helpful to generate a log file to diagnose issues where the database is unavailable for some reason when the scheduled task is executed.

The Schedule you choose is entirely arbitrary.  I run mine at ten (10) minute intervals all day, every day.  It also doesn't matter how you choose to create the Scheduled Task.  You can obviously use the GUI, or do it from the command line using SchTasks.exe, or from a script or whatever.

Summary

All of this I've covered here is essentially the "back-end" of the process.  I hope it you find it useful and helpful.  Let me know by posting a comment below?  In the next part of this article I will delve into the web form and the user interaction aspects.

Thursday, October 13, 2011

Winding Down, Weekend Brain Dump

Randomness ensues.

I taught a 2 hour session at work on COM scripting.  Everything from COM itself, to the DLL-ProgID-GUID-HKCR relationships to standard OOP stuff (classes, templates, properties, methods, all of it), and into invocation and interface processing.  Small group, so that went very well, and we had breathing room to explore questions, yet without falling off the wagon along the way.  It was good.

After that I taught another session on using a web application that I developed for a different (still small) group, which went very well.  I love face-to-face discussion.  Web/remote is ok.  Phone is lame.  E-mail is lame-er.

In that second session, I gathered more input for bug fixes, enhancements and new features in one hour than I received in months via web, email or phone.  Big corporate development teams:  You don't know what you're missing.  Focus groups are not the answer.  Direct, immediate, personal contact is the best.  It's the only real way to get quality input and have a quality, high-value discussion as well.

I switched the blog over to use the newest Blogger features with dynamic views, the new rendering layout, and the new analytics tools, and I have to say I absolutely LOVE it.  You might not be as impressed with the new look as I am, but behind the scenes, the administrative changes are fantastic.  Too nice to ignore, so I followed my typical "beta-tester" mentality and dove in head-first.  I am aware that the sidebar doesn't play well in Internet Explorer 9, but that's because IE9 doesn't handle HTML5 and CSS3 consistently with Chrome or Firefox (or Opera, I'm told).  I use IE9 and Chrome 16 at work about 50/50, but at home it's Chrome 16 100%.  I only fire up Firefox 7 to test page rendering and that's about it.  DISCLAIMER:  I'm not saying one browser is "better" than any other.  Everyone is free to like what they like.

I'm still a bit fried from three-plus hours of talking and pointing without a break.  I got home and hadn't eaten in six hours (not good, and not usual for me), and immediately gave into a cold glass of beer.  That wasn't a good idea either, but it seemed like it at the time.  Heh heh.

Still listening to Adam Carolla's podcast show every day.  Today he again brought up how suck-ass most 80's songs were, and I have to say that I now listen to them with new ears and most of them do in fact suck holy shit.  Not so much from a musical aspect, but lyrically they are bankrupt.  Those folks were not writing shit down back then, they were winging it and most of it sounds like a recorder was left on during a Narcotics Anonymous session.

Randomness ensues.  Enjoy your weekend!

Friday, November 19, 2010

Flashback: The Level 5 Sessions

Craigslist 003

I had to pause for a bit and reflect on 2008 and 2009 a bit.  2008 in particular was one of the worst years of my life aside from 1987 (father passed away) and 1997 (mother passed away).  I experience my first time being laid off from a job.  I have never been fired from any job in my life, so getting laid off, and on very short notice was not only a shock, but, well, I'm sure some of you are well aware of how that feels when you have a family and are barely keeping up on bills.  That put us so far behind that I'm sure we can ever catch up, but who knows.

In 2007, a mutual friend got me in touch with Brian S. Tucker.  We had a few conversations about some ideas Brian had and what he was hoping I could do to help him make those ideas work.  Mind you, these were all his ideas, and I was only one of quite a few other players involved.  Brian had a crazy idea (at the time) to start a web site devoted to subscription-based training videos for various Microsoft platform products.  The first phase was a free upload site called BlogcastRepository.com but his ideas was to develop a premium service called the "Level 5" Guides, which would involve paid monthly subscriptions.

2008 wasn't all bad, at least not after April. When Brian heard I was unemployed and having a tough time finding another job, he got in touch with me and helped push me to produce more content and help promote his site and become a win-win situation.  The combination of having someone keeping me involved and working towards a goal, kept me away from depression and solitude.  Those may sound trivial, but when you're laid off during cold weather months, and all your friends are busy at their jobs, your life can be come very lonely and scarry. 

I can't stress enough how important it is to just stay busy.  Especially if you can get outdoors as well.  I did that while still hunting for another job. But early-2008 was not a good time to look for a job.  Every single place I went to had a freeze on hiring due to fears of how far the economy was going to sink.  Everyone kept trying to encourage me with things like "with your skills" or "with your background" … "you should have no problem finding another job".  But that actually made it worse because the more rejections I got (or stark silence) the more I began to doubt my skills and marketability.  Human nature: Easy to study, much more complicated to experience.

Brian put himself, and his family's future on the line, to finance and push to make the dream a reality.  They endured a ton of shit with banks, developers, business people and trying to market their idea to both content authors and potential subscribers.  It was a stretch to assume it could be successful, and there were times when it didn't appear it would work out, but they never gave up or let pessimism creep in.

This happened within a few weeks of being laid off, and I used that down-time to gear up, ramp up, and man up to producing 17 sessions on WSUS 3.0 and 18 sessions on Windows Server 2008.  The latter of which was just barely out of beta/CTP when I recorded those.  Looking back they were very basic and almost embarrassingly amateur, but at the time it was all I had.  I needed to pay the mortgage, feed the kids and keep the electricity and water turned on.  Brian came through, and when I needed it most.  He didn't hand me any crying towels or pat me on the back either.  He knew my predicament and still insisted on me doing my best, just like everyone else who participated.  That gave me back much-needed respect and at least a little self-confidence.

Together with Edwin Sarmiento, Abhishek Joshi, Andy Dominey, Dennis Rietvink and a few others (very few), we pushed into what was at that time uncharted territory.  But it worked.  I was humbled by the credentials of these other guys, and Brian himself.  I wasn't sure if I belonged in that group, but Brian convinced me to step up.  The margins paid to us from the subscription sales weren't a lot but they absolutely saved me and my family.  That picture above was my rig and recording "studio" in our garage during that time.  It truly is worth a thousand words to me.

As the site began to grow in popularity, and more subscribers came aboard, we were soon facing the dilemna of what to do next.  What topics should we focus on?  What features should we dive deeper into?  We emailed subscribers to get feedback, but hardly anyone replied.  At that point Brian had to take on additional consulting work (which he had already been doing for quite a few years) in order to fund the business to a higher level.  In mid-Summer 2009, he took a job in Washington, D.C. where soon after he suffered a heart attack, and was recovering in the hospital, when he took a turn for the worse and passed away in August 2009.

Since Brian's passing, the site was not being managed and spammers began to victimize it badly.  Subscribers were asking what to do about cancelling payments and what the future was.  Unfortunately, I had no answers, and neither did any of the other authors.  We were as confused as anyone else.  In any case, I miss Brian and will never forget how much he helped me and many others in his short life.  May he rest in peace.

In May of 2010, Mike Rood contacted me to begin the process of finding who was managing or owned the site.  He was able to negotiate the purchase of the site from Julie Tucker.  I haven't heard anything since August 2010.  I e-mailed Mike to find out what the latest news is, so I hope to have something good to report soon - finger's crossed.

Friday, May 28, 2010

A Comment Regarding BlogcastRepository.com

I have continued to receive e-mail from readers asking about what has happened with BlogcastRepository.com and the video tutorials, etc. Rather than continue to respond to each one, I wanted to post something for all so that it clarifies things a bit.

I was approached by Brian S. Tucker back in late 2007 via email to join his collective venture to provide tutorial videos and blog posts about various Windows Server platform products and technologies.  My role was to record and post 15-18 videos on WSUS 3 and Windows Server 2008, which at the time were either still in public "beta" or only recently RTM/RTP.  My videos were posted and registrations began ramping up.  Brian enlisted a few more authors to cover other products like SQL Server, App-V/SoftGrid, and he continued handling SCCM and SCOM.  Things were good.

Brian S. Tucker (there are other Brian Tuckers out there so I still use the "S." initial to avoid confusion) passed away in August of 2009, while working on a project at a client site in Northern Virginia.  The obituary is posted below.  I'm afraid I do not know a lot of details about how he passed away, nor about his remaining family, nor the status of the web site.  I have e-mailed every contact address I had to try to find out what is/was going on with the web site, existing accounts and pending registrations.  I have not been successful in getting a single response to any of my e-mails.  I do not know if anyone is currently minding the shop, or if anyone is planning to assume the management of it in the future.  I just don't know what's going on at all.

If you have more information about this, please share with the rest of us if you can?

Thank you!  And may he rest in peace.

[original obituary…]

Copied from http://www.veteranstoday.com/modules.php?name=News&file=comments&op=Reply&pid=25962&sid=8661&mode=thread&order=0&thold=0

Fairfax, Va. - Brian Straehley Tucker, age 38, of Glen Carbon, died on Wednesday, Aug. 12, 2009, in Fairfax, Va., of circumstances related to a heart condition. He was born in New York, N.Y., on Oct. 21, 1970, the son of Joyce Hudson of Kiawah Island, S.C. and William S. Tucker, Jr. of Charleston, S.C. and step-son of Martha Tucker of Charleston, S.C. and W. Thomas Hudson, Jr. of Kiawah Island, SC.

Brian graduated from Summit High School, in Summit, N.J., and attended Southern Illinois University, in Edwardsville.

Brian served in the U.S. Navy from 1990 - 1994 and in the U.S. Naval Reserve from 1994-1998 and was the recipient of the National Defense Service Medal for his service during the Gulf War and Operation Desert Storm.

Brian was employed as a Computer Systems Engineer for Intrinsic Technologies, LLC of Lisle, Illinois since 2005.

Brian was an avid motorcycle enthusiast and enjoyed traveling with family and friends.

Brian was a loving and devoted father and is survived by his daughter, Chelsea C. Tucker of Edwardsville; parents and step parents; sister, Lynsey Tucker of New York, N.Y.; grandparents William S. Tucker and Vivian O. Tucker of Blytheville, Ark., and Eleanor K. Casato of Lakehurst, N.J., step-sisters, Lynn Matthews of Charlotte, N.C., and Lisa Grasing of Kansas City, Kan.; step-brothers, Judson Matthews of
Charleston, S.C.; Will Hudson of Portland; and Matt Hudson of London, England; loved ones, Julie A. Tucker; Joshua P. Lager; Brian L. Lager and Chad N. Lager of Edwardsville; and many devoted friends and colleagues. A family memorial service will be conducted in Chelsea, Vt.

Friday, August 8, 2008

Level5 Open Access - Limited Time Only

That's right. The Level5 IT Guides at BlogCastRepository.com will be opened up for two hours in the morning and two hours in the evening (US, central daylight time) on August 13, 2008 only. Read the Details Here.

During that period you can watch any of the premium content blogcasts on a wide range of topics from SQL Server 2008 to System Center Operations Manager to Windows Server 2008 to WSUS 3 to System Center Configuration Manager and more.

Normally these sessions require a paid monthly subscription (which is very cheap by the way) in order to access them. I have posted over a dozen sessions on WSUS and another dozen or so on Windows Server 2008. Brian Tucker has many more on System Center Operations Manager and System Center Configuration Manager as well. There are other sessions that are fantastic and these offer a perfect way to learn and expand your skills on these products in an efficient manner. While you're there, check the Blogs and even my other blog which is focused on technical stuff (unlike this blog).