Month: May 2009
Repairing WMI Repository
When troubleshooting WMI on SMS/SCCM clients, I’ve frequently used the following command to attempt a repair of the WMI repository. I don’t recall where I found it (several years ago), but I also don’t want to ever forget it!
- Open a command prompt
- Change to directory C:\Windows\system32\wbem\
- Run: for /f %s in (‘dir /b *.mof *.mfl’) do mofcomp %s
HTA BackEnd Script for OSD
This post has been updated with new code.
Please visit OSD Options Chooser v2
There are plenty of examples out there for how to get the most out of Task Sequences for SCCM 2007 OS deployment. But I wasn’t motivated to find out how others were doing it…Until I saw a demonstration by Jarvis Davis that he presented at MMS 2009.
From that I built my own custom HTML Application to do what I needed. At the moment, I have not enabled HTA support in my WinPE boot images. So the below example is purely a “BackEnd” script which simply means that it needs to run at the towards the end of the Task Sequence so that the end-operator (or end-user) does not need to wait for much of the imaging to complete.
This HTA does the following
- Field to enter in the name of user to add into the local Administrators group
- Selection for US time zone to configure Windows to use (defaults to MST, since that is where I am)
- Option to install one of 6 flavors of Adobe Acrobat
- Option to install one of 2 flavors of Project 2003
- Option to install one of 2 flavors of Visio 2003
- Option to install BlackBerry desktop
- Option to install Streets and Trips 2006
Additional things to note
- In order to add a domain user to your local admins group, the value sDomainName = “YourDomainName” must be filled in appropriately.
- All activity is logged into C:\CustomSystemOptions.log
- If one of the options to install software is selected, a Task Sequence variable is created and set to True. To utilize this, you would need to have an Install Software task that is limited to only install of the corresponding variable is set to True. Note: the Install Software task must be after the execution of the HTA!
List Systems with Bad MIFs
Today I was troubleshooting some client communication problems and found that one of the causes was that they were generating bad MIFs, so SCCM was rejecting the hardware inventory they were sending. Along the way, I also found that there 230 bad MIFs on my site server. Instead of manually opening each file to ‘document’ which system it was, I decided to script it. I must give credit to a blog posting by Don Hite, which gave me the original idea to do this in the first place.
'========================================================================== ' NAME : Get_BADMIFS ' AUTHOR : Nick Moseley, https://t3chn1ck.wordpress.com ' DATE : 5/14/2009 ' UPDATE : 10/29/2014 - Added code to output the SMS Unique Identifier ' COMMENT: Ensure the value for sSMSInbox is the UNC path to your SCCM inboxes '========================================================================== Const ForReading = 1 Dim sSMSInbox, sNamePosition, bNameFound, sFileLine, sSystemName, iFileCount, oExcel, iRow sSMSInbox = "\\ServerName\SMS_xyz\inboxes" Set oShell = CreateObject("WScript.Shell") Set oFSO = CreateObject("Scripting.FileSystemObject") Set oBadDDRFolder = oFSO.GetFolder(sSMSInbox & "\ddm.box\BAD_DDRS") Set cBadDDRFiles = oBadDDRFolder.Files Set oBadMIFFolder = oFSO.GetFolder(sSMSInbox & "\auth\dataldr.box\BADMIFS") Set colBadMIFFiles = oBadMIFFolder.Files Set oExcel = CreateObject("Excel.Application") ' Create Excel Spreadsheet and Header oExcel.Visible = True Set oWorkbook = oExcel.Workbooks.Add Set oWorksheet = oWorkbook.Worksheets(1) iRow = 1 oExcel.Cells (iRow,1) = "System Name" oExcel.Cells (iRow,2) = "File Name" oExcel.Cells (iRow,3) = "File Date" oExcel.Cells (iRow,4) = "File Size (MB)" oExcel.Cells (iRow,5) = "SMS Unique ID" ' End Create iFileCount = 0 For each oFile In colBadMIFFiles iFileCount = iFileCount + 1 iRow = iRow + 1 Set oMIFFile = oFSO.OpenTextFile (oFile.Path, ForReading, True) bNameFound = False Do Until bNameFound sFileLine = CStr (oMIFFile.ReadLine) sNamePosition = InStr (sFileLine, "<NetBIOS Name>") If sNamePosition > 1 Then sSystemName = Replace (Right (sFileLine, len(sFileLine) - (sNamePosition+14)), ">", "") sFoundBug = InStr (sSystemName, "//Client") If sFoundBug > 0 Then ' This is to fix a bug in the script which is undetermined ' Do Nothing Else oExcel.Cells (iRow,1) = sSystemName oExcel.Cells (iRow,2) = oFile.Name oExcel.Cells (iRow,3) = oFile.DateLastModified oExcel.Cells (iRow,4) = (oFile.Size/1024)/1024 bNameFound = True End if End If Loop oMIFFile.Close Set oMIFFile = oFSO.OpenTextFile (oFile.Path, ForReading, True) bGuidFound = False Do Until bGuidFound sFileLine = CStr (oMIFFile.ReadLine) sNamePosition = InStr (sFileLine, "UniqueID") If sNamePosition > 1 Then sGUID = Replace (Right (sFileLine, len(sFileLine) - (sNamePosition+8)), ">", "") oExcel.Cells (iRow,5) = sGUID bGuidFound = True End If Loop oMIFFile.Close Next oExcel.Range("A1:E1").Select oExcel.Selection.Interior.ColorIndex = 19 oExcel.Selection.Font.ColorIndex = 11 oExcel.Selection.Font.Bold = True oExcel.Cells.EntireColumn.AutoFit oExcel.Cells.HorizontalAlignment = -4131 Set oExcelRange = oWorksheet.UsedRange Set oExcelRangeA1 = oExcel.Range("A1") oExcelRange.Sort oExcelRangeA1, 1, , , , , , 1 WScript.Echo "File Count: " & iFileCount
Also, see a great post by Nick Aquino detailing how bad mifs come to exist – http://myitforum.com/myitforumwp/2011/11/07/badmif-processing-when-a-client-doesnt-report-hardware-inventory/
Web Report for Software Updates Compliance
SCCM doesn’t have a precreated report (that I can find) that quickly shows the patch compliance for a group of systems. So I created one for myself, that I thought I’d share with every one. To implement this, create a web report as you normally would; use the following SQL statement and remember to create a prompt with the information below that!
SQL Statement
select distinct sys.Name0, ui.BulletinID as BulletinID, ui.ArticleID as ArticleID, ui.Title as Title from v_UpdateComplianceStatus css join v_UpdateInfo ui on ui.CI_ID=css.CI_ID join v_R_System sys on css.ResourceID=sys.ResourceID join v_ClientCollectionMembers ccm on ccm.ResourceID=sys.ResourceID where css.Status=2 and ccm.CollectionID=@CollID order by sys.Name0, ui.ArticleID
Prompts
Name: CollID
Prompt text: Collection ID
Provide a SQL statement:
begin if (@__filterwildcard = '') select CollectionID as CollectionID, Name as CollectionName from v_Collection order by Name else select CollectionID as CollectionID, Name as CollectionName from v_Collection WHERE CollectionID like @__filterwildcard or Name like @__filterwildcard order by Name end
Scripting HP SoftPaqs
Ever needed to know how to silently install an HP SoftPaq? I recently needed to figure out the switches for approximately 75 individual SoftPaqs. Fortunately, HP has standardized the switch to extract the setup files from the InstallShield executable.
- From a command line, simply call the .exe with /s to perform a silent extraction.
Note: In some cases, no additional switches will be necessary and InstallShield will pass to the setup program the command to silently install. If this is the case, then mark this as the only install switch you need. - Change the working directory to where the files were just extracted.
- Do a directory list to find the name of the setup file, which will likely be Setup.exe
- Discover the switches that will work for that setup program. This could be anything of the following
- /s
- /silent
- -s
- /q
- /S /v/qn
- /k – This is switch is very common for ATI Graphics controllers!
- Once you have found the silent install switches for the setup program, then you’re final switches become /s /a /SetupSwitch(es)
For BIOS related SoftPaqs, I find that it’s easiest to extract all of the files and then run HPQFlash.exe -s
MMS 2009 – Day 4 & 5
Sorry, got a little behind in posts ;-)
My day 4 of MMS 2009 was focused on migrating to Native mode for SCCM and various SCCM implmentations in the field. The Native mode sessions thoroughly stressed the need to have a well planned PKI environment. Though it may be a daunting challenge to migrate with issues, I’m confident that it can be done. It is also interesting to hear of some of the issues that existed in the field and some of the custom implementations that others are doing…they gave me some good ideas of things to potentially implement (of which I would share on this blog).
MMS day 5, a sad closing to the week. Nothing was wrong with the day, but MMS is such a great experience and a great place to learn more on systems management that it was sad to have to end. However, my brain was sure full and ready for a break! Anyhow, I’ve always wondered how custom console extensions are built. Convienantly enough, there was an actual session on it this year! I understand the gist of what is being done, but I need to dig into it and formulize a step-by-step process for how to build them. Again, when I am able to do this, I’ll post on this blog to share!
I never take as many pictures as I want when I’m Vegas, but here are a few from Thursday’s closing party. Thanks to Jeremiah Beckett and everyone at Secure Vantage for sponsoring it!