30 April 2013

How to stop those annoying Charter Communications Telemarketers

As a Charter customer, it's very annoying to be constantly bombarded by telemarketing calls. Charter is relentless. No matter how much you ask them not to call you, they will continue and the reps are very aggressive. They are exempt from the National Do Not Call Registry because there is a business/customer relationship. At one point, I was contacted 16 times within two weeks from their 909-259-0292 number. They do change up the number that appears on the caller ID. Sometimes I have gotten their 404 area code.

Their website now has a privacy page that allows you to opt out of all marketing calls. Go to http://Charter.com. At the bottom, click on Your Privacy Rights.


Once the next screen comes up, click on Privacy Preferences. 


Now that you are on this page, fill out all of the fields. You will need your account number. At the bottom, select All of the above. Click submit and you should not receive any further harassing calls from them.

26 April 2013

Custom Naming Distribution Points

If you are using standard machines as distribution points in your remote offices, the naming might be an issue for you, as it was for us. There was nothing in the naming that distinguished them to allow us to know their location. The only option we had was to keep a spreadsheet list of the machines with the associated location. The easy way around this is to create a distribution point group that allows you to custom name the group. You only associate the one distribution point to that group, which then  gives you the custom naming schema you were looking for. When you distribute and deploy software, you select from the distribution point group instead of from the distribution points, thereby allowing for easy dissemination. 

25 April 2013

Deploying GimpShop

As you will see, GimpShop is open-source  but full of plugins. It is nearly impossible to do a silent install without something like AutoIT. You can't open the executable up in something like PeaZip because the only thing that will show up is one DLL. When you run the executable, it will extract the msi to the root of %TEMP%. It also creates a couple of temporary directories, which are not needed for repackaging. I packaged up version 2.8, so the name of the msi was GimpShop2.8.msi. That is all you need to install the application. The msi does not contain any plugins and you can do a simple /qb- /norestart. 

23 April 2013

SCCM: Deploying from a Network Share

Sometimes you need to deploy from a network share instead of a distribution point. The reason I do this sometimes is because of the sheer size of some installations. For instance, Autodesk Revit 2013 Building Premium is 26 gigabytes. Transferring that across a WAN will take a LONG time. We do maintain network shares in our offices that we update once a month, which contains all of our installation programs.

To start, you will want to create your Application install. You will want to leave the content location blank. Fill in the Installation program and Uninstall Program fields with the command line parameters. For the Installation Start In and Uninstall Start In fields, enter the network share location of the application install. You do not want to distribute the content to a distribution point, as there is no need since the package will be pointing to a network share. When you deploy it, uncheck the Automatically distribute content for dependencies and do not specify any distribution points. That is all that is to deploying via a network share. 

22 April 2013

SCCM: Distribution point won't update because of minor changes

When you make a minor change to an installer program, the change may not update in SCCM/SMS. This is because if there was a minor change within the script and there is no size difference, SCCM will think it is the same. It is possible to completely update the distribution point with a new package source, but an issue arises if you had already run the package on machines and had set it to download the package first. The changes can be seen as the same that is on the distribution point and the local machine, therefore the changes are not pushed down. There are two options in this scenario. First is to clear out the local caches on the target machines. This will force SCCM/SMS to redownload the newer package. The second is to delete the package and recreate it so that a new version is created on the distribution points that does not match the version downloaded on the local machines. This causes the package to be re-downloaded to the local machines, thereby pushing the new changes. 

09 April 2013

Unlimited International Calling back to the US for $9.95

Last August and September, I was in Africa. While there, I called and texted back to the US using a Voice over IP service called Line2. It is an app that works on the iPhone, iPad, or Android. All I can say is that it was great. I used it while connected to WiFi routers. One of the big things I liked about it was that I did not have to treat the calls as international. When I called back to Nashville, TN from Johannesburg, South Africa, I just dialed 615-xxx-xxxx. There was some lag, but the calls were still good quality.


  • Local calling back to the US
  • Flat rate of $9.95
  • Good reception
  • No international calling prefixes
The app also works through a 3G/4G connection on the phone, but I did not want to have to bother with and internation SIM card, pricing, and such.

04 April 2013

Powershell: Installation Script Functions

Here are several snippets I have created for writing powershell application installation scripts. These make it a lot faster by standardizing the functions to use as reusable code.

Display a Balloon Tip
 Function BalloonTip($ApplicationName, $Message, $DisplayTime){  
      [system.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null  
      $balloon = New-Object System.Windows.Forms.NotifyIcon  
      $path = Get-Process -id $pid | Select-Object -ExpandProperty Path  
      $icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)  
      $balloon.Icon = $icon  
      $balloon.BalloonTipIcon = 'Info'  
      $balloon.BalloonTipTitle = "{Company Name}"  
      $balloon.BalloonTipText = $ApplicationName+[char]13+[char]13+$Message  
      $balloon.Visible = $true  
      $balloon.ShowBalloonTip($DisplayTime)  
 }  

Create a log folder and set log file
 $Global:LogFolderName = ""  
 Function CreateLogFolder{  
      If((Test-Path -path c:\temp) -ne $true){  
           New-Item -ItemType directory -Path c:\temp  
      }  
      If((Test-Path -path c:\temp\$Global:LogFolderName) -ne $true){  
           New-Item -ItemType directory -Path c:\temp\$Global:LogFolderName  
      }  
      $Global:LogFile = "c:\temp\"+$Global:LogFolderName+"\"+$Global:LogFolderName+".log"  
      Write-Host $Global:LogFile  
 }  
 CreateLogFolder  

