Adobe Flash GPO Deploy error “InstallAx.exe”

Update: An updated script has been posted with some improvements, here.

“The file ‘installax.exe’ is not marked for installation”

This post details how to fix this issue, when Flash won’t uninstall correctly from a GPO deployment.

Adobe Flash PlayerThe Problem

I deploy the latest Flash versions through Group Policy, because it’s quick and simple. Some time ago, there was a version of Adobe Flash Player (10.1.5xx I think) that began causing problems with later versions.

What would happen is upon upgrades to Flash being pushed out, when updating the previous version an error would be logged. The GPO would successfully update the player, however it would continue to try updating every day, every time the computer started.

This occurred for both Windows 7 and Windows XP, and got to be quite annoying for my users.

When trying to update manually, the error that appeared was:

"The file 'installax.exe' is not marked for installation"

Here’s how I resolved it:

Based on various forum reports (http://forums.adobe.com/message/3124297) it seemed to be a problem with Flash leftovers.

On a test machine, I uninstalled all Flash versions, and then did a registry search, and removed these items:

[HKEY_CLASSES_ROOT\Installer\Features\4E867BFF724E3554CB631AF1E5269AD4]
[HKEY_CLASSES_ROOT\Installer\Features\6D98A6046E9005543B07D873D6BD65EB]
[HKEY_CLASSES_ROOT\Installer\Products\4E867BFF724E3554CB631AF1E5269AD4]
[HKEY_CLASSES_ROOT\Installer\Products\6D98A6046E9005543B07D873D6BD65EB]
[HKEY_CLASSES_ROOT\Installer\Features\00B86459180C72B4CA69A0A21353E906]
[HKEY_CLASSES_ROOT\Installer\Products\00B86459180C72B4CA69A0A21353E906]

These keys are a mix between Windows 7 x64 and Windows XP.

After that I manually installed the latest version, and it was successful. Now I needed to write a script that would remove these values and install the latest version.

The Script

I wanted to run this as a Shutdown script through group policy, rather than trying to push it out to all our clients through a scheduled task or something. This way it would eventually get applied to everyone. I think I’ll wait a period of time, and then disable this script and go back to a GPO msi install.

I made extensive use of echo and pause statements to ensure it was being applied correctly. Because I didn’t want a script for Windows 7 x64 and a separate one for Windows XP, there’s a bit of logic thrown in to check for version.

Here’s the script:

:: Adobe flash giving "installax" errors when updating from GPO :: This batch file will remove those errors and install 10.1.102.64
:: This batch file should be run from a shutdown or startup script

:: Check if Windows 7 or Windows XP, and goes to the proper section IF EXIST "C:\Program Files (x86)" goto :Win7Check
goto :WinXPCheck

:Win7Check
:: Check if the latest version is installed already in Windows 7. If so, exit. Otherwise install Set "AdobeVersion=" & setlocal & Set "$V="
:: Look in the Uninstall area of registry, where the installed version of Flash player is listed Set "RegKey=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX"
Set "RegItem=DisplayVersion"
:: Take the output of a REG QUERY to the location above, and put it into the AdobeVersion variable
For /f "tokens=3*" %%! in (
   '2^>nul Reg.exe QUERY "%RegKey%" /v "%RegItem%" ^|(
   Findstr.exe /ri "\<%RegItem%\>"^)') Do Set "$V=%%!"
endlocal & call Set "AdobeVersion=%$V%"

:: If what is currently installed matches latest version, exit. Otherwise, go to install section
if "%AdobeVersion%" == "10.1.102.64" goto :exit
goto :Install

:WinXPCheck
:: Check if the latest version is installed already in Windows XP. If so, exit. Otherwise install Set "AdobeVersionXP=" & setlocal & Set "$T="
:: Look in the Uninstall area of registry, where the installed version of Flash player is listed Set "RegKeyXP=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX"
Set "RegItemXP=DisplayVersion"
:: Take the output of a REG QUERY to the location above, and put it into the AdobeVersion variable For /f "tokens=3*" %%! in (
   '2^>nul Reg.exe QUERY "%RegKeyXP%" /v "%RegItemXP%" ^|(
   Findstr.exe /ri "\<%RegItemXP%\>"^)') Do Set "$T=%%!"
endlocal & call Set "AdobeVersionXP=%$T%"

:: If what is currently installed matches latest version, exit. Otherwise, go to install section
if "%AdobeVersionXP%" == "10.1.102.64" goto :exit
goto :Install

:Install ::Uninstall current versions of Flash from DFS share start /wait \\domain.com\apps\Public\General\adobeflash\uninstall_flash_player.exe -uninstall

:: Remove offending registry entries causing the error (mentioned below) regedit /s \\domain.com\apps\Public\General\adobeflash\flash_remove_fix.reg

:: Install latest version of Flash start /wait \\domain.com\apps\Public\General\adobeflash\install_flash_player_10.1.102.64.exe -install
goto :exit


:exit

The registry file mentioned contains this (what is at the top of this post, with the removal switch):

[-HKEY_CLASSES_ROOT\Installer\Features\4E867BFF724E3554CB631AF1E5269AD4]
[-HKEY_CLASSES_ROOT\Installer\Features\6D98A6046E9005543B07D873D6BD65EB]
[-HKEY_CLASSES_ROOT\Installer\Products\4E867BFF724E3554CB631AF1E5269AD4]
[-HKEY_CLASSES_ROOT\Installer\Products\6D98A6046E9005543B07D873D6BD65EB]
[-HKEY_CLASSES_ROOT\Installer\Features\00B86459180C72B4CA69A0A21353E906]
[-HKEY_CLASSES_ROOT\Installer\Products\00B86459180C72B4CA69A0A21353E906]

This script successfully runs on Windows 7 and Windows XP, and merely exits when the latest version is already done.

Check what version of Adobe Flash Player you have, and what is current:

http://www.adobe.com/software/flash/about/

Uninstall Utility used to remove Flash Player

http://kb2.adobe.com/cps/141/tn_14157.html

.NET Function to produce link to UNC path

The following code is not mine, but from personnel within our company who really helped me out. Thanks Dan!

We have a few reports built within SQL Reporting Services 2005. One of these reports lists financial information for our projects. A request was made to create a link between the project on the report, and the project’s folder within our DFS share.

This is the custom code used on the report to produce those results. Depending on how folders are stored, it could be very useful for others as well.

For this to make sense, here’s a quick primer on how we store our files:

Each project has a 5 digit unique identifier within our DFS. It looks like this: “34321 deptcode short description”. These are organized by the major ‘ten thousandth’ value. For example:

Jobs >
30000
31000
32000
33000

Now for the code. To begin, you need to add the custom code to your report:

Report Properties

Use the “Code” tab, and paste the code in. Here’s the code I used, with comments:

'Start the function, with the value passed from the reportserver as jobnum Public Function Extract_jobs_path(ByVal jobnum As String) As String  'Find the first two digits of the folder name by taking the last 5 digits of the record and keeping first 2     Dim Prefix_job As String = Strings.mid(jobnum,5,2)     Dim Result As String = "" 'Make Director1 equal to the root folder of the job number (ie 33000), using the first two digits grabbed  Dim Director1 As New System.IO.DirectoryInfo(\\domain.ca\files\Jobs\ & Prefix_job & "000")      If Director1.Exists = True Then  'Grab the first 5 characters of the job number   Dim job_number As String =strings.mid(jobnum,5,5)  'Set Folder1 as the root folder, same as Director1   Dim Folder1 As String() = System.IO.Directory.GetDirectories(\\domain.ca\files\Jobs\ & Prefix_job & "000")  'For every subfolder of the root, search the first 5 digits and see if they match job_number   For Each subFolder As String In Folder1    If Strings.Mid(subFolder, 27, 5) = job_number Then        Result = subFolder            Exit For          End If         Next     End If 'If there was a match, switch around the slashes, add in the file:/// to build the link, 'and return the value     If Result <> "" Then      Result = Replace(Result, "\", "/")        Dim Poz1 As Integer = InStr(Result, "domain.ca")         If Poz1 > 0 Then          Return "file:///" & Result            End If         End If     End Function

Now all you need to do is call the code within a spot in your report. We have a table with a specific cell that has the code inserted into the “Navigation” properties of that cell, using this:

=Code.Extract_jobs_path(Fields!ProjectID.Value)

 

Clicking on that cell automatically opens the UNC path in Windows Explorer.

Routing issue due to Wireless ISP network range

Just solved a particularily troublesome issue that wasn’t obvious at first but makes sense now.

Intro

We have multiple Internet connections from multiple providers; this displays what they’re plugged into on our Sonicwall 4060:

ISP connections

The WiBand connection is from a wireless ISP, connecting to a basestation about 1.5KM away.

Problem

There is a client of ours across the street who is trying to access a website who’s DNS entry refers to the X3 interface provided by a Shaw IP address. They receive a strange “Oops, we could not reach that website” error page within Internet Explorer.

I did an nslookup to make sure the DNS A record for the site was still correct, which it was. I used our external dial-up line to ensure that the site was up and available, which it was.

Based on this, I suggested to my company contact dealing with the client that perhaps they are using a custom DNS provider who has an incorrect A record for our site, who is providing that custom error page. I then forget about the issue.

The next day I get a call from the client’s IT department that the problem still exists. We run through some DNS troubleshooting, and determine that site is getting the right IP, but still getting the custom error page.

I decide to check the error logs on my firewall, and the only thing of note is an “IP Spoof Detected” error. After asking what the source IP is from the problem site, it is confirmed that its the same IP as the ‘spoof’.

The client site has this IP address (close enough):

192.168.146.9/255.255.255.192

Alarm bells start going off as I realize this is very similar to our WiBand IP on X2. Our IP for that link is (changed for privacy):
192.168.146.26/255.255.255.192

Turns out the client across the street from us is also using WiBand for an ISP, and we’re connecting to the same basestation, in the same subnet.

The HTTP request is coming in on X3, but the response can’t leave X3 destined for the client IP, since that range is on X2. So our firewall drops the packet.

Solution

Our current work-around is a static route that forces the return traffic out the correct interface. It looks a little like this:

Source       Destination          Service          Gateway                       Interface

Any            Client IP              HTTP(all)        Shaw Gateway IP           X3
 
I had the gateway on this route originally set to OUR Shaw IP, but this was incorrect.

I suppose next step is to find out why WiBand has us on the same subnet, and whether they could use VLAN’s or something else to segregate us. It’s a little disappointing that we will be the guinea pigs for this, as I would have thought an ISP would have resolved these type of issues by now.

IMF Archive Manager for Exchange 2003

Using blacklists for spam protection in Exchange 2003 cuts down a lot of spam for my company. However, we decided to enable IMF to do even better. However, it is imperative these caught messages get monitored for false positives. We’re small enough that monitoring the IMF archive is reasonable, but it wasn’t immediately apparent how to do this.
Luckily I found this tool: http://imfam.codeplex.com/  (IMF Archive Manager)

Setup

To begin, you want to make sure the your IMF settings are set to Archive:

IMF archive settings

By default this archive location is:

%ExchangeInstallPath%\Exchsrvr\Mailroot\vsi 1\UceArchive

However, you can change that location by modifying this registry value:

HKEY_LOCAL_MACHINE\Software\Microsoft\Exchange\ContentFilter\ArchiveDir

Once you’ve found or set your archive location, open IMF Manager on your client computer, and click Settings > Archive Folder:

IMF Settings folder

Set this to your archive location, and you should see it populated with the IMF messages. This gives you a safe way to view the spam and identify false positives.

Dealing with False Positives

Identifying false positives isn’t very helpful if you can’t do anything with them. What I’ve done to solve this problem is created a Windows share of the IMF Archive folder, and then using IMF Archive Manager, delete all the spam leaving only false positives. I then open the shared folder, and copy the .eml files out:

IMF False Positives

Once you have an .eml file, you may need to re-configure Outlook 2003 or Outlook 2007 to natively open them.

Office 2003:

http://support.microsoft.com/kb/967346

Office 2007

http://support.microsoft.com/kb/956693

Office 2010 appears to open these files properly.

Recover Hard Deleted Items in Exchange 2003

This information applies to at least Exchange 2003; I can’t verify any newer versions.

Sometimes an item in Exchange has been perminently deleted, and doesn’t show up in “recover deleted items”.

You can find these items through the OWA interface, if you have it enabled.

Paste this into IE, filling in the server name and user alias.

https://server_name/exchange/user_name/inbox/?cmd=showdeleted

Recover Deleted Items

This will show different results than what you would typically see using “Recover Deleted Items” from within Outlook.