Enable/Disable File Security Checks
 #Disable File Security  
 $env:SEE_MASK_NOZONECHECKS = 1  
 #Enable File Security  
 Remove-Item env:\SEE_MASK_NOZONECHECKS  

Determine if the OS is 32-bit or 64-bit
 $Global:OS  
 Function GetOSArchitecture{  
      $Global:OS=Get-WMIObject win32_operatingsystem  
      $Global:OS.OSArchitecture  
      #Answers: 32-bit, 64-bit  
 }  

Retrieve the relative path the powershell script was executed from
 Clear-Host  
 $Global:RelativePath  
 Function GetRelativePath{  
      $Global:RelativePath=(split-path $SCRIPT:MyInvocation.MyCommand.Path -parent)+"\"  
      Write-Host $Global:RelativePath  
 }  
 GetRelativePath  

Uninstall previous versions of programs
 Function UninstallPreviousPrograms{  
      #Change '%application%' to whatever app you are calling  
      $Output = wmic product where "description like '%sketchup%'" get IdentifyingNumber  
      $Output | ForEach-Object {  
           $_ = $_.Trim()  
        if(($_ -ne "IdentifyingNumber")-and($_ -ne "")){  
          $GUID = $_  
        }  
      }  
      $Arguments = "/X"+[char]32+$GUID+[char]32+"/qb- /norestart"  
      (Start-Process -FilePath "msiexec.exe" -ArgumentList $Arguments -Wait -Passthru).ExitCode  
 }  
 UninstallPreviousPrograms  

SCCM: How to update packages on the distribution point

There are two ways to update a package on the distribution point:

  1. Open up the Application package under Software Library and select the Content Locations tab. Now select the distribution point and click Redistribute.
  2. Select the Software Library and then select an app under the Application Management. At the bottom, select the Deployment Types tab. Right-click on the advertisement and select Update Content.

03 April 2013

SCCM: SMS Functions missing in SCCM

As you have seen, a lot of the functions in SMS are now longer there in SCCM. For instance, you used to be able to re-run and advertisement on a specific machine. That is no longer there. There is a way to get the functions back. SCCM Client Center is a great alternative. It is a third-party client that gives back that functionality missing in SCCM. I highly recommend it. Here are just a few things it provides:


  • WMI Repair
  • Resizing the local SCCM cache
  • Shutdown/Restart/Logoff
  • Access both SCCM and system logs
  • Re-run advertisements
  • List all advertisements on the machine
  • Monitor SCCM Jobs currently running
  • Download User Policy
There are many more functions this provides. The application can be found here

SCCM: SMS equivalent to updating the distribution point

In SMS, in order to update the distribution point, you go to the packages and select the distribution points, and click update distribution points.


The equivalent in SCCM is to go to the Software Library-->Application Management-->Applications, select the application. At the bottom of the screen, click the Deployment Types tab. Now right-click on the item in the menu above and click Update Content. That is all that is to it.


28 March 2013

Setting Acrobat and Reader to autoupdate

Here is a powershell script I wrote that adds the registry keys for both reader and acrobat to make them automatically update. This is intended for admins to deploy out to all users in a firm. It doesn't hurt to add both keys, even if you only have one of the two apps. Here is the Powershell script:

You can download the script from here

 #*******************************************************************************  
 #   Author: Mick Pletcher  
 #    Date: 27 March 2013  
 #  
 #   Program: Adobe Reader Automatic Update  
 #*******************************************************************************  
 Clear-Host  
 $Global:OS  
 Function GetOSArchitecture{  
      $Global:OS=Get-WMIObject win32_operatingsystem  
      $Global:OS.OSArchitecture  
 }  
 GetOSArchitecture  
 If($Global.OS.OSArchitecture -ne "32-bit"){  
      New-Item -Path "HKLM:\SOFTWARE\Wow6432Node\Adobe" -Name "Adobe ARM" –Force  
      New-Item -Path "HKLM:\SOFTWARE\Wow6432Node\Adobe\Adobe ARM" -Name 1.0 –Force  
      New-Item -Path "HKLM:\SOFTWARE\Wow6432Node\Adobe\Adobe ARM\1.0" -Name ARM –Force  
      New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Adobe\Adobe ARM\1.0\ARM" -Name iCheck -Value 3 -PropertyType DWORD  
      New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Adobe\Adobe ARM\1.0\ARM" -Name iCheckReader -Value 3 -PropertyType DWORD  
 } else{  
      New-Item -Path "HKLM:\SOFTWARE\Adobe" -Name "Adobe ARM" –Force  
      New-Item -Path "HKLM:\SOFTWARE\Adobe\Adobe ARM" -Name 1.0 –Force  
      New-Item -Path "HKLM:\SOFTWARE\Adobe\Adobe ARM\1.0" -Name ARM –Force  
      New-ItemProperty -Path "HKLM:\SOFTWARE\Adobe\Adobe ARM\1.0\ARM" -Name iCheck -Value 3 -PropertyType DWORD  
      New-ItemProperty -Path "HKLM:\SOFTWARE\Adobe\Adobe ARM\1.0\ARM" -Name iCheckReader -Value 3 -PropertyType DWORD  
 }  

27 March 2013

How to run a Powershell script as administrator

Say you are deploying a package and need to run it as admin with elevated privileges. Of course if you are running the script manually, you can open up powershell with admin priviledges by running the cmd.exe as administrator. I haven't been able to find any easy ways of doing this within Powershell scripts, although it can be done. There is an easy way though if you use VBScript as a Powershell wrapper. Create the VBScript and point it to execute the Powershell script as admin. Here is how:


 Set oShell = CreateObject("Shell.Application")  
 oShell.ShellExecute "powershell", "-executionpolicy bypass -file test.ps1", "", "runas", 1  

That is all that is to it. Execute the VBScript and the Powershell script will be executed as administrator.

25 March 2013

Powershell: WMIC Product headers

If you are trying to query a list of installed applications using WMIC and want to only display certain headers, here is the list of header available:

wmic product get <header>

  • Node
  • AssignmentType
  • Caption
  • Description
  • HelpLink
  • HelpTelephone
  • IdentifyingNumber
  • InstallDate
  • InstallDate2
  • InstallLocation
  • InstallSource
  • InstallState
  • Language
  • LocalPackage
  • Name
  • PackageCache
  • PackageCode
  • PackageName
  • ProductID
  • RegCompany
  • RegOwner
  • SKUNumber
  • Transforms
  • URLInfoAbout
  • URLUpdateInfo
  • Vendor
  • Version
  • WordCount

SCCM: Powershell Command Line

In order to run a powershell script as a task sequence/application in SCCM or MDT, you will need to use the following command line in MDT/SCCM to correctly execute the script:


  • powershell.exe -executionpolicy bypass -File install.ps1
NOTE: You may need to enter the path to the powershell.exe and to the install.ps1, although for the install.ps1, it should see it from the path you enter in the working directory field. 

22 March 2013

Powershell: Public Desktop Environmental Variable

Powershell 3.0 now has a public desktop environmental variable, CommonDesktopDirectory, unlike versions 1 & 2. In order to make the powershell public desktop environmental variable compatible across different versions, use the following line:


  • $desktop = ([Environment]::GetEnvironmentVariable("Public"))+"\Desktop"

21 March 2013

Windows 8: Opening multiple application instances

In Windows 8, you can only open 1 instance of an app at a time by just clicking on the app tile. In order to open multiple instances of it, right-click on the app tile and run it as administrator. This will allow you to have several instances of the same application.

20 March 2013

Powershell: Adding powershell Run-as Administrator Option

For some Powershell scripts, they need the elevated privileges, even when UAC is disabled. In order to do this, there are two options.
  1. Run a cmd.exe session as administrator and execute the PS1 file from the command line.
  2. Add the registry key listed below to be able to right-click on a PS1 file and run-as administrator.
All you need to do is copy the info below to a blank notepad screen and then save it as {Filename}.reg. Double-click on the reg file and the key will be added to the registry, thereby adding the run-as administrator option. Here is the reg key to add the run-as administrator option:

You can download the reg key from here.

 Windows Registry Editor Version 5.00  

 [HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\runas\command]  
 @="\"c:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe\" -noexit \"%1\""  

14 March 2013

Stopping system from locking

Most companies have a security policy enabled that locks a computer after a certain time interval to stop other users from being able to access the computer if the user forgets to lock the system when they step away. There are those times though that you need to prevent the system from locking for such things as a teleconference and you need to step away to the restroom. You will be booted from the teleconference if you lock your machine. Sometimes you may have a third-party vendor that, due to security reasons, has to remote in through your terminal in order to access servers for maintenance.

I wrote this program that will move the mouse cursor 6 places on the screen every two minutes and then clicks the control key. The executable is a wrapper that extracts the two Powershell scripts. The first script calls the script that actually moves the cursor, while the first script displays an OK button on the screen to click when you are finished. The executable wrapper then cleans up the Powershell scripts after OK is clicked. The executable was compiled using the old SMS installer.

Here are the three files. The executable contains the two Powershell scripts. It extracts them to the current directory and then executes them.

12 March 2013

Powershell: Robocopy Invalid Parameter Error

It is nice having robocopy integrated with PowerShell, but there are some quirks that can make it a pain to deal with. While I was writing a Powershell script that will automate the robocopy, I began getting the Invalid Parameter error. I went through troubleshooting it and made sure it was exactly the same I was typing in at the command line. I still could not figure it out until I split it up.

 $Source = "..\na_clients"  
 $Dest = "..\"+$Location  
 $Files = "*.*"  
 $Switches = "/R:0 /W:0 /E /MIR /TEE /Z /TIMFIX"
 $Logs = "/LOG:..\0ReplicationLogs\"+$Location+".log"  
 $ExcludeDIR = "0Archive","0ReplicationLogs","DfsrPrivate","DesignPremium32Bit","Indesign32bit"  
 RoboCopy $Source $Dest $Files $Switches /XD $ExcludeDIR[0] $ExcludeDIR[1] $ExcludeDIR[2] $ExcludeDIR[3] $ExcludeDIR[4]  

This is where I split up the robocopy command line into variables for each of the switches. That fixed the issue. Apparently, Powershell does not allow for you to be able to use spaces between the switches within a quoted variable. I went as far as dividing up the $Switches variable with a +[char]32+ between each quoted switch and it did no good. This below is the only solution I came up with.

 $Source = "..\na_clients"  
 $Dest = "..\"+$Location  
 $Files = "*.*"  
 $Retries = "/R:0"  
 $Wait = "/W:0"  
 $Logs = "/LOG:..\0ReplicationLogs\"+$Location+".log"  
 $CopySubfolders = "/E"  
 $Mirror = "/MIR"  
 $ConsoleWin = "/TEE"  
 $RestartMode = "/Z"  
 $FixTimeStamp = "/TIMFIX"  
 $ExcludeDIR = "0Archive","0ReplicationLogs","DfsrPrivate","DesignPremium32Bit","Indesign32bit"  
 RoboCopy $Source $Dest $Files $IPG $Retries $Wait $Logs $CopySubfolders $Mirror $ConsoleWin $RestartMode $FixTimeStamp /XD $ExcludeDIR[0] $ExcludeDIR[1] $ExcludeDIR[2] $ExcludeDIR[3] $ExcludeDIR[4]  


07 March 2013

WARNING - unable to set working directory: (-2147024894)

This error is caused when the working directory no longer exists that is assigned to the application being installed. It would be nice if MDT published which app it is, but it does not. To find the application, open up the BDD.LOG file. Search for the error message. You will see the directory it is trying to access on the line above. Just a few lines above, it should also display the app the directory is associated with right above the ################ line .

MDT: Unable to locate the Results.xml file needed to determine the deployment results

This error can be caused by several different things. Here are a few suggestions to look for:


  1. Have you inserted a new task before the boot image is installed? If so, this can trigger the error. (This was my problem. I was testing a new task to move the computer in AD in the Preinstall phase. When I disabled the task, the task sequence proceeded with no issues)
  2. Regenerate all new WIM boot image files
  3. Create a new task sequence and see if it proceeds normally. If it does, then just copy your custom tasks from the corrupted sequence to the newly created one
  4. Has this occurred since upgrading the MDT? If so, do step 3.
If you have encountered this issue and know of some other cause or fix, please post it here and I will update the blog. Thanks

21 February 2013

MDT 2012 Update 1: Skip Roles and Features

There is a new window in the MDT Wizard. It is Roles and Features. If you are wanting to skip this, you will need to add the following to the customsettings.ini file:


  • SkipRoles=YES

20 February 2013

MDT: Removing duplicate and old drivers

If you have setup your driver drivers like I have in which they are separated by OS-->Make-->Model, you will see duplicate drivers in each Model folder. This is caused by the fact that some drivers exist in more than one category. Although you have setup the driver folders in the GUI portion of MDT, MDT sorts them differently in the windows folders. It sorts them by driver type, such as display, bluetooth, modem, and such. They are sorted in the GUI interface through the XML file that sorts the GUIDs into the groups you specified.

Within each group folder, you will see duplicates with (1), (2) and such appearing after the name. This is because a driver may exist under both System and Net for instance. The NIC driver is commonly put in with the system drivers besides the network drivers folder, thereby causing it to appear twice.

To trim the driver list down, sort the Name field. When you find your first duplicated driver, look at the dates on the original and the dupe. If they do not match, then select the oldest ones to delete, leaving just one. Under the actions list, click Delete under the driver name, NOT under the folder name. If you click delete under the folder, the entire folder will be deleted. I have done that and could have kicked myself afterwards, so pay close attention. Once you click delete, do NOT select the Completely delete these items, even if there are copies in other folders. (Force)! If you select this, it will delete that driver across all models and types. I did this and then found out when building other model machines, they were missing those drivers. I had to go back and re-import the drivers for every model. When you leave it unchecked, it only deletes the pointer to the driver and not the actual driver.

Next, you will see duplicate drivers, except with different versions. You will most definitely want to clean up this list so that only the latest driver is there. For instance, I had one model that had 6 versions of NVIDIA Display NVDW.INF in the list. I deleted all, except for the latest one. I also made sure I only deleted it from the list and not completely from the folder.

This not only cleans up the number of drivers copied down during the build, but it also ensures the latest driver gets installed too, as I do see on occasion that the older driver got installed.

NOTE: Before you do any of this, make sure you have the original drivers that you imported into MDT in a windows folder, as if you make a mistake and need to re-import them. 

MDT: Renaming the Task Sequence ID

Once a task sequence has been created, it is grayed out not allowing for it to be changed. There is an easy workaround to accomplish this.


  1. Open up the TaskSequences.xml file. Search for the task sequence ID. Change that to your desired new name.
  2. Rename the subfolder named after the task sequence ID to the same name you changed it to inside the XML file in step 1.
That is all that is to renaming the task sequence ID.

NOTE: Before you do this, I would first backup the control directory. Changes to files in this directory can disable the entire MDT.

Cleaning up old task sequences

If you ever go into the Control folder of the deployment share, you will see every task sequence that has ever been created in there. They are listed by sub-folder names. MDT does not delete these when you delete a task sequence. The first thing you want to do is to open up the TaskSequences.xml file to compare it to the Task sequence list that appears in the Windows Deployment Wizard. You don't want to delete a task sequence that is being used. Once you have made sure it is not in the list, you can go ahead and delete the old task sequence folders. There should be no more references to these folders in any of the scripts. Just to make sure, I would also do a directory search on the task sequence folder name just to make sure it does not appear in any of the xml files. 

iPad 1 Slowness after 5.1.1 Update

After the last update of iOS to 5.1.1, you have probably noticed that it slowed down drastically. This is because of the new features added by the update. The iPad 1 only has 256 MBs of RAM. The extra services and features added causes the iPad 1 to crash quite often, especially Safari. The best route of course, is to upgrade, but if you are like me, I find it a pure waste of natural resources to upgrade at every possible time, so I usually try and wait at least 4 versions before doing so. It is more eco-friendly.

To stop the iPad from continuously crashing and alleviate the slowness, you will need to disable some of the new features. Here is the list of features I disabled on my iPad 1 that solved the issue.


  • Disabled Settings-->Location Services on quite a few of the apps that I really did not need it turned on for. Definitely leave the Find My iPad turned on
  • Turned off the Settings-->General-->Multitasking Gestures
  • Turned off all of the Settings-->iCloud except for the Find My iPad
  • Under Settings-->Mail, Contacts, Calendars, I set Fetch New Data to Manually
  • Turned off Settings-->Messages, as that takes up a good amount of memory
  • Under Settings-->Photos, I turned off Photo Stream
  • Under Settings-->Store, I turned off Music, Apps, and Books
After making those changes, the iPad is almost back to normal. It is not going to completely correct it, as the apps written in updated code will most likely also cause it to slow down. 

19 February 2013

MDT: Defining and Implementing Make and Model in the SQL Database

This is a very easy, but also tricky process. The first thing you will need to do of course is setup your SQL database if it has not already been done. Next, you will need to obtain the how the make and model of the machine is written in the bios by doing a WMI query. Once this is done, you will want to enter the different make and models in the SQL database. If it is going to be pointing to an application to execute for that specific make and model, you will need to go to the application to make sure Hide this application in the Deployment Wizard is unchecked. If it is checked, the application will not be executed. This is because it checks off the application to be executed during the Windows Deployment Wizard in the Applications screen. If it does not appear there, then it can't be run. That is all that is to doing the make and model.

NOTE: When I do a WMI query, I have the VBScript to put a quotation mark at the end of the name. I do this because sometimes the manufacturer will put spaces after it and if you do not enter it exactly like it is when queried, MDT will not recognize the machine.

17 February 2013

SMS 2003: Deploying apps from a network share

You have software already on a network share and want to deploy it to everyone within the local network. You don't have to waste time and space, especially if it is an enormous application, by populating the distribution point. You can deploy it directly from the network share through SMS.

The first step to do this is to create the package. There will be no data source, so all you have to do is populate the General Tab for informational purposes. Next, you will click on the programs and create a new program. In the General Tab, you will enter the command line to execute the installation. The start in field is what points the package to the network share that contains the installation package. Under the Environment Tab, you will need to select Whether or Not a user is logged on, click Run with Administrative Rights, and select Use Software Installation Account. You can now setup the Collection and Advertisement. That is all that is to setting up an SMS package that can deploy from a network share, instead of its distribution point. I am now working with SCCM and will update this as I verify if this is also possible with SCCM. 

07 February 2013

Deploying Photoshop Elements 11

Deploying Photoshop Elements is different from the rest of the Adobe CS6 applications. The MSI file cannot be executed independently. The setup.exe file must be run. The setup.ini is the key to distributing the software in either a silent or basic display mode. Inside the ini file, the two parts that are pertinent to an unattended installation are [Launch] and [OEM]. Under [Launch] you can delete all of the CommandLines, except for CommandLine0. These command lines are there for installing different language packs, which you can only install one. I live in the US, so this is the command line I successfully used:

CommandLine0=msiexec /i "Adobe Photoshop Elements 11.msi" TRANSFORMS=1033.mst ELEMENTS_EN_US=1 ORGANIZER_EN_US=1 COUNTRY=244 AgreeToLicense=Yes /qb- /norestart

The second part to populate is the SERIALNUMBER under [OEM]. You will need to enter it with dashes.

The required items are the country, agreement to the license, serial number, and language. Once these are populated in the above listed items, the installation becomes unattended. Here is the full setup.ini file that I edited and has now made the setup.exe unattended.

 [Launch]  
 Count=4  
 Lang0=0009  
 Lang1=0007  
 Lang2=040c  
 Lang3=0011  
 Default=0009  
 EnableLangDlg=NO  
 CommandLine0=msiexec /i "Adobe Photoshop Elements 11.msi" TRANSFORMS=1033.mst ELEMENTS_EN_US=1 ORGANIZER_EN_US=1 COUNTRY=244 AgreeToLicense=Yes /qb- /norestart  
 [OEM]  
 OEM=  
 SERIALNUMBER=xxxx-xxxx-xxxx-xxxx-xxxx-xxxx  
 DISABLEOLSFEATURES=1  
 MANUAL=  
 REBOOT=No  
 STARTMENULOCATION=  
 [en_us]  
 Title=Adobe Photoshop Elements 11 - Setup  
 OSErrMsg=Your system does not support the minimum operating system requirement. Installation of Photoshop Elements 11 is supported on Windows XP, Windows Vista, Windows 7 Operating Systems.  
 AdminUserErrMsg=Please login as an Administrator and then run the installer.  
 MultipleInstances=Installation is already in progress. Please complete that installation.  
 BuildIncompletErrMsg=Setup.exe was not able to locate some components required for successful installation of the product. Please retry after making sure the complete set of files is available.  
 [de_de]  
 Title=Adobe Photoshop Elements 11 - Setup  
 OSErrMsg=Ihr System erfüllt nicht die Mindestanforderung für das Betriebssystem. Die Installation von Photoshop Elements 11 wird unter Windows XP, Windows Vista oder Windows 7 unterstützt.  
 AdminUserErrMsg=Melden Sie sich als Administrator an und führen Sie dann das Installationsprogramm aus.  
 MultipleInstances=Die Installation wird bereits ausgeführt. Schließen Sie diese Installation ab.  
 BuildIncompletErrMsg=Die Datei "Setup.exe" konnte einige für die Installation des Produkts erforderliche Komponenten nicht finden. Stellen Sie sicher, dass alle Dateien verfügbar sind und versuchen Sie es erneut.  
 [fr_fr]  
 Title=Installation d'Adobe Photoshop Elements 11  
 OSErrMsg=Votre système ne prend pas en charge la configuration minimale requise. Vous ne pouvez installer Photoshop Elements 11 que sur les systèmes d'exploitation Windows XP, Windows Vista ou Windows 7.   
 AdminUserErrMsg=Veuillez vous connecter en tant qu'administrateur, puis lancer le programme d'installation.  
 MultipleInstances=Une installation est déjà en cours. Vous devez terminer cette installation.  
 BuildIncompletErrMsg=Setup.exe n'a pas pu trouver certains des composants nécessaires à l'installation du produit. Assurez-vous que tous les fichiers sont disponibles, puis réessayez.  
 [ja_jp]  
 Title=Adobe Photoshop Elements 11 セットアップ  
 OSErrMsg=ご使用のシステムは、オペレーティングシステムの最低要件を満たしていません。Photoshop Elements 11 をインストールできるオペレーティングシステムは、Windows XP、Windows Vista または Windows 7 です。  
 AdminUserErrMsg=管理者としてログインし、インストーラーを実行してください。  
 MultipleInstances=インストールは既に進行しています。 このインストールを完了させてください。  
 BuildIncompletErrMsg=Setup.exe で、製品の正常なインストールに必要な一部のコンポーネントを検出できませんでした。ファイル一式が揃っていることを確認し、再度実行してください。  

If you live in a different country, thereby needing a different country code, you can obtain it by opening up the Adobe Photoshop Elements 11.msi file in ORCA. The list of countries and associated country codes are under the ComboBox Table. There, you will see the list. The value you are looking for is in the Value (s64) column. For your convenience, here is a list of country codes I extracted from the MSI file:

Property (s72) Order (i2) Value (s64)    Text (L64)
COUNTRY 1 3        Afghanistan
COUNTRY 2 6    Albania
COUNTRY 3 4    Algeria
COUNTRY 4 10    American Samoa
COUNTRY 5 8    Andorra
COUNTRY 6 9    Angola
COUNTRY 7 300    Anguilla
COUNTRY 8 301    Antarctica
COUNTRY 9 2    Antigua and Barbuda
COUNTRY 10 11    Argentina
COUNTRY 11 7    Armenia
COUNTRY 12 302    Aruba
COUNTRY 13 303       Ascension Island
COUNTRY 14 304    Ashmore and Cartier Islands
COUNTRY 15 12    Australia
COUNTRY 16 14    Austria
COUNTRY 17 5    Azerbaijan
COUNTRY 18 22    Bahama, The
COUNTRY 19 17    Bahrain
COUNTRY 20 305    Baker Island
COUNTRY 21 23    Bangladesh
COUNTRY 22 18    Barbados
COUNTRY 23 29    Belarus
COUNTRY 24 21    Belgium
COUNTRY 25 24    Belize
COUNTRY 26 28    Benin
COUNTRY 27 20    Bermuda
COUNTRY 28 34    Bhutan
COUNTRY 29 26    Bolivia
COUNTRY 30 25    Bosnia and Herzegovina
COUNTRY 31 19    Botswana
COUNTRY 32 306    Bouvet Island
COUNTRY 33 32    Brazil
COUNTRY 34 114    British Indian Ocean Territory
COUNTRY 35 37    Brunei
COUNTRY 36 35    Bulgaria
COUNTRY 37 245    Burkina Faso
COUNTRY 38 38    Burundi
COUNTRY 39 40    Cambodia
COUNTRY 40 49    Cameroon
COUNTRY 41 39    Canada
COUNTRY 42 57    Cape Verde
COUNTRY 43 307    Cayman Islands
COUNTRY 44 55    Central African Republic
COUNTRY 45 41    Chad
COUNTRY 46 308    Channel Islands
COUNTRY 47 46    Chile
COUNTRY 48 45    China
COUNTRY 49 309    Christmas Island
COUNTRY 50 310    Clipperton Island
COUNTRY 51 311    Cocos (Keeling) Islands
COUNTRY 52 51    Colombia
COUNTRY 53 50    Comoros
COUNTRY 54 43    Congo
COUNTRY 55 44    Congo (DRC)
COUNTRY 56 312    Cook Islands
COUNTRY 57 313    Coral Sea Islands
COUNTRY 58 54    Costa Rica
COUNTRY 59 119    Côte d’Ivoire
COUNTRY 60 108    Croatia
COUNTRY 61 56    Cuba
COUNTRY 62 59    Cyprus
COUNTRY 63 75    Czech Republic
COUNTRY 64 61    Denmark
COUNTRY 65 314    Diego Garcia
COUNTRY 66 62    Djibouti
COUNTRY 67 63    Dominica
COUNTRY 68 65    Dominican Republic
COUNTRY 69 7299303    East Timor
COUNTRY 70 66    Ecuador
COUNTRY 71 67    Egypt
COUNTRY 72 72    El Salvador
COUNTRY 73 69    Equatorial Guinea
COUNTRY 74 71    Eritrea
COUNTRY 75 70    Estonia
COUNTRY 76 73    Ethiopia
COUNTRY 77 315    Falkland Islands (Islas Malvinas)
COUNTRY 78 81    Faroe Islands
COUNTRY 79 78    Fiji Islands
COUNTRY 80 77    Finland
COUNTRY 81 84    France
COUNTRY 82 317    French Guiana
COUNTRY 83 318    French Polynesia
COUNTRY 84 319    French Southern and Antarctic Lands
COUNTRY 85 87    Gabon
COUNTRY 86 86    Gambia, The
COUNTRY 87 88    Georgia
COUNTRY 88 94    Germany
COUNTRY 89 89    Ghana
COUNTRY 90 90    Gibraltar
COUNTRY 91 98    Greece
COUNTRY 92 93    Greenland
COUNTRY 93 91    Grenada
COUNTRY 94 321    Guadeloupe
COUNTRY 95 322    Guam
COUNTRY 96 323    Guantanamo Bay
COUNTRY 97 99    Guatemala
COUNTRY 98 324    Guernsey
COUNTRY 99 100    Guinea
COUNTRY 100 196    Guinea-Bissau
COUNTRY 101 101    Guyana
COUNTRY 102 103    Haiti
COUNTRY 103 325    Heard Island and McDonald Islands
COUNTRY 104 106    Honduras
COUNTRY 105 104    Hong Kong S.A.R.
COUNTRY 106 326    Howland Island
COUNTRY 107 109    Hungary
COUNTRY 108 110    Iceland
COUNTRY 109 113    India
COUNTRY 110 111    Indonesia
COUNTRY 111 116    Iran
COUNTRY 112 121    Iraq
COUNTRY 113 68    Ireland
COUNTRY 114 117    Israel
COUNTRY 115 118    Italy
COUNTRY 116 124    Jamaica
COUNTRY 117 125    Jan Mayen
COUNTRY 118 122    Japan
COUNTRY 119 327    Jarvis Island
COUNTRY 120 328    Jersey
COUNTRY 121 127    Johnston Atoll
COUNTRY 122 126    Jordan
COUNTRY 123 137    Kazakhstan
COUNTRY 124 129    Kenya
COUNTRY 125 329    Kingman Reef
COUNTRY 126 133    Kiribati
COUNTRY 127 134    Korea
COUNTRY 128 136    Kuwait
COUNTRY 129 130    Kyrgyzstan
COUNTRY 130 138    Laos
COUNTRY 131 140    Latvia
COUNTRY 132 139    Lebanon
COUNTRY 135 146    Lesotho
COUNTRY 136 142    Liberia
COUNTRY 137 148    Libya
COUNTRY 138 145    Liechtenstein
COUNTRY 139 141    Lithuania
COUNTRY 140 147    Luxembourg
COUNTRY 141 151    Macau S.A.R.
COUNTRY 142 19618    Macedonia, Former Yugoslav Republic of
COUNTRY 143 149    Madagascar
COUNTRY 144 156    Malawi
COUNTRY 145 167    Malaysia
COUNTRY 146 165    Maldives
COUNTRY 147 157    Mali
COUNTRY 148 163    Malta
COUNTRY 149 15126    Man, Isle of
COUNTRY 150 199    Marshall Islands
COUNTRY 151 330    Martinique
COUNTRY 152 162    Mauritania
COUNTRY 153 160    Mauritius
COUNTRY 154 331    Mayotte
COUNTRY 155 166    Mexico
COUNTRY 156 80    Micronesia
COUNTRY 157 21242    Midway Islands
COUNTRY 158 152    Moldova
COUNTRY 159 158    Monaco
COUNTRY 160 154    Mongolia
COUNTRY 161 332    Montserrat
COUNTRY 162 159    Morocco
COUNTRY 163 168    Mozambique
COUNTRY 164 27    Myanmar
COUNTRY 165 254    Namibia
COUNTRY 166 180    Nauru
COUNTRY 167 178    Nepal
COUNTRY 168 333    Netherlands Antilles
COUNTRY 169 176    Netherlands, The
COUNTRY 170 334    New Caledonia
COUNTRY 171 183    New Zealand
COUNTRY 172 182    Nicaragua
COUNTRY 173 173    Niger
COUNTRY 174 175    Nigeria
COUNTRY 175 335    Niue
COUNTRY 176 336    Norfolk Island
COUNTRY 177 131    North Korea
COUNTRY 178 337    Northern Mariana Islands
COUNTRY 179 177    Norway
COUNTRY 180 164    Oman
COUNTRY 181 190    Pakistan
COUNTRY 182 195    Palau
COUNTRY 183 184    Palestinian Authority
COUNTRY 184 338    Palmyra Atoll
COUNTRY 185 192    Panama
COUNTRY 186 194    Papua New Guinea
COUNTRY 187 185    Paraguay
COUNTRY 188 187    Peru
COUNTRY 189 201    Philippines
COUNTRY 190 339    Pitcairn Islands
COUNTRY 191 191    Poland
COUNTRY 192 193    Portugal
COUNTRY 193 202    Puerto Rico
COUNTRY 194 197    Qatar
COUNTRY 195 198    Reunion
COUNTRY 196 200    Romania
COUNTRY 197 340    Rota Island
COUNTRY 198 203    Russia
COUNTRY 199 204    Rwanda
COUNTRY 200 341    Saipan
COUNTRY 201 259    Samoa
COUNTRY 202 214    San Marino
COUNTRY 203 233    São Tomé and Príncipe
COUNTRY 204 205    Saudi Arabia
COUNTRY 205 210    Senegal
COUNTRY 206 269    Serbia and Montenegro
COUNTRY 207 208    Seychelles
COUNTRY 208 213    Sierra Leone
COUNTRY 209 215    Singapore
COUNTRY 210 143    Slovakia
COUNTRY 211 212    Slovenia
COUNTRY 212 30    Solomon Islands
COUNTRY 213 216    Somalia
COUNTRY 214 209    South Africa
COUNTRY 215 342    South Georgia and the South Sandwich Islands
COUNTRY 216 217    Spain
COUNTRY 217 42    Sri Lanka
COUNTRY 218 343    St. Helena
COUNTRY 219 207    St. Kitts and Nevis
COUNTRY 220 218    St. Lucia
COUNTRY 221 206    St. Pierre and Miquelon
COUNTRY 222 248    St. Vincent and the Grenadines
COUNTRY 223 219    Sudan
COUNTRY 224 181    Suriname
COUNTRY 225 220    Svalbard
COUNTRY 226 260    Swaziland
COUNTRY 227 221    Sweden
COUNTRY 228 223    Switzerland
COUNTRY 229 222    Syria
COUNTRY 230 237    Taiwan
COUNTRY 231 228    Tajikistan
COUNTRY 232 239    Tanzania
COUNTRY 233 227    Thailand
COUNTRY 234 346    Tinian Island
COUNTRY 235 232    Togo
COUNTRY 236 347    Tokelau
COUNTRY 237 231    Tonga
COUNTRY 238 225    Trinidad and Tobago
COUNTRY 239 348    Tristan da Cunha
COUNTRY 240 234    Tunisia
COUNTRY 241 235    Turkey
COUNTRY 242 238    Turkmenistan
COUNTRY 243 349    Turks and Caicos Islands
COUNTRY 244 236    Tuvalu
COUNTRY 245 240    Uganda
COUNTRY 246 241    Ukraine
COUNTRY 247 224    United Arab Emirates
COUNTRY 248 242    United Kingdom
COUNTRY 249 244    United States
COUNTRY 250 246    Uruguay
COUNTRY 251 247    Uzbekistan
COUNTRY 252 174    Vanuatu
COUNTRY 253 253    Vatican City
COUNTRY 254 249    Venezuela
COUNTRY 255 251    Vietnam
COUNTRY 256 252    Virgin Islands
COUNTRY 257 351    Virgin Islands, British
COUNTRY 258 258    Wake Island
COUNTRY 259 352    Wallis and Futuna
COUNTRY 260 261    Yemen
COUNTRY 261 263    Zambia
COUNTRY 262 264    Zimbabwe

06 February 2013

MDT: Installing Windows 7 Updates as Packages

This is a really nice feature that MDT has allowing for all updates to be installed during the initial windows setup process. The problem is that certain updates will not install and cause the Install Updates function to fail, thereby halting the build. You will see the message Windows could not apply unattend settings during pass [offlineServicing]. The only way to resolve this is to remove the updates that caused it to halt.

The best way to locate the updates causing the problem is to create a structured package group. The way I setup my company's was to create the following structure:


  1. Windows 7 Updates
    1. Pre-Image Updates
      1. Non-Security Updates
        1. 2009
        2. 2011
        3. 2012
        4. 2013
      2. Optional Updates
      3. Security Updates
        1. 2010
        2. 2011
        3. 2012
    2. Post-Image Updates
      1. Non-Security Updates
      2. Optional Updates
      3. Security Updates

This gives an easy, sorted structure for the updates, which also allows you to find and remove those updates no longer needed after a service pack is installed. Plus, it allows you to activate/deactivate smaller sets of updates through the selection profile, thereby making narrowing down to the bad updates much easier. You might wonder where I got this structure. I use Windows Updates Downloader to download all of my windows updates and it uses this structure  I can verify that it works out great. This also allowed me to more easily find those updates that caused the build to crash during the offline installation. As far as associating them with a task sequence, all you have to do is check-mark each folder to be included in the selection profile, allowing all of the folders to be installed under a single task sequence. 

As far as the list of updates I found to halt the build of Windows 7 64-Bit with SP1, here it is:
  • KB2496898
  • KB2533552
  • KB2604521
  • KB2726535
Once I removed these updates, the offline update worked flawless. I did not bother trying to get these updates back in the system. I allow WSUS to install them.

01 February 2013

MDT: Injecting Variables into Task Names

While creating tasks in the task sequencing, you may want to create unique names that are stored in an MDT variable. This can easily be done. For instance, I have setup MDT to automatically install drivers by the make and model of the machine. I would like for it to also display which make it is installing it for. I went to the Inject Drivers task and added %Model% to the end of the Name field. It now displays the model it is installing the drivers for. Any variable that MDT uses can be entered into the Name field of a task sequence.